edytor 1.0.0-rc.3 → 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/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -41,10 +41,8 @@
|
|
|
41
41
|
* - `handlers` — ws adds `messageAuth` (the auth reply exists only on a
|
|
42
42
|
* server socket — a BC room has no authority to deny).
|
|
43
43
|
*/
|
|
44
|
-
import * as bc from 'lib0-v14/broadcastchannel';
|
|
45
44
|
import * as encoding from 'lib0-v14/encoding';
|
|
46
45
|
import * as decoding from 'lib0-v14/decoding';
|
|
47
|
-
import * as env from 'lib0-v14/environment';
|
|
48
46
|
import * as promise from 'lib0-v14/promise';
|
|
49
47
|
import { applyAwarenessUpdate, encodeAwarenessUpdate } from '../protocols/awareness.js';
|
|
50
48
|
import { BARE_REPLY_LENGTH, frame, GENERATION, writeProtocolVersion } from '../protocols/envelope.js';
|
|
@@ -171,6 +169,37 @@ export const createChunkReader = (maxBytes = Infinity, admit = () => true) => {
|
|
|
171
169
|
};
|
|
172
170
|
/** An awareness frame carrying `clients`' entries of `states` (default: their current ones). */
|
|
173
171
|
const awarenessFrame = (awareness, clients, states) => frame(messageAwareness, (e) => encoding.writeVarUint8Array(e, encodeAwarenessUpdate(awareness, clients, states)));
|
|
172
|
+
const channels = new Map();
|
|
173
|
+
const channelNamed = (room) => {
|
|
174
|
+
let c = channels.get(room);
|
|
175
|
+
if (c === undefined) {
|
|
176
|
+
const subs = new Set();
|
|
177
|
+
const bc = new BroadcastChannel(room);
|
|
178
|
+
bc.onmessage = (e) => subs.forEach((sub) => sub(e.data, null));
|
|
179
|
+
channels.set(room, (c = { bc, subs }));
|
|
180
|
+
}
|
|
181
|
+
return c;
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* The tabs of one browser, by room name: one `BroadcastChannel` per room,
|
|
185
|
+
* shared by this tab's subscribers. A publish reaches the other tabs and,
|
|
186
|
+
* at once, this tab's other subscribers (with the publisher as origin).
|
|
187
|
+
*/
|
|
188
|
+
export const tabs = {
|
|
189
|
+
subscribe: (room, f) => void channelNamed(room).subs.add(f),
|
|
190
|
+
unsubscribe: (room, f) => {
|
|
191
|
+
const c = channels.get(room);
|
|
192
|
+
if (c?.subs.delete(f) && c.subs.size === 0) {
|
|
193
|
+
c.bc.close();
|
|
194
|
+
channels.delete(room);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
publish: (room, data, origin = null) => {
|
|
198
|
+
const c = channelNamed(room);
|
|
199
|
+
c.bc.postMessage(data);
|
|
200
|
+
c.subs.forEach((sub) => sub(data, origin));
|
|
201
|
+
}
|
|
202
|
+
};
|
|
174
203
|
/** The outbound quarantine: a read-only document does not spread. */
|
|
175
204
|
export const quarantined = (doc) => checkSchema(asEngineDoc(doc)) !== null;
|
|
176
205
|
/**
|
|
@@ -201,7 +230,7 @@ export const initLifecycle = (host, destroy, depart = () => { }) => {
|
|
|
201
230
|
}
|
|
202
231
|
else {
|
|
203
232
|
const leave = () => void destroy();
|
|
204
|
-
const proc =
|
|
233
|
+
const proc = globalThis.process ?? {};
|
|
205
234
|
proc.on?.('exit', leave);
|
|
206
235
|
host._leave = () => proc.off?.('exit', leave);
|
|
207
236
|
}
|
|
@@ -344,21 +373,9 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
344
373
|
// valid envelope surfaces through 'message-error'.
|
|
345
374
|
// A pending forged stamp this update would release is discarded
|
|
346
375
|
// (`discarded`) and reported the same way.
|
|
347
|
-
|
|
348
|
-
const payload = decoding.readVarUint8Array(decoder);
|
|
376
|
+
const update = decoding.readVarUint8Array(decoder);
|
|
349
377
|
const origin = emitSynced ? provider : (behavior.tabOrigin?.(provider) ?? provider);
|
|
350
378
|
const onError = (error) => provider.emit?.('message-error', [error, provider]);
|
|
351
|
-
let update;
|
|
352
|
-
try {
|
|
353
|
-
update =
|
|
354
|
-
syncMessageType === syncProtocol.messageYjsSyncStep2
|
|
355
|
-
? syncProtocol.step2Update(payload)
|
|
356
|
-
: payload;
|
|
357
|
-
}
|
|
358
|
-
catch (error) {
|
|
359
|
-
onError(error);
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
379
|
const { applied, problem, discarded } = syncProtocol.applyRemote(provider.doc, update, origin, onError);
|
|
363
380
|
const refused = problem ?? discarded;
|
|
364
381
|
if (refused) {
|
|
@@ -426,7 +443,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
426
443
|
const channelOf = (provider) => behavior.roomChannel(provider);
|
|
427
444
|
/** The BC subscriber: replies go back on the room channel. */
|
|
428
445
|
const bcSubscriber = (provider) => {
|
|
429
|
-
const send = (buf) =>
|
|
446
|
+
const send = (buf) => tabs.publish(channelOf(provider), buf, provider);
|
|
430
447
|
return (data, origin) => {
|
|
431
448
|
if (origin === provider)
|
|
432
449
|
return;
|
|
@@ -434,7 +451,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
434
451
|
readMessage(provider, new Uint8Array(data), false, send);
|
|
435
452
|
}
|
|
436
453
|
catch (error) {
|
|
437
|
-
//
|
|
454
|
+
// same-tab publishes are delivered synchronously — a malformed
|
|
438
455
|
// message must not propagate into the publisher's call stack.
|
|
439
456
|
provider.emit?.('message-error', [error, provider]);
|
|
440
457
|
}
|
|
@@ -477,12 +494,12 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
477
494
|
const connectBc = (provider) => {
|
|
478
495
|
const channel = channelOf(provider);
|
|
479
496
|
if (!provider.bcconnected) {
|
|
480
|
-
|
|
497
|
+
tabs.subscribe(channel, provider._bcSubscriber);
|
|
481
498
|
provider.bcconnected = true;
|
|
482
499
|
}
|
|
483
500
|
const [sv, presence] = hello(provider);
|
|
484
501
|
for (const buf of [sv, frame(messageQueryAwareness, () => { }), presence]) {
|
|
485
|
-
|
|
502
|
+
tabs.publish(channel, buf, provider);
|
|
486
503
|
}
|
|
487
504
|
};
|
|
488
505
|
/** The departure announcement — our presence, removed — on every transport the provider speaks. */
|
|
@@ -491,7 +508,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
491
508
|
const disconnectBc = (provider) => {
|
|
492
509
|
depart(provider);
|
|
493
510
|
if (provider.bcconnected) {
|
|
494
|
-
|
|
511
|
+
tabs.unsubscribe(channelOf(provider), provider._bcSubscriber);
|
|
495
512
|
provider.bcconnected = false;
|
|
496
513
|
}
|
|
497
514
|
};
|
|
@@ -122,7 +122,7 @@ export declare const bindWebsocketProvider: (Y: EngineApi) => {
|
|
|
122
122
|
bcChannel: string;
|
|
123
123
|
bcconnected: boolean;
|
|
124
124
|
disableBc: boolean;
|
|
125
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
125
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
126
126
|
/** The transaction origin of updates heard from another tab. */
|
|
127
127
|
_fromTab: {};
|
|
128
128
|
wsUnsuccessfulReconnects: number;
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* via `'protocol-mismatch'`. A v13
|
|
32
32
|
* y-websocket server in the room therefore cannot feed updates to this
|
|
33
33
|
* provider (and vice versa) — see docs/crdt-v14-providers.md §server
|
|
34
|
-
* classification: only an OPAQUE
|
|
34
|
+
* classification: only an OPAQUE relay stays compatible; a server
|
|
35
35
|
* that participates in sync (like upstream `y-websocket-server`) must itself
|
|
36
36
|
* run the vendored v14 engine + v14 protocol modules.
|
|
37
37
|
*
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
* re-sends a Step1 on the live socket for harnesses that drop frames
|
|
47
47
|
* there (TCP never does).
|
|
48
48
|
*/
|
|
49
|
-
import * as bc from 'lib0-v14/broadcastchannel';
|
|
50
49
|
import * as decoding from 'lib0-v14/decoding';
|
|
51
50
|
import * as time from 'lib0-v14/time';
|
|
52
51
|
import * as math from 'lib0-v14/math';
|
|
@@ -57,7 +56,7 @@ import { messagePermissionDenied, messageReadOnly, READ_ONLY_DENIAL, readAuthMes
|
|
|
57
56
|
import { bindSync } from '../protocols/sync.js';
|
|
58
57
|
import { readCommentsMessage, writeCommentsSubscribe } from '../protocols/comments.js';
|
|
59
58
|
import { frame } from '../protocols/envelope.js';
|
|
60
|
-
import { assertRoomId, beginDestroy, bindRoomProtocol, chunkFrame, CLOSE, createChunkReader, emitFailed, initLifecycle, isRefusal, LOCAL_PRESENCE_LOSS, markSynced, messageAuth, messageChunk, messageComments, messageSaved, messageSync, MAX_FRAME_BYTES, SyncRefusedError } from './room.js';
|
|
59
|
+
import { assertRoomId, beginDestroy, bindRoomProtocol, tabs, chunkFrame, CLOSE, createChunkReader, emitFailed, initLifecycle, isRefusal, LOCAL_PRESENCE_LOSS, markSynced, messageAuth, messageChunk, messageComments, messageSaved, messageSync, MAX_FRAME_BYTES, SyncRefusedError } from './room.js';
|
|
61
60
|
import { asEngineDoc } from '../structs.js';
|
|
62
61
|
import { ATTRIBUTION_ROOT } from '../schema.js';
|
|
63
62
|
import { ATTRIBUTION_ORIGIN } from '../attribution/attribution.js';
|
|
@@ -95,7 +94,7 @@ export const bindWebsocketProvider = (Y) => {
|
|
|
95
94
|
/** Traffic for the other tabs goes out on the channel. */
|
|
96
95
|
const toTabs = (provider, buf) => {
|
|
97
96
|
if (provider.bcconnected)
|
|
98
|
-
|
|
97
|
+
tabs.publish(provider.bcChannel, buf, provider);
|
|
99
98
|
};
|
|
100
99
|
/** Room traffic goes to the server and to the other tabs. */
|
|
101
100
|
const broadcast = (provider, buf) => {
|
package/dist/crdt/purge.d.ts
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* held), a text delete mark record, a placement candidate.
|
|
14
14
|
*/
|
|
15
15
|
import type { EngineApi, EngineDoc } from './engine-api.js';
|
|
16
|
-
import type
|
|
17
|
-
import type
|
|
16
|
+
import { type PlacementModel } from './placement/model.js';
|
|
17
|
+
import { type TextEngine } from './text/model.js';
|
|
18
18
|
/** The horizon: the time and encoded state vector of the room's epoch (`room.purge.timing`). */
|
|
19
19
|
export type Horizon = {
|
|
20
20
|
at: number;
|
package/dist/crdt/purge.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { view as modelView } from './placement/model.js';
|
|
2
|
+
import { purgeStreams } from './text/model.js';
|
|
1
3
|
import { AT, BLOCK_ATTR_ROOT, DATA, DATA_LEAF_PREFIX, DEL_PREFIX, HORIZON_ATTR, HORIZON_ROOT, isNodeLike, REC_PREFIX, REGISTRY_KEY, WITHDRAW_PREFIX } from './schema.js';
|
|
2
4
|
import { bindDeletes } from './text/deletes.js';
|
|
5
|
+
import { deleteIndex } from './text/delete-index.js';
|
|
3
6
|
import { baseIdOf, isIncarnationId } from './incarnations.js';
|
|
4
7
|
import { attrItems, firstItem } from './structs.js';
|
|
5
8
|
const mapOf = (node) => attrItems(node);
|
|
@@ -12,14 +15,74 @@ export const readHorizon = (doc) => {
|
|
|
12
15
|
};
|
|
13
16
|
export const bindPurge = (Y) => {
|
|
14
17
|
const D = bindDeletes(Y);
|
|
18
|
+
const { rootSpans, holders, dropMarks, recordsIn, copiesOf, liveRoots, forget, collect } = deleteIndex(Y);
|
|
19
|
+
/**
|
|
20
|
+
* Whether every live mark holding a character of `spans` was written
|
|
21
|
+
* where `old` says (a withdrawn block's content was deleted
|
|
22
|
+
* before the horizon). Characters no mark holds count as old.
|
|
23
|
+
*/
|
|
24
|
+
const heldBefore = (doc, spans, old) => {
|
|
25
|
+
const s = D.state(doc);
|
|
26
|
+
return spans
|
|
27
|
+
.flatMap((sp) => rootSpans(s, sp))
|
|
28
|
+
.every((r) => holders(s, r).every((mark) => old(mark.client, mark.clock)));
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The text's part (`room.purge.what`), inside the purge
|
|
32
|
+
* transaction: delete every text delete mark record `old` names, and
|
|
33
|
+
* every restoration record `old` names whose copies are all deleted
|
|
34
|
+
* and that no remaining mark holds; its copies are forgotten (the
|
|
35
|
+
* `gcFilter` no longer keeps them) and collected. Writes no mark.
|
|
36
|
+
*/
|
|
37
|
+
const purgeText = (doc, old) => {
|
|
38
|
+
const s = D.state(doc);
|
|
39
|
+
const tr = s.doc._transaction;
|
|
40
|
+
if (tr === null)
|
|
41
|
+
throw new Error('purge: outside a transaction');
|
|
42
|
+
const spans = [];
|
|
43
|
+
const dropped = [];
|
|
44
|
+
for (let it = firstItem(s.marks); it; it = it.right)
|
|
45
|
+
if (!it.deleted)
|
|
46
|
+
for (let j = 0; j < it.length; j++) {
|
|
47
|
+
const r = { client: it.id.client, clock: it.id.clock + j };
|
|
48
|
+
if (!old(r.client, r.clock))
|
|
49
|
+
continue;
|
|
50
|
+
dropped.push(r);
|
|
51
|
+
const last = spans[spans.length - 1];
|
|
52
|
+
if (last !== undefined && last.c === r.client && last.k + last.n === r.clock)
|
|
53
|
+
last.n++;
|
|
54
|
+
else
|
|
55
|
+
spans.push({ c: r.client, k: r.clock, n: 1 });
|
|
56
|
+
}
|
|
57
|
+
dropMarks(s, dropped);
|
|
58
|
+
const marks = dropped.length;
|
|
59
|
+
D.remove(tr, spans);
|
|
60
|
+
const doomed = [];
|
|
61
|
+
attrItems(s.restored).forEach((it, key) => {
|
|
62
|
+
if (it.deleted || !old(it.id.client, it.id.clock))
|
|
63
|
+
return;
|
|
64
|
+
const [record, bytes] = recordsIn(it, null)[0] ?? [];
|
|
65
|
+
if (bytes === undefined)
|
|
66
|
+
return;
|
|
67
|
+
const copies = copiesOf(record, bytes);
|
|
68
|
+
const dead = copies.every((e) => liveRoots(s, { c: e.c, k: e.k, n: e.n, rk: e.k }).length === 0 &&
|
|
69
|
+
holders(s, { c: e.rc, k: e.rk, n: e.n }).length === 0);
|
|
70
|
+
if (dead)
|
|
71
|
+
doomed.push({ key, copies });
|
|
72
|
+
});
|
|
73
|
+
for (const { key, copies } of doomed) {
|
|
74
|
+
s.restored.deleteAttr(key);
|
|
75
|
+
forget(s, copies);
|
|
76
|
+
collect(s, tr, copies);
|
|
77
|
+
}
|
|
78
|
+
return { marks, records: doomed.length };
|
|
79
|
+
};
|
|
15
80
|
/**
|
|
16
81
|
* Purge from `doc` (through `facade`, the facade over it) what was
|
|
17
82
|
* deleted before `horizon`, and write the horizon record. Runs inside the
|
|
18
83
|
* caller's transaction.
|
|
19
84
|
*/
|
|
20
85
|
const purge = (doc, facade, horizon) => {
|
|
21
|
-
const M = facade.model;
|
|
22
|
-
const T = facade.text;
|
|
23
86
|
const report = {
|
|
24
87
|
removed: 0,
|
|
25
88
|
emptied: 0,
|
|
@@ -32,7 +95,7 @@ export const bindPurge = (Y) => {
|
|
|
32
95
|
const vector = Y.decodeStateVector(horizon.sv);
|
|
33
96
|
const old = (client, clock) => clock < (vector.get(client) ?? 0);
|
|
34
97
|
const oldItem = (item) => item !== undefined && !item.deleted && old(item.id.client, item.id.clock);
|
|
35
|
-
const view =
|
|
98
|
+
const view = modelView(doc);
|
|
36
99
|
const { blocks, own, placements } = view;
|
|
37
100
|
const marks = (node, prefix) => [...node.attrKeys()]
|
|
38
101
|
.filter((key) => key.startsWith(prefix))
|
|
@@ -93,7 +156,7 @@ export const bindPurge = (Y) => {
|
|
|
93
156
|
if (dead.has(id))
|
|
94
157
|
continue;
|
|
95
158
|
const s = own.streamOf(id);
|
|
96
|
-
if (s !== undefined && !
|
|
159
|
+
if (s !== undefined && !heldBefore(doc, regionSpans(s), old))
|
|
97
160
|
continue;
|
|
98
161
|
const left = (children.get(id) ?? []).every((child) => {
|
|
99
162
|
const rec = blocks.get(child);
|
|
@@ -157,7 +220,7 @@ export const bindPurge = (Y) => {
|
|
|
157
220
|
// A deleted block that stays: its stream's text (boundaries kept), its
|
|
158
221
|
// data leaves and its claims.
|
|
159
222
|
const emptied = [...dead].filter((id) => !removable.has(id));
|
|
160
|
-
|
|
223
|
+
purgeStreams(emptied.flatMap((id) => {
|
|
161
224
|
const s = own.streamOf(id);
|
|
162
225
|
return s === undefined || s.end - s.start <= s.inert.length ? [] : [s];
|
|
163
226
|
}));
|
|
@@ -250,7 +313,7 @@ export const bindPurge = (Y) => {
|
|
|
250
313
|
report.candidates += rec.cands.length - 1;
|
|
251
314
|
}
|
|
252
315
|
// Text delete marks and restoration records past the horizon.
|
|
253
|
-
const text =
|
|
316
|
+
const text = purgeText(doc, old);
|
|
254
317
|
report.marks = text.marks;
|
|
255
318
|
report.records = text.records;
|
|
256
319
|
// The horizon record, last.
|
|
@@ -40,52 +40,14 @@
|
|
|
40
40
|
* (`table.range`);
|
|
41
41
|
* - the plan's `at` is where the caret lands (`del.range.caret`).
|
|
42
42
|
*/
|
|
43
|
-
import type { BlockId
|
|
44
|
-
import type {
|
|
43
|
+
import type { BlockId } from './placement/model.js';
|
|
44
|
+
import type { Prepared } from './edytor-doc.js';
|
|
45
|
+
import type { OpsContext } from './doc/steps.js';
|
|
45
46
|
/** A position in one document version: a block and a display offset. */
|
|
46
47
|
export type DocPosition = {
|
|
47
48
|
block: BlockId;
|
|
48
49
|
offset: number;
|
|
49
50
|
};
|
|
50
|
-
/** What range deletion reads from the document and the step writers it composes. */
|
|
51
|
-
export type RangeDeleteContext = {
|
|
52
|
-
ref: (id: BlockId) => BlockId;
|
|
53
|
-
refused: Prepared;
|
|
54
|
-
plan: (ids: readonly BlockId[], writes: PlanStep[]) => Plan;
|
|
55
|
-
order: () => {
|
|
56
|
-
ids: readonly BlockId[];
|
|
57
|
-
at: ReadonlyMap<BlockId, number>;
|
|
58
|
-
};
|
|
59
|
-
positionOf: (id: BlockId) => Destination | null;
|
|
60
|
-
/** Display ancestors, nearest first (the root excluded). */
|
|
61
|
-
ancestorsOf: (id: BlockId) => BlockId[];
|
|
62
|
-
childrenIds: (parent: BlockId | null) => BlockId[];
|
|
63
|
-
displayLength: (id: BlockId) => number;
|
|
64
|
-
/** Live, with its own content node. */
|
|
65
|
-
contentTarget: (id: BlockId) => boolean;
|
|
66
|
-
rendersContent: (id: BlockId) => boolean;
|
|
67
|
-
canMerge: (from: BlockId, into: BlockId) => boolean;
|
|
68
|
-
isIsland: (id: BlockId) => boolean;
|
|
69
|
-
/** An island declared `lines` (a code block): it holds only lines. */
|
|
70
|
-
isLines: (id: BlockId) => boolean;
|
|
71
|
-
move: (ids: BlockId[], parent: BlockId | null, index: number) => PlanStep[];
|
|
72
|
-
/** A block that shows only its children: a list, a table row, a column. */
|
|
73
|
-
isContainer: (id: BlockId) => boolean;
|
|
74
|
-
/** A container that goes once it loses every child (it holds no text of its own). */
|
|
75
|
-
emptiable: (id: BlockId) => boolean;
|
|
76
|
-
/** The kind steps for `from`'s children `kids` landing under `parent` (island and container rules). */
|
|
77
|
-
settle: (from: BlockId | null, kids: readonly BlockId[], parent: BlockId | null) => PlanStep[];
|
|
78
|
-
remove: (id: BlockId, kept: readonly BlockId[]) => PlanStep;
|
|
79
|
-
/**
|
|
80
|
-
* The steps that dissolve each layout the plan leaves with one item or
|
|
81
|
-
* none (`layout.dissolving`): `gone` it removes, `leaving` it moves.
|
|
82
|
-
*/
|
|
83
|
-
dissolving: (gone: readonly BlockId[], leaving: readonly BlockId[], writes: readonly PlanStep[]) => PlanStep[];
|
|
84
|
-
/** The table `id` is, or whose row or cell it is; `null` for any other block (`table.*`). */
|
|
85
|
-
tableOf: (id: BlockId) => BlockId | null;
|
|
86
|
-
/** `id` is a table's cell. */
|
|
87
|
-
isTableCell: (id: BlockId) => boolean;
|
|
88
|
-
};
|
|
89
51
|
/**
|
|
90
52
|
* What the view knows of a range (view state the document does not hold):
|
|
91
53
|
* whether it hides a block, and, given `removed`, whether the block stays
|
|
@@ -95,7 +57,7 @@ export type RangeView = {
|
|
|
95
57
|
hidden?: (id: BlockId, removed?: ReadonlySet<BlockId>) => boolean;
|
|
96
58
|
};
|
|
97
59
|
/** `deleteRange` and `replaceRange` (the head kept), prepared. */
|
|
98
|
-
export declare const rangeDeleteOps: (c:
|
|
60
|
+
export declare const rangeDeleteOps: (c: OpsContext) => {
|
|
99
61
|
deleteRange: (from: DocPosition, to: DocPosition, view?: RangeView) => Prepared;
|
|
100
62
|
replaceRange: (from: DocPosition, to: DocPosition, view?: RangeView) => Prepared;
|
|
101
63
|
};
|
package/dist/crdt/rangeDelete.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ref } from './doc/plan.js';
|
|
1
2
|
/** `deleteRange` and `replaceRange` (the head kept), prepared. */
|
|
2
3
|
export const rangeDeleteOps = (c) => {
|
|
3
4
|
// `headSpent`: a whole-doc retry keeps the head, but what it hid goes as if it went.
|
|
@@ -5,14 +6,14 @@ export const rangeDeleteOps = (c) => {
|
|
|
5
6
|
// A position names shown text: a live block that renders its own content.
|
|
6
7
|
const holds = (id) => c.contentTarget(id) && c.rendersContent(id);
|
|
7
8
|
const pos = (p) => {
|
|
8
|
-
const block =
|
|
9
|
+
const block = ref(p.block);
|
|
9
10
|
const len = holds(block) ? c.displayLength(block) : -1;
|
|
10
11
|
return { block, offset: Math.max(0, Math.min(p.offset, len)) };
|
|
11
12
|
};
|
|
12
13
|
let [s, e] = [pos(from), pos(to)];
|
|
13
14
|
if (!holds(s.block) || !holds(e.block))
|
|
14
|
-
return c.
|
|
15
|
-
const { ids, at } = c.
|
|
15
|
+
return c.REFUSED;
|
|
16
|
+
const { ids, at } = c.view().order;
|
|
16
17
|
if (at.get(s.block) > at.get(e.block) || (s.block === e.block && s.offset > e.offset))
|
|
17
18
|
[s, e] = [e, s];
|
|
18
19
|
const S = s.block;
|
|
@@ -104,7 +105,7 @@ export const rangeDeleteOps = (c) => {
|
|
|
104
105
|
if (!doomed.has(parent(id)))
|
|
105
106
|
writes.push(c.remove(id, kept));
|
|
106
107
|
// A layout the range leaves with one column dissolves (`layout.dissolving`).
|
|
107
|
-
writes.push(...c.dissolving([...doomed, ...(merges ? [E] : [])], rescued, writes));
|
|
108
|
+
writes.push(...c.dissolving(new Set([...doomed, ...(merges ? [E] : [])]), rescued, writes));
|
|
108
109
|
const caret = (() => {
|
|
109
110
|
if (!doomed.has(S))
|
|
110
111
|
return s;
|
|
@@ -135,7 +136,7 @@ export const rangeDeleteOps = (c) => {
|
|
|
135
136
|
* come after the start in reading order); the caret lands at the start.
|
|
136
137
|
*/
|
|
137
138
|
const inTables = (s, e, view) => {
|
|
138
|
-
const { ids, at } = c.
|
|
139
|
+
const { ids, at } = c.view().order;
|
|
139
140
|
const [S, E] = [s.block, e.block];
|
|
140
141
|
const kept = new Set(c.ancestorsOf(E));
|
|
141
142
|
const between = ids.slice(at.get(S) + 1, at.get(E)).filter((id) => !view.hidden?.(id));
|
|
@@ -161,7 +162,7 @@ export const rangeDeleteOps = (c) => {
|
|
|
161
162
|
const roots = [...doomed].filter((id) => !doomed.has(parentOf(id)));
|
|
162
163
|
for (const id of roots)
|
|
163
164
|
writes.push(c.remove(id, []));
|
|
164
|
-
writes.push(...c.dissolving(roots, [], writes));
|
|
165
|
+
writes.push(...c.dissolving(new Set(roots), [], writes));
|
|
165
166
|
return { ...c.plan([S], writes), at: s };
|
|
166
167
|
};
|
|
167
168
|
return { deleteRange: prepare(false), replaceRange: prepare(true) };
|
package/dist/crdt/restore.d.ts
CHANGED
|
@@ -24,9 +24,29 @@
|
|
|
24
24
|
* 6. the document's data, patched to the snapshot's.
|
|
25
25
|
*/
|
|
26
26
|
import type { EngineDoc } from './engine-api.js';
|
|
27
|
-
import type
|
|
27
|
+
import { type BlockId, type ContentItem, type InlineSpec, type PlacementModel } from './placement/model.js';
|
|
28
28
|
import type { DataPatch } from './data.js';
|
|
29
29
|
import type { JSONDoc } from '../utils/json.js';
|
|
30
|
+
/** One display unit: a character (a code point) with its marks, or an inline atom, keyed for comparison. */
|
|
31
|
+
export type Unit = {
|
|
32
|
+
key: string;
|
|
33
|
+
item: ContentItem;
|
|
34
|
+
};
|
|
35
|
+
/** `items` one unit each (a character with its marks, or an atom), keyed for comparison. */
|
|
36
|
+
export declare const unitsOf: (items: readonly ContentItem[]) => Unit[];
|
|
37
|
+
/** The one changed stretch from `x` to `y`: `x[p, e)` became `mid`. */
|
|
38
|
+
export declare const hunk: (x: readonly Unit[], y: readonly Unit[]) => {
|
|
39
|
+
p: number;
|
|
40
|
+
e: number;
|
|
41
|
+
mid: Unit[];
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Make block `id`'s content, `have` (its units now), read `want`: the one
|
|
45
|
+
* changed stretch between their common prefix and suffix is deleted and
|
|
46
|
+
* written again through the facade (an atom without an id gets a fresh
|
|
47
|
+
* one). Whether it wrote anything.
|
|
48
|
+
*/
|
|
49
|
+
export declare const rewriteContent: <Plan>(facade: Pick<RestoreFacade<Plan>, "apply" | "prepare">, id: BlockId, have: readonly Unit[], want: readonly Unit[]) => boolean;
|
|
30
50
|
export type RestoreReport = {
|
|
31
51
|
/** Blocks revived (their delete or withdraw marks removed). */
|
|
32
52
|
revived: number;
|
package/dist/crdt/restore.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { blockNodeOf, materializeSpec, ranksAt, view as modelView, writePlacement } from './placement/model.js';
|
|
1
2
|
import { DEL_PREFIX, TYPE, WITHDRAW_PREFIX } from './schema.js';
|
|
2
|
-
import { patchWrites, writeLeaves } from './data.js';
|
|
3
|
+
import { common, patchWrites, writeLeaves } from './data.js';
|
|
3
4
|
import { canonKey } from './text/model.js';
|
|
4
5
|
import { randOf } from './rand.js';
|
|
5
6
|
import { toBlockSpec } from '../utils/json.js';
|
|
6
7
|
/** `items` one unit each (a character with its marks, or an atom), keyed for comparison. */
|
|
7
|
-
const unitsOf = (items) => {
|
|
8
|
+
export const unitsOf = (items) => {
|
|
8
9
|
const out = [];
|
|
9
10
|
for (const item of items) {
|
|
10
11
|
if (item.kind === 'inline') {
|
|
@@ -42,6 +43,47 @@ const runsOf = (units) => {
|
|
|
42
43
|
}
|
|
43
44
|
return out;
|
|
44
45
|
};
|
|
46
|
+
/** The one changed stretch from `x` to `y`: `x[p, e)` became `mid`. */
|
|
47
|
+
export const hunk = (x, y) => {
|
|
48
|
+
let p = 0;
|
|
49
|
+
while (p < x.length && p < y.length && x[p].key === y[p].key)
|
|
50
|
+
p++;
|
|
51
|
+
let q = 0;
|
|
52
|
+
while (q < x.length - p &&
|
|
53
|
+
q < y.length - p &&
|
|
54
|
+
x[x.length - 1 - q].key === y[y.length - 1 - q].key)
|
|
55
|
+
q++;
|
|
56
|
+
return { p, e: x.length - q, mid: y.slice(p, y.length - q) };
|
|
57
|
+
};
|
|
58
|
+
/** A unit's width in the block's offsets (a character's UTF-16 length; an atom counts 1). */
|
|
59
|
+
const width = (u) => (u.item.kind === 'text' ? u.item.text.length : 1);
|
|
60
|
+
/**
|
|
61
|
+
* Make block `id`'s content, `have` (its units now), read `want`: the one
|
|
62
|
+
* changed stretch between their common prefix and suffix is deleted and
|
|
63
|
+
* written again through the facade (an atom without an id gets a fresh
|
|
64
|
+
* one). Whether it wrote anything.
|
|
65
|
+
*/
|
|
66
|
+
export const rewriteContent = (facade, id, have, want) => {
|
|
67
|
+
const { p, e, mid } = hunk(have, want);
|
|
68
|
+
if (p === e && mid.length === 0)
|
|
69
|
+
return false;
|
|
70
|
+
let at = have.slice(0, p).reduce((n, u) => n + width(u), 0);
|
|
71
|
+
const gone = have.slice(p, e).reduce((n, u) => n + width(u), 0);
|
|
72
|
+
if (gone > 0)
|
|
73
|
+
facade.apply(facade.prepare.deleteText(id, at, gone));
|
|
74
|
+
for (const item of runsOf(mid)) {
|
|
75
|
+
if (item.kind === 'text') {
|
|
76
|
+
facade.apply(facade.prepare.insertText(id, at, item.text, item.marks ?? {}));
|
|
77
|
+
at += item.text.length;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const atom = { id: item.id || crypto.randomUUID(), type: item.type, data: item.data };
|
|
81
|
+
facade.apply(facade.prepare.insertInline(id, at, atom));
|
|
82
|
+
at += 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
};
|
|
45
87
|
/** Visible-tree order of `specs` with each block's snapshot parent. */
|
|
46
88
|
const walk = (specs, parent, into) => {
|
|
47
89
|
for (const spec of specs) {
|
|
@@ -50,43 +92,16 @@ const walk = (specs, parent, into) => {
|
|
|
50
92
|
}
|
|
51
93
|
return into;
|
|
52
94
|
};
|
|
53
|
-
/** The ids of `list` (positions in another order, `-1` absent) on its longest increasing run. */
|
|
54
|
-
const longestRun = (positions) => {
|
|
55
|
-
const tails = [];
|
|
56
|
-
const tailAt = [];
|
|
57
|
-
const links = new Array(positions.length).fill(-1);
|
|
58
|
-
positions.forEach((position, i) => {
|
|
59
|
-
if (position < 0)
|
|
60
|
-
return;
|
|
61
|
-
let lo = 0;
|
|
62
|
-
let hi = tails.length;
|
|
63
|
-
while (lo < hi) {
|
|
64
|
-
const mid = (lo + hi) >> 1;
|
|
65
|
-
if (tails[mid] < position)
|
|
66
|
-
lo = mid + 1;
|
|
67
|
-
else
|
|
68
|
-
hi = mid;
|
|
69
|
-
}
|
|
70
|
-
tails[lo] = position;
|
|
71
|
-
tailAt[lo] = i;
|
|
72
|
-
links[i] = lo > 0 ? tailAt[lo - 1] : -1;
|
|
73
|
-
});
|
|
74
|
-
const kept = new Set();
|
|
75
|
-
for (let i = tails.length ? tailAt[tails.length - 1] : -1; i !== -1; i = links[i])
|
|
76
|
-
kept.add(i);
|
|
77
|
-
return kept;
|
|
78
|
-
};
|
|
79
95
|
/**
|
|
80
96
|
* Make the visible document `doc` (through `facade`, the facade over it)
|
|
81
97
|
* equal `json`. Runs inside the caller's transaction; the writer is
|
|
82
98
|
* `doc.clientID`. See the module comment for what it writes.
|
|
83
99
|
*/
|
|
84
100
|
export const restoreDocument = (doc, facade, json) => {
|
|
85
|
-
const M = facade.model;
|
|
86
101
|
const report = { revived: 0, moved: 0, rewritten: 0, created: 0, deleted: 0 };
|
|
87
102
|
const specs = json.children.map((block) => toBlockSpec(block));
|
|
88
103
|
const all = walk(specs, null, new Map());
|
|
89
|
-
const node = (id) =>
|
|
104
|
+
const node = (id) => blockNodeOf(doc, id);
|
|
90
105
|
// 1 · Revive, and free every snapshot block from the claims on it.
|
|
91
106
|
for (const id of all.keys()) {
|
|
92
107
|
const n = node(id);
|
|
@@ -99,7 +114,7 @@ export const restoreDocument = (doc, facade, json) => {
|
|
|
99
114
|
report.revived++;
|
|
100
115
|
}
|
|
101
116
|
{
|
|
102
|
-
const { blocks } =
|
|
117
|
+
const { blocks } = modelView(doc);
|
|
103
118
|
for (const rec of blocks.values()) {
|
|
104
119
|
// A deleted holder's claims are void (and stay so): only the others.
|
|
105
120
|
if (rec.deleted || rec.claimsNode === undefined)
|
|
@@ -131,7 +146,8 @@ export const restoreDocument = (doc, facade, json) => {
|
|
|
131
146
|
continue;
|
|
132
147
|
const slots = facade.childSlots(parent);
|
|
133
148
|
const index = new Map(slots.map((slot, i) => [slot.id, i]));
|
|
134
|
-
|
|
149
|
+
// What a longest common run of the two orders keeps stays where it is.
|
|
150
|
+
const kept = new Set(common(slots.map((slot) => slot.id), list.map((spec) => spec.id)).map(([, j]) => j));
|
|
135
151
|
let prev;
|
|
136
152
|
list.forEach((spec, i) => {
|
|
137
153
|
if (kept.has(i)) {
|
|
@@ -148,14 +164,14 @@ export const restoreDocument = (doc, facade, json) => {
|
|
|
148
164
|
...(prev === undefined ? [] : [{ rank: prev }]),
|
|
149
165
|
...(next === undefined ? [] : [{ rank: next }])
|
|
150
166
|
];
|
|
151
|
-
const [rank] =
|
|
167
|
+
const [rank] = ranksAt(bounds, prev === undefined ? 0 : 1, 1, doc.clientID, randOf(doc));
|
|
152
168
|
const n = node(spec.id);
|
|
153
169
|
if (n === null) {
|
|
154
|
-
|
|
170
|
+
materializeSpec(doc, { ...spec, children: [] }, parent, rank);
|
|
155
171
|
report.created++;
|
|
156
172
|
}
|
|
157
173
|
else {
|
|
158
|
-
|
|
174
|
+
writePlacement(doc, n, parent, rank);
|
|
159
175
|
report.moved++;
|
|
160
176
|
}
|
|
161
177
|
prev = rank;
|
|
@@ -167,39 +183,18 @@ export const restoreDocument = (doc, facade, json) => {
|
|
|
167
183
|
let have = unitsOf(facade.contentItems(id));
|
|
168
184
|
if (have.length === want.length && have.every((u, i) => u.key === want[i].key))
|
|
169
185
|
continue;
|
|
170
|
-
const rec =
|
|
186
|
+
const rec = modelView(doc).blocks.get(id);
|
|
171
187
|
const claims = rec?.claimsNode;
|
|
172
188
|
if (claims !== undefined && claims.length > 0) {
|
|
173
189
|
claims.delete(0, claims.length);
|
|
174
190
|
have = unitsOf(facade.contentItems(id));
|
|
175
191
|
}
|
|
176
|
-
|
|
177
|
-
while (head < have.length && head < want.length && have[head].key === want[head].key)
|
|
178
|
-
head++;
|
|
179
|
-
let tail = 0;
|
|
180
|
-
while (tail < have.length - head &&
|
|
181
|
-
tail < want.length - head &&
|
|
182
|
-
have[have.length - 1 - tail].key === want[want.length - 1 - tail].key)
|
|
183
|
-
tail++;
|
|
184
|
-
const removed = have.length - head - tail;
|
|
185
|
-
if (removed > 0)
|
|
186
|
-
facade.apply(facade.prepare.deleteText(id, head, removed));
|
|
187
|
-
let at = head;
|
|
188
|
-
for (const item of runsOf(want.slice(head, want.length - tail))) {
|
|
189
|
-
if (item.kind === 'text') {
|
|
190
|
-
facade.apply(facade.prepare.insertText(id, at, item.text, item.marks ?? {}));
|
|
191
|
-
at += item.text.length;
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
facade.apply(facade.prepare.insertInline(id, at, { id: item.id, type: item.type, data: item.data }));
|
|
195
|
-
at += 1;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
192
|
+
rewriteContent(facade, id, have, want);
|
|
198
193
|
report.rewritten++;
|
|
199
194
|
}
|
|
200
195
|
// 5 · Every visible block outside the snapshot is deleted, with what it displays.
|
|
201
196
|
for (let round = 0; round < 8; round++) {
|
|
202
|
-
const view =
|
|
197
|
+
const view = modelView(doc);
|
|
203
198
|
const extra = view.order.ids.filter((id) => !all.has(id));
|
|
204
199
|
if (extra.length === 0)
|
|
205
200
|
break;
|
package/dist/crdt/schema.d.ts
CHANGED
|
@@ -50,7 +50,7 @@ export declare const INLINE_NODE = "inline";
|
|
|
50
50
|
/** Attr keys on a block node (`SCHEMA.blockAttrs`). */
|
|
51
51
|
export declare const ID = "id";
|
|
52
52
|
export declare const TYPE = "type";
|
|
53
|
-
/** A block's or atom's whole data
|
|
53
|
+
/** A block's or atom's whole data, as documents before 0.1.0-next.6 stored it: no longer read; the room's purge deletes it. */
|
|
54
54
|
export declare const DATA = "data";
|
|
55
55
|
/** A data leaf: `d/` and its path, RFC 6901 escaped (`crdt/data.ts`). */
|
|
56
56
|
export declare const DATA_LEAF_PREFIX = "d/";
|
|
@@ -91,7 +91,7 @@ export declare const AT = "at";
|
|
|
91
91
|
export declare const REC_PREFIX = "b/";
|
|
92
92
|
/** The schema generation stamped on the `meta` root (`v`) and its manifest name (`schema`). */
|
|
93
93
|
export declare const SCHEMA: {
|
|
94
|
-
readonly version:
|
|
94
|
+
readonly version: 6;
|
|
95
95
|
readonly name: "edytor-doc";
|
|
96
96
|
readonly roots: {
|
|
97
97
|
readonly registry: "blocks";
|