@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.
- package/LICENSE +160 -0
- package/README.md +259 -0
- package/RUST-STANDARD-LIBRARY-NOTICES.html +8266 -0
- package/ReactNativeProseEditor.podspec +59 -0
- package/THIRD_PARTY_NOTICES.md +31155 -0
- package/android/build.gradle +188 -0
- package/android/consumer-rules.pro +18 -0
- package/android/expo/build.gradle +17 -0
- package/android/src/debug/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +7 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.json +2236 -0
- package/android/src/main/assets/editor-icons/MaterialIcons.ttf +0 -0
- package/android/src/main/java/com/apollohg/editor/AndroidApiCompat.kt +19 -0
- package/android/src/main/java/com/apollohg/editor/AndroidCollaborationTransport.kt +860 -0
- package/android/src/main/java/com/apollohg/editor/CaretGeometry.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/CodeHighlighting.kt +141 -0
- package/android/src/main/java/com/apollohg/editor/DecodedBitmapBudget.kt +250 -0
- package/android/src/main/java/com/apollohg/editor/EditorAddons.kt +133 -0
- package/android/src/main/java/com/apollohg/editor/EditorBlockSpacing.kt +51 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawable.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/EditorBoxDrawing.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/EditorCheckboxSpan.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorCodeHighlighting.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorDecorationLayer.java +18 -0
- package/android/src/main/java/com/apollohg/editor/EditorDocumentLayout.kt +626 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditText.kt +1042 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextAnnotations.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCaret.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextClipboard.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextComposition.kt +220 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextConfiguration.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextCorrection.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeferredUpdates.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDeletion.kt +258 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDiagnostics.kt +83 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextDragDrop.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextExternalComposition.kt +357 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextHardwareInput.kt +277 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextImages.kt +280 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputLifecycle.kt +183 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputPreparation.kt +79 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextInputTraits.kt +384 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextLayout.kt +100 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextNativeMutation.kt +243 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextPlaceholder.kt +154 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRenderPatch.kt +347 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRendering.kt +313 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextRustCommands.kt +281 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextSelection.kt +352 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextState.kt +113 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTaskMarkers.kt +92 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextTextCommit.kt +327 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextToolbar.kt +84 -0
- package/android/src/main/java/com/apollohg/editor/EditorEditTextUpdates.kt +245 -0
- package/android/src/main/java/com/apollohg/editor/EditorGlyphHeightCursorDrawable.kt +42 -0
- package/android/src/main/java/com/apollohg/editor/EditorHeightBehavior.kt +13 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputConnection.kt +923 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCoordinates.kt +191 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCorrection.kt +107 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputCursorGeometry.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSnapshots.kt +134 -0
- package/android/src/main/java/com/apollohg/editor/EditorInputSurroundingDeletion.kt +321 -0
- package/android/src/main/java/com/apollohg/editor/EditorKeyboardToolbarView.kt +851 -0
- package/android/src/main/java/com/apollohg/editor/EditorMentionStyle.kt +192 -0
- package/android/src/main/java/com/apollohg/editor/EditorReconciliationWatcher.kt +46 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheet.kt +303 -0
- package/android/src/main/java/com/apollohg/editor/EditorStyleSheetSpans.kt +253 -0
- package/android/src/main/java/com/apollohg/editor/EditorSurfaceInputConnection.kt +67 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextDecorationDrawing.kt +143 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurface.kt +712 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceDragDrop.kt +94 -0
- package/android/src/main/java/com/apollohg/editor/EditorTextSurfaceInteraction.kt +708 -0
- package/android/src/main/java/com/apollohg/editor/EditorTheme.kt +650 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Adapter.kt +912 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterMutations.kt +402 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterRendering.kt +123 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2AdapterSelection.kt +203 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Backend.kt +120 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Driver.kt +87 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2Registry.kt +97 -0
- package/android/src/main/java/com/apollohg/editor/EditorV2RenderValidation.kt +409 -0
- package/android/src/main/java/com/apollohg/editor/ExpoAutoGrowStyleSizePublisher.kt +34 -0
- package/android/src/main/java/com/apollohg/editor/ImageResizeOverlayView.kt +266 -0
- package/android/src/main/java/com/apollohg/editor/ImeTextCoordinateMapper.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/KeyboardToolbarImeAnimationController.kt +101 -0
- package/android/src/main/java/com/apollohg/editor/MentionSuggestionChipView.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeCollaborationTransportRegistry.kt +493 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoView.kt +813 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewAtoms.kt +68 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewBinding.kt +126 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewDiagnostics.kt +208 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewErrors.kt +146 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewEvents.kt +150 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewExternalComposition.kt +39 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewFocus.kt +176 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewLifecycle.kt +302 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewMentions.kt +259 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewNativeActions.kt +179 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewOutsideTap.kt +214 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPendingUpdates.kt +376 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewProperties.kt +234 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewPropertyRetries.kt +197 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewToolbar.kt +285 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewTypes.kt +28 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorExpoViewUpdates.kt +271 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorModule.kt +687 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorOutsideTapDispatcher.kt +380 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorV2Numbers.kt +45 -0
- package/android/src/main/java/com/apollohg/editor/NativeEditorViewRegistry.kt +372 -0
- package/android/src/main/java/com/apollohg/editor/NativeImagePipeline.kt +22 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbar.kt +193 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarIcons.kt +177 -0
- package/android/src/main/java/com/apollohg/editor/NativeToolbarItem.kt +274 -0
- package/android/src/main/java/com/apollohg/editor/OkHttpCollaborationSocket.kt +102 -0
- package/android/src/main/java/com/apollohg/editor/OrderedListMarkerFormatter.kt +130 -0
- package/android/src/main/java/com/apollohg/editor/PointerTransparentView.java +18 -0
- package/android/src/main/java/com/apollohg/editor/PositionBridge.kt +128 -0
- package/android/src/main/java/com/apollohg/editor/ProseViewerView.kt +854 -0
- package/android/src/main/java/com/apollohg/editor/RemoteSelectionOverlayView.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBlockSpans.kt +314 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridge.kt +224 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeBlockStyles.kt +407 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeElements.kt +544 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeInlineAndAtoms.kt +631 -0
- package/android/src/main/java/com/apollohg/editor/RenderBridgeParagraphs.kt +215 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageDecoder.kt +748 -0
- package/android/src/main/java/com/apollohg/editor/RenderImageLoader.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/RenderLayoutConstants.kt +117 -0
- package/android/src/main/java/com/apollohg/editor/RenderMediaSpans.kt +337 -0
- package/android/src/main/java/com/apollohg/editor/RenderParagraphSpans.kt +182 -0
- package/android/src/main/java/com/apollohg/editor/RichTextEditorView.kt +951 -0
- package/android/src/main/java/com/apollohg/editor/SharedNativeImagePipeline.kt +78 -0
- package/android/src/main/java/com/apollohg/editor/UniffiEditorV2Backend.kt +261 -0
- package/android/src/main/java/com/apollohg/editor/viewer/AndroidProseLayoutEngine.kt +1656 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricAttachmentSidecars.kt +80 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FabricLeaseHandleBridge.kt +59 -0
- package/android/src/main/java/com/apollohg/editor/viewer/FallbackSelectionGeometry.kt +450 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseDrawingView.kt +678 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseInstrumentation.kt +608 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayout.kt +186 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutCache.kt +393 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseLayoutRegistry.kt +828 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseTheme.kt +316 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerManager.kt +900 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedProseViewerPackage.kt +16 -0
- package/android/src/main/java/com/apollohg/editor/viewer/PreparedViewerAtoms.kt +89 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerCodeHighlighting.kt +91 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerDocument.kt +453 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerFontEnvironment.kt +282 -0
- package/android/src/main/java/com/apollohg/editor/viewer/ViewerImagePipeline.kt +460 -0
- package/android/src/main/jni/CMakeLists.txt +85 -0
- package/android/src/main/jni/PreparedProseViewerMeasurementsManager.cpp +334 -0
- package/android/src/main/jni/ReactNativeProseEditorSpec.h +17 -0
- package/android/src/main/jni/reactnativeproseeditor.h +6 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/release/java/com/apollohg/editor/viewer/PreparedProseDrawInstrumentation.kt +9 -0
- package/app.plugin.js +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseMeasurementsManager.h +62 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerComponentDescriptor.h +30 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.cpp +192 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerShadowNode.h +46 -0
- package/common/cpp/react/renderer/components/PreparedProseViewer/PreparedProseViewerState.h +145 -0
- package/dist/AtomHost.d.ts +17 -0
- package/dist/AtomHost.js +135 -0
- package/dist/DefaultAtomChip.d.ts +2 -0
- package/dist/DefaultAtomChip.js +22 -0
- package/dist/EditorAddon.d.ts +32 -0
- package/dist/EditorAddon.js +29 -0
- package/dist/EditorAddonNormalization.d.ts +6 -0
- package/dist/EditorAddonNormalization.js +48 -0
- package/dist/EditorMentionThemeNormalization.d.ts +8 -0
- package/dist/EditorMentionThemeNormalization.js +22 -0
- package/dist/EditorMentionThemeValidation.d.ts +12 -0
- package/dist/EditorMentionThemeValidation.js +95 -0
- package/dist/EditorStyleSheet.d.ts +4 -0
- package/dist/EditorStyleSheet.js +10 -0
- package/dist/EditorStyleSheetNormalization.d.ts +3 -0
- package/dist/EditorStyleSheetNormalization.js +226 -0
- package/dist/EditorStyleSheetTypes.d.ts +151 -0
- package/dist/EditorStyleSheetTypes.js +2 -0
- package/dist/EditorTheme.d.ts +117 -0
- package/dist/EditorTheme.js +41 -0
- package/dist/EditorToolbar.d.ts +4 -0
- package/dist/EditorToolbar.js +17 -0
- package/dist/EditorToolbarComponent.d.ts +13 -0
- package/dist/EditorToolbarComponent.js +24 -0
- package/dist/EditorToolbarItems.d.ts +9 -0
- package/dist/EditorToolbarItems.js +58 -0
- package/dist/EditorToolbarRegistry.d.ts +59 -0
- package/dist/EditorToolbarRegistry.js +175 -0
- package/dist/EditorToolbarTypes.d.ts +273 -0
- package/dist/EditorToolbarTypes.js +2 -0
- package/dist/EditorToolbarVisuals.d.ts +154 -0
- package/dist/EditorToolbarVisuals.js +228 -0
- package/dist/EditorUpdateRevision.d.ts +8 -0
- package/dist/EditorUpdateRevision.js +22 -0
- package/dist/ExternalTextComposition.d.ts +45 -0
- package/dist/ExternalTextComposition.js +537 -0
- package/dist/ImageLoadingPolicy.d.ts +54 -0
- package/dist/ImageLoadingPolicy.js +60 -0
- package/dist/NativeEditorBoundaryError.d.ts +111 -0
- package/dist/NativeEditorBoundaryError.js +268 -0
- package/dist/NativeEditorBridge.d.ts +9 -0
- package/dist/NativeEditorBridge.js +37 -0
- package/dist/NativeEditorCollaborationTransport.d.ts +154 -0
- package/dist/NativeEditorCollaborationTransport.js +275 -0
- package/dist/NativeEditorCreateConfig.d.ts +16 -0
- package/dist/NativeEditorCreateConfig.js +249 -0
- package/dist/NativeEditorCreateJson.d.ts +76 -0
- package/dist/NativeEditorCreateJson.js +474 -0
- package/dist/NativeEditorCreateValidation.d.ts +32 -0
- package/dist/NativeEditorCreateValidation.js +150 -0
- package/dist/NativeEditorDocumentBridge.d.ts +72 -0
- package/dist/NativeEditorDocumentBridge.js +305 -0
- package/dist/NativeEditorDocumentHandle.d.ts +70 -0
- package/dist/NativeEditorDocumentHandle.js +89 -0
- package/dist/NativeEditorLocalAwareness.d.ts +34 -0
- package/dist/NativeEditorLocalAwareness.js +153 -0
- package/dist/NativeEditorNativeModule.d.ts +48 -0
- package/dist/NativeEditorNativeModule.js +34 -0
- package/dist/NativeEditorRenderNormalization.d.ts +22 -0
- package/dist/NativeEditorRenderNormalization.js +274 -0
- package/dist/NativeEditorResultNormalization.d.ts +108 -0
- package/dist/NativeEditorResultNormalization.js +400 -0
- package/dist/NativeEditorTypes.d.ts +318 -0
- package/dist/NativeEditorTypes.js +15 -0
- package/dist/NativeEditorV2Decimal.d.ts +5 -0
- package/dist/NativeEditorV2Decimal.js +18 -0
- package/dist/NativeProseViewer.d.ts +122 -0
- package/dist/NativeProseViewer.js +130 -0
- package/dist/NativeRichTextEditor.d.ts +3 -0
- package/dist/NativeRichTextEditor.js +6 -0
- package/dist/ResourceLimits.d.ts +100 -0
- package/dist/ResourceLimits.js +80 -0
- package/dist/RichTextEditor.d.ts +4 -0
- package/dist/RichTextEditor.js +25 -0
- package/dist/RichTextEditorNativeTypes.d.ts +122 -0
- package/dist/RichTextEditorNativeTypes.js +2 -0
- package/dist/RichTextEditorNativeView.d.ts +12 -0
- package/dist/RichTextEditorNativeView.js +15 -0
- package/dist/RichTextEditorSerialization.d.ts +53 -0
- package/dist/RichTextEditorSerialization.js +283 -0
- package/dist/RichTextEditorTypes.d.ts +281 -0
- package/dist/RichTextEditorTypes.js +2 -0
- package/dist/ViewerConfiguration.d.ts +22 -0
- package/dist/ViewerConfiguration.js +6 -0
- package/dist/YjsCollaboration.d.ts +146 -0
- package/dist/YjsCollaboration.js +496 -0
- package/dist/addons.d.ts +193 -0
- package/dist/addons.js +122 -0
- package/dist/atomConstants.d.ts +3 -0
- package/dist/atomConstants.js +6 -0
- package/dist/atomInstances.d.ts +35 -0
- package/dist/atomInstances.js +79 -0
- package/dist/atomPolicy.d.ts +4 -0
- package/dist/atomPolicy.js +47 -0
- package/dist/atomUpdates.d.ts +2 -0
- package/dist/atomUpdates.js +38 -0
- package/dist/atoms.d.ts +92 -0
- package/dist/atoms.js +222 -0
- package/dist/attributeValidation.d.ts +4 -0
- package/dist/attributeValidation.js +97 -0
- package/dist/contentExpression.d.ts +6 -0
- package/dist/contentExpression.js +335 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +78 -0
- package/dist/listMarkers.d.ts +15 -0
- package/dist/listMarkers.js +21 -0
- package/dist/schemaDefinition.d.ts +143 -0
- package/dist/schemaDefinition.js +206 -0
- package/dist/schemaDocument.d.ts +17 -0
- package/dist/schemaDocument.js +69 -0
- package/dist/schemaDocumentConstruction.d.ts +5 -0
- package/dist/schemaDocumentConstruction.js +125 -0
- package/dist/schemaNormalization.d.ts +29 -0
- package/dist/schemaNormalization.js +313 -0
- package/dist/schemaPresets.d.ts +68 -0
- package/dist/schemaPresets.js +198 -0
- package/dist/schemaResolution.d.ts +9 -0
- package/dist/schemaResolution.js +211 -0
- package/dist/schemas.d.ts +5 -0
- package/dist/schemas.js +28 -0
- package/dist/specs/PreparedProseViewerNativeComponent.d.ts +37 -0
- package/dist/specs/PreparedProseViewerNativeComponent.js +6 -0
- package/dist/useEditorToolbarInteractions.d.ts +12 -0
- package/dist/useEditorToolbarInteractions.js +218 -0
- package/dist/useEditorToolbarItems.d.ts +8 -0
- package/dist/useEditorToolbarItems.js +280 -0
- package/dist/useEditorToolbarPresentation.d.ts +4 -0
- package/dist/useEditorToolbarPresentation.js +203 -0
- package/dist/useEditorToolbarState.d.ts +63 -0
- package/dist/useEditorToolbarState.js +108 -0
- package/dist/useFocusPreservingFrames.d.ts +17 -0
- package/dist/useFocusPreservingFrames.js +108 -0
- package/dist/useNativeEditor.d.ts +66 -0
- package/dist/useNativeEditor.js +370 -0
- package/dist/useRichTextEditorCommands.d.ts +21 -0
- package/dist/useRichTextEditorCommands.js +299 -0
- package/dist/useRichTextEditorEvents.d.ts +18 -0
- package/dist/useRichTextEditorEvents.js +216 -0
- package/dist/useRichTextEditorMentions.d.ts +11 -0
- package/dist/useRichTextEditorMentions.js +316 -0
- package/dist/useRichTextEditorPresentation.d.ts +5 -0
- package/dist/useRichTextEditorPresentation.js +178 -0
- package/dist/useRichTextEditorState.d.ts +180 -0
- package/dist/useRichTextEditorState.js +405 -0
- package/dist/useRichTextEditorUpdates.d.ts +10 -0
- package/dist/useRichTextEditorUpdates.js +308 -0
- package/dist/useViewerAtoms.d.ts +38 -0
- package/dist/useViewerAtoms.js +288 -0
- package/expo-module.config.json +13 -0
- package/ios/EditorAddons.swift +354 -0
- package/ios/EditorCodeHighlighting.swift +184 -0
- package/ios/EditorCore.xcframework/Info.plist +44 -0
- package/ios/EditorCore.xcframework/ios-arm64/libeditor_core.a +0 -0
- package/ios/EditorCore.xcframework/ios-arm64_x86_64-simulator/libeditor_core.a +0 -0
- package/ios/EditorInteractionOverlays.swift +697 -0
- package/ios/EditorLayoutManager.swift +971 -0
- package/ios/EditorNodeTypes.swift +37 -0
- package/ios/EditorStyleSheet.swift +461 -0
- package/ios/EditorTextView+AttributedPatch.swift +305 -0
- package/ios/EditorTextView+Binding.swift +61 -0
- package/ios/EditorTextView+Caret.swift +333 -0
- package/ios/EditorTextView+Commands.swift +203 -0
- package/ios/EditorTextView+Delegate.swift +65 -0
- package/ios/EditorTextView+Diagnostics.swift +225 -0
- package/ios/EditorTextView+DragDrop.swift +290 -0
- package/ios/EditorTextView+ExternalComposition.swift +364 -0
- package/ios/EditorTextView+Images.swift +354 -0
- package/ios/EditorTextView+InputTraits.swift +200 -0
- package/ios/EditorTextView+KeyboardInput.swift +318 -0
- package/ios/EditorTextView+Layout.swift +245 -0
- package/ios/EditorTextView+MarkedText.swift +267 -0
- package/ios/EditorTextView+NativeInputLifecycle.swift +372 -0
- package/ios/EditorTextView+NativeMutation.swift +471 -0
- package/ios/EditorTextView+Reconciliation.swift +97 -0
- package/ios/EditorTextView+RenderPatch.swift +573 -0
- package/ios/EditorTextView+Rendering.swift +539 -0
- package/ios/EditorTextView+Selection.swift +542 -0
- package/ios/EditorTextView.swift +953 -0
- package/ios/EditorTheme.swift +626 -0
- package/ios/EditorV2Adapter+Commands.swift +204 -0
- package/ios/EditorV2Adapter+Envelope.swift +238 -0
- package/ios/EditorV2Adapter+Mutation.swift +392 -0
- package/ios/EditorV2Adapter+Registry.swift +185 -0
- package/ios/EditorV2Adapter+RenderState.swift +360 -0
- package/ios/EditorV2Adapter+RenderValidation.swift +420 -0
- package/ios/EditorV2Adapter+Selection.swift +329 -0
- package/ios/EditorV2Adapter+TextCommands.swift +430 -0
- package/ios/EditorV2Adapter.swift +376 -0
- package/ios/EditorV2Shadow.swift +353 -0
- package/ios/Generated_editor_core.swift +2378 -0
- package/ios/NativeCodeHighlighting.swift +159 -0
- package/ios/NativeCollaborationSocket.swift +144 -0
- package/ios/NativeCollaborationTransport+Protocol.swift +258 -0
- package/ios/NativeCollaborationTransport+Socket.swift +379 -0
- package/ios/NativeCollaborationTransport+Validation.swift +103 -0
- package/ios/NativeCollaborationTransport.swift +322 -0
- package/ios/NativeCollaborationTransportRegistry.swift +521 -0
- package/ios/NativeEditorExpoView+AccessoryRetry.swift +219 -0
- package/ios/NativeEditorExpoView+Binding.swift +268 -0
- package/ios/NativeEditorExpoView+Diagnostics.swift +66 -0
- package/ios/NativeEditorExpoView+Events.swift +131 -0
- package/ios/NativeEditorExpoView+Focus.swift +169 -0
- package/ios/NativeEditorExpoView+MentionRetry.swift +288 -0
- package/ios/NativeEditorExpoView+Mentions.swift +288 -0
- package/ios/NativeEditorExpoView+Properties.swift +300 -0
- package/ios/NativeEditorExpoView+Toolbar.swift +86 -0
- package/ios/NativeEditorExpoView+Updates.swift +312 -0
- package/ios/NativeEditorExpoView.swift +349 -0
- package/ios/NativeEditorModule.swift +856 -0
- package/ios/NativeEditorViewRegistry.swift +226 -0
- package/ios/NativeToolbar+ButtonStyle.swift +214 -0
- package/ios/NativeToolbar+Buttons.swift +228 -0
- package/ios/NativeToolbar+Diagnostics.swift +114 -0
- package/ios/NativeToolbar+Menu.swift +101 -0
- package/ios/NativeToolbar+Models.swift +519 -0
- package/ios/NativeToolbar+Placeholder.swift +39 -0
- package/ios/NativeToolbar.swift +612 -0
- package/ios/OrderedListMarkerFormatter.swift +103 -0
- package/ios/PositionBridge.swift +596 -0
- package/ios/ProseViewerView.swift +462 -0
- package/ios/RenderBridge+Atoms.swift +288 -0
- package/ios/RenderBridge+Attachments.swift +246 -0
- package/ios/RenderBridge+BlockBoundaries.swift +313 -0
- package/ios/RenderBridge+Style.swift +343 -0
- package/ios/RenderBridge.swift +704 -0
- package/ios/RichTextEditorView.swift +930 -0
- package/ios/SharedNativeImagePipeline+Cache.swift +189 -0
- package/ios/SharedNativeImagePipeline+Transport.swift +328 -0
- package/ios/SharedNativeImagePipeline.swift +533 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+AttributedText.swift +436 -0
- package/ios/Viewer/CoreTextProseLayoutEngine+Models.swift +322 -0
- package/ios/Viewer/CoreTextProseLayoutEngine.swift +635 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.h +4 -0
- package/ios/Viewer/Fabric/PREPPreparedProseViewerComponentView.mm +767 -0
- package/ios/Viewer/Fabric/PreparedProseMeasurementsManager.mm +118 -0
- package/ios/Viewer/NativeSVGImageDecoder.h +9 -0
- package/ios/Viewer/NativeSVGImageDecoder.mm +106 -0
- package/ios/Viewer/NativeSVGPreflight.h +11 -0
- package/ios/Viewer/NativeSVGPreflight.mm +219 -0
- package/ios/Viewer/PreparedProseDrawingView.swift +639 -0
- package/ios/Viewer/PreparedProseInstrumentation.swift +387 -0
- package/ios/Viewer/PreparedProseLayout.swift +326 -0
- package/ios/Viewer/PreparedProseLayoutCache.swift +766 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Artifacts.swift +377 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+Fabric.swift +582 -0
- package/ios/Viewer/PreparedProseLayoutRegistry+FabricOwnership.swift +128 -0
- package/ios/Viewer/PreparedProseLayoutRegistry.swift +381 -0
- package/ios/Viewer/ViewerDocument.swift +575 -0
- package/ios/Viewer/ViewerFontEnvironment.swift +283 -0
- package/ios/Viewer/ViewerImagePipeline.swift +478 -0
- package/ios/editor_coreFFI/editor_coreFFI.h +1023 -0
- package/ios/editor_coreFFI/module.modulemap +7 -0
- package/package.json +151 -0
- package/react-native.config.js +17 -0
- package/rust/android/arm64-v8a/libeditor_core.so +0 -0
- package/rust/android/armeabi-v7a/libeditor_core.so +0 -0
- package/rust/android/x86/libeditor_core.so +0 -0
- package/rust/android/x86_64/libeditor_core.so +0 -0
- package/rust/bindings/kotlin/uniffi/editor_core/editor_core.kt +3146 -0
- package/src/AtomHost.tsx +180 -0
- package/src/DefaultAtomChip.tsx +27 -0
- package/src/EditorAddon.ts +65 -0
- package/src/EditorAddonNormalization.ts +49 -0
- package/src/EditorMentionThemeNormalization.ts +25 -0
- package/src/EditorMentionThemeValidation.ts +133 -0
- package/src/EditorStyleSheet.ts +9 -0
- package/src/EditorStyleSheetNormalization.ts +219 -0
- package/src/EditorStyleSheetTypes.ts +189 -0
- package/src/EditorTheme.ts +196 -0
- package/src/EditorToolbar.tsx +31 -0
- package/src/EditorToolbarComponent.tsx +23 -0
- package/src/EditorToolbarItems.tsx +64 -0
- package/src/EditorToolbarRegistry.tsx +254 -0
- package/src/EditorToolbarTypes.tsx +322 -0
- package/src/EditorToolbarVisuals.tsx +270 -0
- package/src/EditorUpdateRevision.ts +26 -0
- package/src/ExternalTextComposition.ts +658 -0
- package/src/ImageLoadingPolicy.ts +125 -0
- package/src/NativeEditorBoundaryError.ts +345 -0
- package/src/NativeEditorBridge.ts +93 -0
- package/src/NativeEditorCollaborationTransport.ts +493 -0
- package/src/NativeEditorCreateConfig.ts +326 -0
- package/src/NativeEditorCreateJson.ts +579 -0
- package/src/NativeEditorCreateValidation.ts +178 -0
- package/src/NativeEditorDocumentBridge.ts +485 -0
- package/src/NativeEditorDocumentHandle.ts +168 -0
- package/src/NativeEditorLocalAwareness.ts +168 -0
- package/src/NativeEditorNativeModule.ts +97 -0
- package/src/NativeEditorRenderNormalization.ts +320 -0
- package/src/NativeEditorResultNormalization.ts +469 -0
- package/src/NativeEditorTypes.ts +366 -0
- package/src/NativeEditorV2Decimal.ts +13 -0
- package/src/NativeProseViewer.tsx +356 -0
- package/src/NativeRichTextEditor.tsx +33 -0
- package/src/ResourceLimits.ts +187 -0
- package/src/RichTextEditor.tsx +27 -0
- package/src/RichTextEditorNativeTypes.tsx +144 -0
- package/src/RichTextEditorNativeView.tsx +21 -0
- package/src/RichTextEditorSerialization.tsx +381 -0
- package/src/RichTextEditorTypes.tsx +327 -0
- package/src/ViewerConfiguration.ts +23 -0
- package/src/YjsCollaboration.ts +692 -0
- package/src/addons.ts +311 -0
- package/src/atomConstants.ts +3 -0
- package/src/atomInstances.ts +123 -0
- package/src/atomPolicy.ts +47 -0
- package/src/atomUpdates.ts +52 -0
- package/src/atoms.ts +379 -0
- package/src/attributeValidation.ts +116 -0
- package/src/contentExpression.ts +338 -0
- package/src/index.ts +295 -0
- package/src/listMarkers.ts +18 -0
- package/src/schemaDefinition.ts +395 -0
- package/src/schemaDocument.ts +92 -0
- package/src/schemaDocumentConstruction.ts +148 -0
- package/src/schemaNormalization.ts +367 -0
- package/src/schemaPresets.ts +250 -0
- package/src/schemaResolution.ts +242 -0
- package/src/schemas.ts +43 -0
- package/src/specs/PreparedProseViewerNativeComponent.ts +40 -0
- package/src/useEditorToolbarInteractions.tsx +329 -0
- package/src/useEditorToolbarItems.tsx +390 -0
- package/src/useEditorToolbarPresentation.tsx +483 -0
- package/src/useEditorToolbarState.tsx +172 -0
- package/src/useFocusPreservingFrames.ts +171 -0
- package/src/useNativeEditor.ts +534 -0
- package/src/useRichTextEditorCommands.tsx +478 -0
- package/src/useRichTextEditorEvents.tsx +342 -0
- package/src/useRichTextEditorMentions.tsx +441 -0
- package/src/useRichTextEditorPresentation.tsx +563 -0
- package/src/useRichTextEditorState.tsx +620 -0
- package/src/useRichTextEditorUpdates.tsx +403 -0
- package/src/useViewerAtoms.tsx +427 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NativeEditorErrorBase,
|
|
3
|
+
nativeEditorV2ErrorToException,
|
|
4
|
+
normalizeNativeEditorV2Error,
|
|
5
|
+
} from './NativeEditorBoundaryError';
|
|
6
|
+
import {
|
|
7
|
+
type NativeEditorTransportState,
|
|
8
|
+
type NativeEditorState,
|
|
9
|
+
invalidV2RequestError,
|
|
10
|
+
isPlainRecord,
|
|
11
|
+
whitelisted,
|
|
12
|
+
V2_TRANSPORT_STATES,
|
|
13
|
+
normalizeNativeEditorV2DecimalId,
|
|
14
|
+
optionalBoolean,
|
|
15
|
+
nativeEditorV2U32,
|
|
16
|
+
normalizeNativeEditorV2StateValue,
|
|
17
|
+
normalizeNativeEditorV2PeersValue,
|
|
18
|
+
} from './NativeEditorResultNormalization';
|
|
19
|
+
import { utf8V2JsonByteLength } from './NativeEditorCreateJson';
|
|
20
|
+
|
|
21
|
+
/** One peer's awareness record, as Rust currently holds it. */
|
|
22
|
+
export interface NativeEditorPeerInfo {
|
|
23
|
+
/** Yjs client identity, as a decimal string. */
|
|
24
|
+
clientId: string;
|
|
25
|
+
/** Awareness clock, advancing with each of this peer's updates. */
|
|
26
|
+
clock: number;
|
|
27
|
+
/** Whether this record describes this device. */
|
|
28
|
+
isLocal: boolean;
|
|
29
|
+
/** The peer's published application state, e.g. `{ user, focused }`. */
|
|
30
|
+
state: Record<string, unknown> | null;
|
|
31
|
+
/** The peer's caret in engine document positions, or null when it published none. */
|
|
32
|
+
cursor: { anchor: number; head: number } | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** One WebSocket frame exchanged during the protocol adapter's prelude. */
|
|
36
|
+
export type NativeCollaborationProtocolFrame =
|
|
37
|
+
| { type: 'text'; data: string }
|
|
38
|
+
| { type: 'binary'; data: Uint8Array };
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* What the transport does next after an adapter callback:
|
|
42
|
+
*
|
|
43
|
+
* - `continue` — stay in the prelude and await the next frame.
|
|
44
|
+
* - `ready` — the prelude succeeded; release Yjs traffic.
|
|
45
|
+
* - `reject` — abandon this attempt.
|
|
46
|
+
*/
|
|
47
|
+
export type NativeCollaborationProtocolAdapterAction = 'continue' | 'ready' | 'reject';
|
|
48
|
+
|
|
49
|
+
/** An adapter callback's decision, plus any frames to send before it takes effect. */
|
|
50
|
+
export interface NativeCollaborationProtocolAdapterResult {
|
|
51
|
+
action: NativeCollaborationProtocolAdapterAction;
|
|
52
|
+
/** Frames sent on the socket before the action applies. */
|
|
53
|
+
frames?: readonly NativeCollaborationProtocolFrame[];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Identifies the connection attempt an adapter callback is running for. */
|
|
57
|
+
export interface NativeCollaborationProtocolAdapterContext {
|
|
58
|
+
/** Identity of this physical connection attempt. */
|
|
59
|
+
attemptId: string;
|
|
60
|
+
/** Transport generation, as a decimal string. Advances on each reconfiguration. */
|
|
61
|
+
generation: string;
|
|
62
|
+
/** Subprotocol the server selected, if any. */
|
|
63
|
+
negotiatedProtocol: string | null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* An RN-owned, attempt-scoped prelude for a native-owned WebSocket.
|
|
68
|
+
*
|
|
69
|
+
* Native blocks all Yjs traffic until `onMessage` returns `ready`. Callbacks
|
|
70
|
+
* run once per native event and can read fresh credentials on every physical
|
|
71
|
+
* reconnect. Their frames and return values are never persisted by native.
|
|
72
|
+
*/
|
|
73
|
+
export interface NativeCollaborationProtocolAdapter {
|
|
74
|
+
/** WebSocket subprotocols offered during the physical handshake, in preference order. */
|
|
75
|
+
protocols: readonly string[];
|
|
76
|
+
/** Maximum time native permits the adapter to keep a physical socket pending. */
|
|
77
|
+
timeoutMillis?: number;
|
|
78
|
+
/** Close codes that park the Rust transport instead of entering automatic retry. */
|
|
79
|
+
terminalCloseCodes?: readonly number[];
|
|
80
|
+
/** Runs once when the socket opens — send credentials here. */
|
|
81
|
+
onOpen(
|
|
82
|
+
context: NativeCollaborationProtocolAdapterContext
|
|
83
|
+
): NativeCollaborationProtocolAdapterResult | Promise<NativeCollaborationProtocolAdapterResult>;
|
|
84
|
+
/** Runs for each frame received before the prelude returns `ready`. */
|
|
85
|
+
onMessage(
|
|
86
|
+
context: NativeCollaborationProtocolAdapterContext,
|
|
87
|
+
frame: NativeCollaborationProtocolFrame
|
|
88
|
+
): NativeCollaborationProtocolAdapterResult | Promise<NativeCollaborationProtocolAdapterResult>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Where the native transport connects, and whether it should. */
|
|
92
|
+
export interface NativeCollaborationTransportConfig {
|
|
93
|
+
/** WebSocket endpoint, `ws:` or `wss:`. Treat it as sensitive — it may carry credentials. */
|
|
94
|
+
url: string;
|
|
95
|
+
/** Whether to open the connection now. False configures the endpoint without connecting. */
|
|
96
|
+
connect: boolean;
|
|
97
|
+
/** Optional RN-owned prelude that gates the native Yjs transport. */
|
|
98
|
+
protocolAdapter?: NativeCollaborationProtocolAdapter;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Why the transport woke and what it did — diagnostic only; no contract depends on these. */
|
|
102
|
+
export interface NativeCollaborationTransportDiagnostics {
|
|
103
|
+
/** What woke the transport, e.g. a received message or an elapsed timer. */
|
|
104
|
+
wakeReason: string;
|
|
105
|
+
transportState: NativeEditorTransportState;
|
|
106
|
+
/** Decimal-string deadline for the next scheduled wake, if one is pending. */
|
|
107
|
+
nextDeadlineMillis: string | null;
|
|
108
|
+
/** Whether this wake applied a remote commit. */
|
|
109
|
+
remoteCommitApplied: boolean;
|
|
110
|
+
/** Whether the peer list changed. */
|
|
111
|
+
peersChanged: boolean;
|
|
112
|
+
/** Whether the local awareness entry was republished. */
|
|
113
|
+
renewedLocal: boolean;
|
|
114
|
+
/** Peers dropped for having gone stale. */
|
|
115
|
+
expiredPeerCount: number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The transport advanced: new engine state, peers, and diagnostics. */
|
|
119
|
+
export interface NativeCollaborationTransportStateEvent {
|
|
120
|
+
editorId: string;
|
|
121
|
+
/** Monotonic decimal-string sequence across all events for this handle. */
|
|
122
|
+
eventSequence: string;
|
|
123
|
+
generation: string | null;
|
|
124
|
+
kind: 'state';
|
|
125
|
+
state: NativeEditorState;
|
|
126
|
+
peers: NativeEditorPeerInfo[];
|
|
127
|
+
diagnostics: NativeCollaborationTransportDiagnostics;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** The transport failed. Retryable failures are followed by further state events. */
|
|
131
|
+
export interface NativeCollaborationTransportErrorEvent {
|
|
132
|
+
editorId: string;
|
|
133
|
+
eventSequence: string;
|
|
134
|
+
generation: string | null;
|
|
135
|
+
kind: 'error';
|
|
136
|
+
error: NativeEditorErrorBase;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Native is asking the configured protocol adapter to handle a prelude step. */
|
|
140
|
+
export interface NativeCollaborationProtocolAdapterEvent {
|
|
141
|
+
editorId: string;
|
|
142
|
+
eventSequence: string;
|
|
143
|
+
generation: string;
|
|
144
|
+
kind: 'protocolAdapter';
|
|
145
|
+
/** Identity of the physical connection attempt. */
|
|
146
|
+
attemptId: string;
|
|
147
|
+
/** Identity of this callback invocation; the reply must quote it. */
|
|
148
|
+
eventId: string;
|
|
149
|
+
negotiatedProtocol: string | null;
|
|
150
|
+
/** Which adapter callback this event corresponds to. */
|
|
151
|
+
phase: 'open' | 'message';
|
|
152
|
+
/** The received frame, present when `phase` is `'message'`. */
|
|
153
|
+
frame?: NativeCollaborationProtocolFrame;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Any event emitted to a `NativeEditorDocumentHandle` transport listener. */
|
|
157
|
+
export type NativeCollaborationTransportEvent =
|
|
158
|
+
| NativeCollaborationTransportStateEvent
|
|
159
|
+
| NativeCollaborationTransportErrorEvent
|
|
160
|
+
| NativeCollaborationProtocolAdapterEvent;
|
|
161
|
+
|
|
162
|
+
export interface NativeCollaborationProtocolAdapterDescriptor {
|
|
163
|
+
protocols: string[];
|
|
164
|
+
timeoutMillis?: number;
|
|
165
|
+
terminalCloseCodes?: number[];
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface NativeCollaborationTransportWireConfig {
|
|
169
|
+
url: string;
|
|
170
|
+
connect: boolean;
|
|
171
|
+
protocolAdapter?: NativeCollaborationProtocolAdapterDescriptor;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export const COLLABORATION_PROTOCOL_TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
175
|
+
|
|
176
|
+
export const MAX_COLLABORATION_PROTOCOLS = 16;
|
|
177
|
+
|
|
178
|
+
export const MAX_COLLABORATION_PROTOCOL_BYTES = 128;
|
|
179
|
+
|
|
180
|
+
export const MAX_COLLABORATION_ADAPTER_TIMEOUT_MILLIS = 60_000;
|
|
181
|
+
|
|
182
|
+
export const MAX_COLLABORATION_ADAPTER_FRAMES = 16;
|
|
183
|
+
|
|
184
|
+
export const MAX_COLLABORATION_ADAPTER_FRAME_BYTES = 64 * 1024;
|
|
185
|
+
|
|
186
|
+
export function collaborationProtocolAdapterDescriptor(
|
|
187
|
+
value: NativeCollaborationProtocolAdapter
|
|
188
|
+
): NativeCollaborationProtocolAdapterDescriptor {
|
|
189
|
+
if (
|
|
190
|
+
value === null ||
|
|
191
|
+
typeof value !== 'object' ||
|
|
192
|
+
!Array.isArray(value.protocols) ||
|
|
193
|
+
value.protocols.length < 1 ||
|
|
194
|
+
value.protocols.length > MAX_COLLABORATION_PROTOCOLS ||
|
|
195
|
+
typeof value.onOpen !== 'function' ||
|
|
196
|
+
typeof value.onMessage !== 'function'
|
|
197
|
+
) {
|
|
198
|
+
throw invalidV2RequestError('NativeEditorBridge: invalid collaboration protocol adapter');
|
|
199
|
+
}
|
|
200
|
+
const protocols = value.protocols.map((protocol) => {
|
|
201
|
+
if (
|
|
202
|
+
typeof protocol !== 'string' ||
|
|
203
|
+
protocol.length === 0 ||
|
|
204
|
+
utf8V2JsonByteLength(protocol) > MAX_COLLABORATION_PROTOCOL_BYTES ||
|
|
205
|
+
!COLLABORATION_PROTOCOL_TOKEN.test(protocol)
|
|
206
|
+
) {
|
|
207
|
+
throw invalidV2RequestError(
|
|
208
|
+
'NativeEditorBridge: invalid collaboration WebSocket subprotocol'
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
return protocol;
|
|
212
|
+
});
|
|
213
|
+
if (new Set(protocols).size !== protocols.length) {
|
|
214
|
+
throw invalidV2RequestError(
|
|
215
|
+
'NativeEditorBridge: duplicate collaboration WebSocket subprotocol'
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
const timeoutMillis = value.timeoutMillis;
|
|
219
|
+
if (
|
|
220
|
+
timeoutMillis !== undefined &&
|
|
221
|
+
(!Number.isSafeInteger(timeoutMillis) ||
|
|
222
|
+
timeoutMillis < 1 ||
|
|
223
|
+
timeoutMillis > MAX_COLLABORATION_ADAPTER_TIMEOUT_MILLIS)
|
|
224
|
+
) {
|
|
225
|
+
throw invalidV2RequestError(
|
|
226
|
+
'NativeEditorBridge: invalid collaboration protocol adapter timeout'
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
const rawTerminalCloseCodes = value.terminalCloseCodes;
|
|
230
|
+
if (
|
|
231
|
+
rawTerminalCloseCodes !== undefined &&
|
|
232
|
+
(!Array.isArray(rawTerminalCloseCodes) ||
|
|
233
|
+
rawTerminalCloseCodes.some(
|
|
234
|
+
(code) => !Number.isSafeInteger(code) || code < 1_000 || code > 4_999
|
|
235
|
+
))
|
|
236
|
+
) {
|
|
237
|
+
throw invalidV2RequestError(
|
|
238
|
+
'NativeEditorBridge: invalid collaboration terminal close code'
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const terminalCloseCodes =
|
|
242
|
+
rawTerminalCloseCodes === undefined ? undefined : [...rawTerminalCloseCodes];
|
|
243
|
+
if (
|
|
244
|
+
terminalCloseCodes !== undefined &&
|
|
245
|
+
new Set(terminalCloseCodes).size !== terminalCloseCodes.length
|
|
246
|
+
) {
|
|
247
|
+
throw invalidV2RequestError(
|
|
248
|
+
'NativeEditorBridge: duplicate collaboration terminal close code'
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
protocols,
|
|
253
|
+
...(timeoutMillis === undefined ? {} : { timeoutMillis }),
|
|
254
|
+
...(terminalCloseCodes === undefined ? {} : { terminalCloseCodes }),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export function collaborationTransportWireConfig(
|
|
259
|
+
config: NativeCollaborationTransportConfig
|
|
260
|
+
): NativeCollaborationTransportWireConfig {
|
|
261
|
+
if (
|
|
262
|
+
config === null ||
|
|
263
|
+
typeof config !== 'object' ||
|
|
264
|
+
typeof config.url !== 'string' ||
|
|
265
|
+
typeof config.connect !== 'boolean'
|
|
266
|
+
) {
|
|
267
|
+
throw invalidV2RequestError(
|
|
268
|
+
'NativeEditorBridge: invalid collaboration transport configuration'
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
url: config.url,
|
|
273
|
+
connect: config.connect,
|
|
274
|
+
...(config.protocolAdapter === undefined
|
|
275
|
+
? {}
|
|
276
|
+
: {
|
|
277
|
+
protocolAdapter: collaborationProtocolAdapterDescriptor(config.protocolAdapter),
|
|
278
|
+
}),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
export function serializeCollaborationProtocolAdapterResult(
|
|
283
|
+
value: NativeCollaborationProtocolAdapterResult
|
|
284
|
+
): string {
|
|
285
|
+
if (
|
|
286
|
+
value === null ||
|
|
287
|
+
typeof value !== 'object' ||
|
|
288
|
+
(value.action !== 'continue' && value.action !== 'ready' && value.action !== 'reject') ||
|
|
289
|
+
(value.frames !== undefined &&
|
|
290
|
+
(!Array.isArray(value.frames) ||
|
|
291
|
+
value.frames.length > MAX_COLLABORATION_ADAPTER_FRAMES))
|
|
292
|
+
) {
|
|
293
|
+
throw invalidV2RequestError(
|
|
294
|
+
'NativeEditorBridge: invalid collaboration protocol adapter result'
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
const frames = (value.frames ?? []).map((frame) => {
|
|
298
|
+
if (frame === null || typeof frame !== 'object') {
|
|
299
|
+
throw invalidV2RequestError(
|
|
300
|
+
'NativeEditorBridge: invalid collaboration protocol adapter frame'
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
if (frame.type === 'text' && typeof frame.data === 'string') {
|
|
304
|
+
if (utf8V2JsonByteLength(frame.data) > MAX_COLLABORATION_ADAPTER_FRAME_BYTES) {
|
|
305
|
+
throw invalidV2RequestError(
|
|
306
|
+
'NativeEditorBridge: collaboration protocol adapter frame is too large'
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
return { type: 'text' as const, data: frame.data };
|
|
310
|
+
}
|
|
311
|
+
if (
|
|
312
|
+
frame.type === 'binary' &&
|
|
313
|
+
frame.data instanceof Uint8Array &&
|
|
314
|
+
frame.data.byteLength <= MAX_COLLABORATION_ADAPTER_FRAME_BYTES
|
|
315
|
+
) {
|
|
316
|
+
return {
|
|
317
|
+
type: 'binary' as const,
|
|
318
|
+
data: encodeNativeCollaborationProtocolBytes(frame.data),
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
throw invalidV2RequestError(
|
|
322
|
+
'NativeEditorBridge: invalid collaboration protocol adapter frame'
|
|
323
|
+
);
|
|
324
|
+
});
|
|
325
|
+
return JSON.stringify({
|
|
326
|
+
action: value.action,
|
|
327
|
+
...(frames.length === 0 ? {} : { frames }),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export function normalizeNativeCollaborationTransportDiagnostics(
|
|
332
|
+
value: unknown
|
|
333
|
+
): NativeCollaborationTransportDiagnostics | null {
|
|
334
|
+
if (!isPlainRecord(value)) return null;
|
|
335
|
+
const transportState = whitelisted(value.transportState, V2_TRANSPORT_STATES);
|
|
336
|
+
const nextDeadlineMillis =
|
|
337
|
+
value.nextDeadlineMillis === null
|
|
338
|
+
? null
|
|
339
|
+
: normalizeNativeEditorV2DecimalId(value.nextDeadlineMillis);
|
|
340
|
+
const remoteCommitApplied = optionalBoolean(value.remoteCommitApplied);
|
|
341
|
+
const peersChanged = optionalBoolean(value.peersChanged);
|
|
342
|
+
const renewedLocal = optionalBoolean(value.renewedLocal);
|
|
343
|
+
const expiredPeerCount = nativeEditorV2U32(value.expiredPeerCount);
|
|
344
|
+
if (
|
|
345
|
+
typeof value.wakeReason !== 'string' ||
|
|
346
|
+
transportState == null ||
|
|
347
|
+
(value.nextDeadlineMillis !== null && nextDeadlineMillis == null) ||
|
|
348
|
+
remoteCommitApplied == null ||
|
|
349
|
+
peersChanged == null ||
|
|
350
|
+
renewedLocal == null ||
|
|
351
|
+
expiredPeerCount == null
|
|
352
|
+
) {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
wakeReason: value.wakeReason,
|
|
357
|
+
transportState,
|
|
358
|
+
nextDeadlineMillis,
|
|
359
|
+
remoteCommitApplied,
|
|
360
|
+
peersChanged,
|
|
361
|
+
renewedLocal,
|
|
362
|
+
expiredPeerCount,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export const BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
367
|
+
|
|
368
|
+
export function encodeNativeCollaborationProtocolBytes(bytes: Uint8Array): string {
|
|
369
|
+
let encoded = '';
|
|
370
|
+
for (let index = 0; index < bytes.length; index += 3) {
|
|
371
|
+
const first = bytes[index];
|
|
372
|
+
const second = index + 1 < bytes.length ? bytes[index + 1] : 0;
|
|
373
|
+
const third = index + 2 < bytes.length ? bytes[index + 2] : 0;
|
|
374
|
+
const value = (first << 16) | (second << 8) | third;
|
|
375
|
+
encoded += BASE64_ALPHABET[(value >>> 18) & 63];
|
|
376
|
+
encoded += BASE64_ALPHABET[(value >>> 12) & 63];
|
|
377
|
+
encoded += index + 1 < bytes.length ? BASE64_ALPHABET[(value >>> 6) & 63] : '=';
|
|
378
|
+
encoded += index + 2 < bytes.length ? BASE64_ALPHABET[value & 63] : '=';
|
|
379
|
+
}
|
|
380
|
+
return encoded;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
export function decodeNativeCollaborationProtocolBytes(value: string): Uint8Array | null {
|
|
384
|
+
if (value.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(value)) return null;
|
|
385
|
+
const firstPadding = value.indexOf('=');
|
|
386
|
+
if (firstPadding >= 0 && firstPadding < value.length - 2) return null;
|
|
387
|
+
const outputLength =
|
|
388
|
+
(value.length / 4) * 3 - (value.endsWith('==') ? 2 : value.endsWith('=') ? 1 : 0);
|
|
389
|
+
const bytes = new Uint8Array(outputLength);
|
|
390
|
+
let outputIndex = 0;
|
|
391
|
+
for (let index = 0; index < value.length; index += 4) {
|
|
392
|
+
const first = BASE64_ALPHABET.indexOf(value[index]);
|
|
393
|
+
const second = BASE64_ALPHABET.indexOf(value[index + 1]);
|
|
394
|
+
const third = value[index + 2] === '=' ? 0 : BASE64_ALPHABET.indexOf(value[index + 2]);
|
|
395
|
+
const fourth = value[index + 3] === '=' ? 0 : BASE64_ALPHABET.indexOf(value[index + 3]);
|
|
396
|
+
if (first < 0 || second < 0 || third < 0 || fourth < 0) return null;
|
|
397
|
+
const decoded = (first << 18) | (second << 12) | (third << 6) | fourth;
|
|
398
|
+
if (outputIndex < outputLength) bytes[outputIndex++] = (decoded >>> 16) & 0xff;
|
|
399
|
+
if (outputIndex < outputLength) bytes[outputIndex++] = (decoded >>> 8) & 0xff;
|
|
400
|
+
if (outputIndex < outputLength) bytes[outputIndex++] = decoded & 0xff;
|
|
401
|
+
}
|
|
402
|
+
return bytes;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
export function normalizeNativeCollaborationTransportEvent(
|
|
406
|
+
value: unknown
|
|
407
|
+
): NativeCollaborationTransportEvent | null {
|
|
408
|
+
if (!isPlainRecord(value)) return null;
|
|
409
|
+
const editorId = normalizeNativeEditorV2DecimalId(value.editorId);
|
|
410
|
+
const eventSequence = normalizeNativeEditorV2DecimalId(value.eventSequence);
|
|
411
|
+
const generation =
|
|
412
|
+
value.generation === null ? null : normalizeNativeEditorV2DecimalId(value.generation);
|
|
413
|
+
if (
|
|
414
|
+
editorId == null ||
|
|
415
|
+
editorId === '0' ||
|
|
416
|
+
eventSequence == null ||
|
|
417
|
+
eventSequence === '0' ||
|
|
418
|
+
(value.generation !== null && generation == null)
|
|
419
|
+
) {
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
if (value.kind === 'state') {
|
|
423
|
+
const state = normalizeNativeEditorV2StateValue(value.state);
|
|
424
|
+
const peers = normalizeNativeEditorV2PeersValue({ peers: value.peers });
|
|
425
|
+
const diagnostics = normalizeNativeCollaborationTransportDiagnostics(value.diagnostics);
|
|
426
|
+
if (state == null || peers == null || diagnostics == null) return null;
|
|
427
|
+
return {
|
|
428
|
+
editorId,
|
|
429
|
+
eventSequence,
|
|
430
|
+
generation,
|
|
431
|
+
kind: 'state',
|
|
432
|
+
state,
|
|
433
|
+
peers,
|
|
434
|
+
diagnostics,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
if (value.kind === 'error') {
|
|
438
|
+
const error = normalizeNativeEditorV2Error({ error: value.error });
|
|
439
|
+
if (error == null) return null;
|
|
440
|
+
return {
|
|
441
|
+
editorId,
|
|
442
|
+
eventSequence,
|
|
443
|
+
generation,
|
|
444
|
+
kind: 'error',
|
|
445
|
+
error: nativeEditorV2ErrorToException(error),
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
if (value.kind === 'protocolAdapter') {
|
|
449
|
+
const eventId = normalizeNativeEditorV2DecimalId(value.eventId);
|
|
450
|
+
if (
|
|
451
|
+
generation == null ||
|
|
452
|
+
typeof value.attemptId !== 'string' ||
|
|
453
|
+
value.attemptId.length === 0 ||
|
|
454
|
+
eventId == null ||
|
|
455
|
+
eventId === '0' ||
|
|
456
|
+
(value.negotiatedProtocol !== null && typeof value.negotiatedProtocol !== 'string') ||
|
|
457
|
+
(value.phase !== 'open' && value.phase !== 'message')
|
|
458
|
+
) {
|
|
459
|
+
return null;
|
|
460
|
+
}
|
|
461
|
+
const base = {
|
|
462
|
+
editorId,
|
|
463
|
+
eventSequence,
|
|
464
|
+
generation,
|
|
465
|
+
kind: 'protocolAdapter' as const,
|
|
466
|
+
attemptId: value.attemptId,
|
|
467
|
+
eventId,
|
|
468
|
+
negotiatedProtocol: value.negotiatedProtocol as string | null,
|
|
469
|
+
};
|
|
470
|
+
if (value.phase === 'open') {
|
|
471
|
+
if (value.frame !== undefined) return null;
|
|
472
|
+
return { ...base, phase: 'open' };
|
|
473
|
+
}
|
|
474
|
+
if (!isPlainRecord(value.frame) || typeof value.frame.data !== 'string') return null;
|
|
475
|
+
if (value.frame.type === 'text') {
|
|
476
|
+
return {
|
|
477
|
+
...base,
|
|
478
|
+
phase: 'message',
|
|
479
|
+
frame: { type: 'text', data: value.frame.data },
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
if (value.frame.type === 'binary') {
|
|
483
|
+
const data = decodeNativeCollaborationProtocolBytes(value.frame.data);
|
|
484
|
+
if (data == null) return null;
|
|
485
|
+
return {
|
|
486
|
+
...base,
|
|
487
|
+
phase: 'message',
|
|
488
|
+
frame: { type: 'binary', data },
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return null;
|
|
493
|
+
}
|