edytor 1.0.0-rc.2 → 1.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 +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- 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 +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- 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 +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- 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 +20 -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 +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- 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/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 +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- 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 +48 -14
- 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 +8 -13
- package/dist/crdt/data.js +30 -70
- 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 +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- 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 +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -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 +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -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/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/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- 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 +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- 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 +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- 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 +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- 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 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- 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 +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- 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/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- 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 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -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 +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- 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 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- 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 +39 -24
- package/dist/plugins/index.js +30 -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 +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- 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 +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- 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/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- 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 +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- 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 +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- 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 +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -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 +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- 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 +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- 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 +315 -126
- 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 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- 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 -447
- 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 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- 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
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
import * as math from 'lib0-v14/math'
|
|
2
|
-
import * as traits from 'lib0-v14/traits'
|
|
3
2
|
import * as encoding from 'lib0-v14/encoding'
|
|
4
3
|
import * as decoding from 'lib0-v14/decoding'
|
|
5
|
-
import * as buf from 'lib0-v14/buffer'
|
|
6
|
-
import * as rabin from 'lib0-v14/hash/rabin'
|
|
7
4
|
import * as array from 'lib0-v14/array'
|
|
8
|
-
import * as map from 'lib0-v14/map'
|
|
9
|
-
import * as s from 'lib0-v14/schema'
|
|
10
5
|
|
|
11
|
-
import { iterateStructs, findIndexSS
|
|
12
|
-
import {
|
|
13
|
-
import { IdSetDecoderV2 } from './UpdateDecoder.js'
|
|
6
|
+
import { iterateStructs, findIndexSS } from './transaction-helpers.js'
|
|
7
|
+
import { UpdateEncoder } from './UpdateEncoder.js'
|
|
14
8
|
|
|
15
9
|
/**
|
|
16
10
|
* @typedef {{ inserts: IdSet, deletes: IdSet }} ContentIds
|
|
17
11
|
*/
|
|
18
12
|
|
|
19
|
-
/**
|
|
20
|
-
* @typedef {{ inserts: IdMap<any>, deletes: IdMap<any> }} ContentMap
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
13
|
export class IdRange {
|
|
24
14
|
/**
|
|
25
15
|
* @param {number} clock
|
|
@@ -43,47 +33,8 @@ export class IdRange {
|
|
|
43
33
|
copyWith (clock, len) {
|
|
44
34
|
return new IdRange(clock, len)
|
|
45
35
|
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Helper method making this compatible with IdMap.
|
|
49
|
-
*
|
|
50
|
-
* @return {Array<ContentAttribute<any>>}
|
|
51
|
-
*/
|
|
52
|
-
get attrs () {
|
|
53
|
-
return []
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export class MaybeIdRange {
|
|
58
|
-
/**
|
|
59
|
-
* @param {number} clock
|
|
60
|
-
* @param {number} len
|
|
61
|
-
* @param {boolean} exists
|
|
62
|
-
*/
|
|
63
|
-
constructor (clock, len, exists) {
|
|
64
|
-
/**
|
|
65
|
-
* @type {number}
|
|
66
|
-
*/
|
|
67
|
-
this.clock = clock
|
|
68
|
-
/**
|
|
69
|
-
* @type {number}
|
|
70
|
-
*/
|
|
71
|
-
this.len = len
|
|
72
|
-
/**
|
|
73
|
-
* @type {boolean}
|
|
74
|
-
*/
|
|
75
|
-
this.exists = exists
|
|
76
|
-
}
|
|
77
36
|
}
|
|
78
37
|
|
|
79
|
-
/**
|
|
80
|
-
* @param {number} clock
|
|
81
|
-
* @param {number} len
|
|
82
|
-
* @param {boolean} exists
|
|
83
|
-
* @return {MaybeIdRange}
|
|
84
|
-
*/
|
|
85
|
-
export const createMaybeIdRange = (clock, len, exists) => new MaybeIdRange(clock, len, exists)
|
|
86
|
-
|
|
87
38
|
export class IdRanges {
|
|
88
39
|
/**
|
|
89
40
|
* @param {Array<IdRange>} ids
|
|
@@ -163,37 +114,8 @@ export class IdRanges {
|
|
|
163
114
|
}
|
|
164
115
|
return ids
|
|
165
116
|
}
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Test a predicate against every attribute held by these ranges. Does not mutate - see
|
|
169
|
-
* {@link AttrRanges#everyAttr}.
|
|
170
|
-
*
|
|
171
|
-
* This exists because an `IdMap` may hold `IdRanges`: {@link insertIntoIdMap}'s `src` may be an
|
|
172
|
-
* `IdSet`, and `_insertIntoIdSet` picks the container class from whichever `src` reaches a client
|
|
173
|
-
* first. For a pure `IdRanges` the loop is vacuous ({@link IdRange#attrs} is always `[]`), but it
|
|
174
|
-
* must *not* shortcut to `true`: the append branch of `_insertIntoIdSet` copies elements without
|
|
175
|
-
* checking their class, so an `IdRanges` reached by an `IdSet` first and an `IdMap` second holds
|
|
176
|
-
* real `AttrRange`s - which {@link $idMap} must still validate.
|
|
177
|
-
*
|
|
178
|
-
* @param {(attr:ContentAttribute<any>) => boolean} f
|
|
179
|
-
* @return {boolean}
|
|
180
|
-
*/
|
|
181
|
-
everyAttr (f) {
|
|
182
|
-
const ids = this._ids
|
|
183
|
-
for (let i = 0; i < ids.length; i++) {
|
|
184
|
-
const attrs = ids[i].attrs
|
|
185
|
-
if (attrs == null) continue
|
|
186
|
-
for (let j = 0; j < attrs.length; j++) {
|
|
187
|
-
if (!f(attrs[j])) return false
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
return true
|
|
191
|
-
}
|
|
192
117
|
}
|
|
193
118
|
|
|
194
|
-
/**
|
|
195
|
-
* @implements {traits.EqualityTrait}
|
|
196
|
-
*/
|
|
197
119
|
export class IdSet {
|
|
198
120
|
constructor () {
|
|
199
121
|
/**
|
|
@@ -206,17 +128,6 @@ export class IdSet {
|
|
|
206
128
|
return this.clients.size === 0
|
|
207
129
|
}
|
|
208
130
|
|
|
209
|
-
/**
|
|
210
|
-
* @param {(idrange:IdRange, client:number) => void} f
|
|
211
|
-
*/
|
|
212
|
-
forEach (f) {
|
|
213
|
-
this.clients.forEach((ranges, client) => {
|
|
214
|
-
ranges.getIds().forEach((range) => {
|
|
215
|
-
f(range, client)
|
|
216
|
-
})
|
|
217
|
-
})
|
|
218
|
-
}
|
|
219
|
-
|
|
220
131
|
/**
|
|
221
132
|
* @param {ID} id
|
|
222
133
|
* @return {boolean}
|
|
@@ -256,113 +167,6 @@ export class IdSet {
|
|
|
256
167
|
return false
|
|
257
168
|
}
|
|
258
169
|
|
|
259
|
-
/**
|
|
260
|
-
* Whether the entire range `[clock, clock+len)` of `client` is contained in this set.
|
|
261
|
-
* Allocation-free (binary search). Because `getIds()` returns maximal, merged ranges, full
|
|
262
|
-
* coverage of a range implies it lies within a single range.
|
|
263
|
-
*
|
|
264
|
-
* @param {number} client
|
|
265
|
-
* @param {number} clock
|
|
266
|
-
* @param {number} len
|
|
267
|
-
* @return {boolean}
|
|
268
|
-
*/
|
|
269
|
-
covers (client, clock, len) {
|
|
270
|
-
const dr = this.clients.get(client)
|
|
271
|
-
if (dr) {
|
|
272
|
-
const ranges = dr.getIds()
|
|
273
|
-
const index = findIndexInIdRanges(ranges, clock)
|
|
274
|
-
if (index !== null) {
|
|
275
|
-
const r = ranges[index]
|
|
276
|
-
return clock + len <= r.clock + r.len
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return false
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Total number of ids in `[clock, clock+len)` of `client` contained in this set.
|
|
284
|
-
* Allocation-free (binary search + linear scan of the overlapping ranges). Equivalent to
|
|
285
|
-
* `slice(client, clock, len).reduce((s, r) => r.exists ? s + r.len : s, 0)` without allocating.
|
|
286
|
-
*
|
|
287
|
-
* @param {number} client
|
|
288
|
-
* @param {number} clock
|
|
289
|
-
* @param {number} len
|
|
290
|
-
* @return {number}
|
|
291
|
-
*/
|
|
292
|
-
coveredLength (client, clock, len) {
|
|
293
|
-
const dr = this.clients.get(client)
|
|
294
|
-
let covered = 0
|
|
295
|
-
if (dr) {
|
|
296
|
-
const ranges = dr.getIds()
|
|
297
|
-
const end = clock + len
|
|
298
|
-
let index = findRangeStartInIdRanges(ranges, clock)
|
|
299
|
-
if (index !== null) {
|
|
300
|
-
for (; index < ranges.length; index++) {
|
|
301
|
-
const r = ranges[index]
|
|
302
|
-
if (r.clock >= end) break
|
|
303
|
-
const from = r.clock < clock ? clock : r.clock
|
|
304
|
-
const rEnd = r.clock + r.len
|
|
305
|
-
const to = rEnd > end ? end : rEnd
|
|
306
|
-
covered += to - from
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
return covered
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* Return slices of ids that exist in this idset.
|
|
315
|
-
*
|
|
316
|
-
* @param {number} client
|
|
317
|
-
* @param {number} clock
|
|
318
|
-
* @param {number} len
|
|
319
|
-
* @return {Array<MaybeIdRange>}
|
|
320
|
-
*/
|
|
321
|
-
slice (client, clock, len) {
|
|
322
|
-
const dr = this.clients.get(client)
|
|
323
|
-
/**
|
|
324
|
-
* @type {Array<MaybeIdRange>}
|
|
325
|
-
*/
|
|
326
|
-
const res = []
|
|
327
|
-
if (dr) {
|
|
328
|
-
/**
|
|
329
|
-
* @type {Array<IdRange>}
|
|
330
|
-
*/
|
|
331
|
-
const ranges = dr.getIds()
|
|
332
|
-
let index = findRangeStartInIdRanges(ranges, clock)
|
|
333
|
-
if (index !== null) {
|
|
334
|
-
let prev = null
|
|
335
|
-
while (index < ranges.length) {
|
|
336
|
-
let r = ranges[index]
|
|
337
|
-
if (r.clock < clock) {
|
|
338
|
-
r = new IdRange(clock, r.len - (clock - r.clock))
|
|
339
|
-
}
|
|
340
|
-
if (r.clock + r.len > clock + len) {
|
|
341
|
-
r = new IdRange(r.clock, clock + len - r.clock)
|
|
342
|
-
}
|
|
343
|
-
if (r.len <= 0) break
|
|
344
|
-
const prevEnd = prev != null ? prev.clock + prev.len : clock
|
|
345
|
-
if (prevEnd < r.clock) {
|
|
346
|
-
res.push(createMaybeIdRange(prevEnd, r.clock - prevEnd, false))
|
|
347
|
-
}
|
|
348
|
-
prev = r
|
|
349
|
-
res.push(createMaybeIdRange(r.clock, r.len, true))
|
|
350
|
-
index++
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
if (res.length > 0) {
|
|
355
|
-
const last = res[res.length - 1]
|
|
356
|
-
const end = last.clock + last.len
|
|
357
|
-
if (end < clock + len) {
|
|
358
|
-
res.push(createMaybeIdRange(end, clock + len - end, false))
|
|
359
|
-
}
|
|
360
|
-
} else {
|
|
361
|
-
res.push(createMaybeIdRange(clock, len, false))
|
|
362
|
-
}
|
|
363
|
-
return res
|
|
364
|
-
}
|
|
365
|
-
|
|
366
170
|
/**
|
|
367
171
|
* @param {number} client
|
|
368
172
|
* @param {number} clock
|
|
@@ -387,37 +191,10 @@ export class IdSet {
|
|
|
387
191
|
_deleteRangeFromIdSet(this, client, clock, len)
|
|
388
192
|
}
|
|
389
193
|
|
|
390
|
-
/**
|
|
391
|
-
* @param {any} other
|
|
392
|
-
*/
|
|
393
|
-
[traits.EqualityTraitSymbol] (other) {
|
|
394
|
-
return equalIdSets(this, other)
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* @param {IdSet} ds1
|
|
400
|
-
* @param {IdSet} ds2
|
|
401
|
-
*/
|
|
402
|
-
export const equalIdSets = (ds1, ds2) => {
|
|
403
|
-
if (ds1.clients.size !== ds2.clients.size) return false
|
|
404
|
-
for (const [client, _deleteItems1] of ds1.clients.entries()) {
|
|
405
|
-
const deleteItems1 = _deleteItems1.getIds()
|
|
406
|
-
const deleteItems2 = ds2.clients.get(client)?.getIds()
|
|
407
|
-
if (deleteItems2 === undefined || deleteItems1.length !== deleteItems2.length) return false
|
|
408
|
-
for (let i = 0; i < deleteItems1.length; i++) {
|
|
409
|
-
const di1 = deleteItems1[i]
|
|
410
|
-
const di2 = deleteItems2[i]
|
|
411
|
-
if (di1.clock !== di2.clock || di1.len !== di2.len) {
|
|
412
|
-
return false
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
return true
|
|
417
194
|
}
|
|
418
195
|
|
|
419
196
|
/**
|
|
420
|
-
* @param {IdSet
|
|
197
|
+
* @param {IdSet} set
|
|
421
198
|
* @param {number} client
|
|
422
199
|
* @param {number} clock
|
|
423
200
|
* @param {number} len
|
|
@@ -469,29 +246,6 @@ export const iterateStructsByIdSet = (transaction, ds, f) =>
|
|
|
469
246
|
}
|
|
470
247
|
})
|
|
471
248
|
|
|
472
|
-
/**
|
|
473
|
-
* Iterate over all structs that are mentioned by the IdSet, without spliting the items.
|
|
474
|
-
*
|
|
475
|
-
* @param {StructStore} store
|
|
476
|
-
* @param {IdSet} ds
|
|
477
|
-
* @param {(struct: GC|Item|Skip, offset:number, len:number)=>void} f
|
|
478
|
-
*/
|
|
479
|
-
export const iterateStructsByIdSetWithoutSplits = (store, ds, f) =>
|
|
480
|
-
ds.clients.forEach((idRanges, clientid) => {
|
|
481
|
-
const ranges = idRanges.getIds()
|
|
482
|
-
const structs = /** @type {Array<GC|Item>} */ (store.clients.get(clientid))
|
|
483
|
-
if (structs != null) {
|
|
484
|
-
const lastStruct = structs[structs.length - 1]
|
|
485
|
-
const nextClock = lastStruct.id.clock + lastStruct.length
|
|
486
|
-
for (let i = 0; i < ranges.length; i++) {
|
|
487
|
-
const del = ranges[i]
|
|
488
|
-
if (del.clock < nextClock) {
|
|
489
|
-
iterateStructsWithoutSplits(structs, del.clock, del.len, f)
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
})
|
|
494
|
-
|
|
495
249
|
/**
|
|
496
250
|
* @param {Array<IdRange>} dis
|
|
497
251
|
* @param {number} clock
|
|
@@ -574,9 +328,8 @@ export const mergeIdSets = idSets => {
|
|
|
574
328
|
}
|
|
575
329
|
|
|
576
330
|
/**
|
|
577
|
-
* @
|
|
578
|
-
* @param {
|
|
579
|
-
* @param {S} src
|
|
331
|
+
* @param {IdSet} dest
|
|
332
|
+
* @param {IdSet} src
|
|
580
333
|
*/
|
|
581
334
|
const _insertIntoIdSet = (dest, src) => {
|
|
582
335
|
src.clients.forEach((srcRanges, client) => {
|
|
@@ -599,44 +352,17 @@ const _insertIntoIdSet = (dest, src) => {
|
|
|
599
352
|
export const insertIntoIdSet = _insertIntoIdSet
|
|
600
353
|
|
|
601
354
|
/**
|
|
602
|
-
*
|
|
603
|
-
* no attributes ({@link IdRange#attrs} is `[]`). This is by design; {@link $idMap} tolerates it.
|
|
604
|
-
*
|
|
605
|
-
* @type {(dest: IdMap<any>, src: IdMap<any>|IdSet) => void}
|
|
606
|
-
*/
|
|
607
|
-
export const insertIntoIdMap = _insertIntoIdSet
|
|
608
|
-
|
|
609
|
-
/**
|
|
610
|
-
* @todo rename to excludeIdSet | excludeIdMap
|
|
611
|
-
*
|
|
612
|
-
* @todo dispatch on the schema rather than `instanceof IdSet`: `const isMap = set.$type ===
|
|
613
|
-
* $idMapAny`. Mind the polarity - it inverts. `instanceof IdSet` selects the "is a set" branch,
|
|
614
|
-
* `$type === $idMapAny` selects the "is a map" branch, so both ternaries below flip. Compare
|
|
615
|
-
* against `$idMapAny` (the interned tag), never `$idMap(attrs)` - that builds a fresh `s.$custom`
|
|
616
|
-
* per call, so `===` against it is always false.
|
|
617
|
-
*
|
|
618
|
-
* The reason is soundness, not speed: `instanceof` walks the prototype chain and is per-install, so
|
|
619
|
-
* an `IdSet` from a duplicate yjs install falls through to the IdMap branch and we silently build an
|
|
620
|
-
* IdMap holding IdRanges. `$type` is a single inline-cached load and stays sound across installs -
|
|
621
|
-
* the same reason `$renderer` uses `$type` over `$instanceOf`. Not a perf win either way: this runs
|
|
622
|
-
* twice per call, outside both loops.
|
|
623
|
-
*
|
|
624
|
-
* Applies equally to `_intersectSets`.
|
|
355
|
+
* @todo rename to excludeIdSet
|
|
625
356
|
*
|
|
626
357
|
* Remove all ranges from `exclude` from `ds`. The result is a fresh IdSet containing all ranges from `idSet` that are not
|
|
627
358
|
* in `exclude`.
|
|
628
359
|
*
|
|
629
|
-
* @
|
|
630
|
-
* @param {
|
|
631
|
-
* @
|
|
632
|
-
* @return {Set}
|
|
360
|
+
* @param {IdSet} set
|
|
361
|
+
* @param {IdSet} exclude
|
|
362
|
+
* @return {IdSet}
|
|
633
363
|
*/
|
|
634
364
|
export const _diffSet = (set, exclude) => {
|
|
635
|
-
|
|
636
|
-
* @type {Set}
|
|
637
|
-
*/
|
|
638
|
-
const res = /** @type {any } */ (set instanceof IdSet ? new IdSet() : new IdMap())
|
|
639
|
-
const Ranges = set instanceof IdSet ? IdRanges : AttrRanges
|
|
365
|
+
const res = new IdSet()
|
|
640
366
|
set.clients.forEach((_setRanges, client) => {
|
|
641
367
|
/**
|
|
642
368
|
* @type {Array<IdRange>}
|
|
@@ -685,8 +411,7 @@ export const _diffSet = (set, exclude) => {
|
|
|
685
411
|
resRanges.push(setRanges[i++])
|
|
686
412
|
}
|
|
687
413
|
}
|
|
688
|
-
|
|
689
|
-
if (resRanges.length > 0) res.clients.set(client, /** @type {any} */ (new Ranges(resRanges)))
|
|
414
|
+
if (resRanges.length > 0) res.clients.set(client, new IdRanges(resRanges))
|
|
690
415
|
})
|
|
691
416
|
return res
|
|
692
417
|
}
|
|
@@ -695,26 +420,17 @@ export const _diffSet = (set, exclude) => {
|
|
|
695
420
|
* Remove all ranges from `exclude` from `idSet`. The result is a fresh IdSet containing all ranges from `idSet` that are not
|
|
696
421
|
* in `exclude`.
|
|
697
422
|
*
|
|
698
|
-
* @type {(idSet: IdSet, exclude: IdSet
|
|
423
|
+
* @type {(idSet: IdSet, exclude: IdSet) => IdSet}
|
|
699
424
|
*/
|
|
700
425
|
export const diffIdSet = _diffSet
|
|
701
426
|
|
|
702
427
|
/**
|
|
703
|
-
* @
|
|
704
|
-
*
|
|
705
|
-
*
|
|
706
|
-
* @template {IdSet | IdMap<any>} SetA
|
|
707
|
-
* @template {IdSet | IdMap<any>} SetB
|
|
708
|
-
* @param {SetA} setA
|
|
709
|
-
* @param {SetB} setB
|
|
710
|
-
* @return {SetA extends IdMap<infer A> ? (SetB extends IdMap<infer B> ? IdMap<A | B> : IdMap<A>) : IdSet}
|
|
428
|
+
* @param {IdSet} setA
|
|
429
|
+
* @param {IdSet} setB
|
|
430
|
+
* @return {IdSet}
|
|
711
431
|
*/
|
|
712
432
|
export const _intersectSets = (setA, setB) => {
|
|
713
|
-
|
|
714
|
-
* @type {IdMap<any> | IdSet}
|
|
715
|
-
*/
|
|
716
|
-
const res = /** @type {any } */ (setA instanceof IdSet ? new IdSet() : new IdMap())
|
|
717
|
-
const Ranges = setA instanceof IdSet ? IdRanges : AttrRanges
|
|
433
|
+
const res = new IdSet()
|
|
718
434
|
setA.clients.forEach((_aRanges, client) => {
|
|
719
435
|
/**
|
|
720
436
|
* @type {Array<IdRange>}
|
|
@@ -731,10 +447,7 @@ export const _intersectSets = (setA, setB) => {
|
|
|
731
447
|
const clock = math.max(aRange.clock, bRange.clock)
|
|
732
448
|
const len = math.min(aRange.len - (clock - aRange.clock), bRange.len - (clock - bRange.clock))
|
|
733
449
|
if (len > 0) {
|
|
734
|
-
resRanges.push(
|
|
735
|
-
? new AttrRange(clock, len, /** @type {Array<any>} */ (aRange.attrs).concat(bRange.attrs))
|
|
736
|
-
: new IdRange(clock, len)
|
|
737
|
-
)
|
|
450
|
+
resRanges.push(new IdRange(clock, len))
|
|
738
451
|
}
|
|
739
452
|
if (aRange.clock + aRange.len < bRange.clock + bRange.len) {
|
|
740
453
|
a++
|
|
@@ -743,10 +456,9 @@ export const _intersectSets = (setA, setB) => {
|
|
|
743
456
|
}
|
|
744
457
|
}
|
|
745
458
|
}
|
|
746
|
-
|
|
747
|
-
if (resRanges.length > 0) res.clients.set(client, /** @type {any} */ (new Ranges(resRanges)))
|
|
459
|
+
if (resRanges.length > 0) res.clients.set(client, new IdRanges(resRanges))
|
|
748
460
|
})
|
|
749
|
-
return
|
|
461
|
+
return res
|
|
750
462
|
}
|
|
751
463
|
|
|
752
464
|
export const intersectSets = _intersectSets
|
|
@@ -788,7 +500,7 @@ export const createDeleteSetFromStructStore = ss => {
|
|
|
788
500
|
}
|
|
789
501
|
|
|
790
502
|
/**
|
|
791
|
-
* @param {
|
|
503
|
+
* @param {IdSetEncoder} encoder
|
|
792
504
|
* @param {IdSet} idSet
|
|
793
505
|
*
|
|
794
506
|
* @private
|
|
@@ -814,7 +526,7 @@ export const writeIdSet = (encoder, idSet) => {
|
|
|
814
526
|
}
|
|
815
527
|
|
|
816
528
|
/**
|
|
817
|
-
* @param {
|
|
529
|
+
* @param {IdSetDecoder} decoder
|
|
818
530
|
* @return {IdSet}
|
|
819
531
|
*
|
|
820
532
|
* @private
|
|
@@ -846,7 +558,7 @@ export const readIdSet = decoder => {
|
|
|
846
558
|
*/
|
|
847
559
|
|
|
848
560
|
/**
|
|
849
|
-
* @param {
|
|
561
|
+
* @param {IdSetDecoder} decoder
|
|
850
562
|
* @param {Transaction} transaction
|
|
851
563
|
* @param {StructStore} store
|
|
852
564
|
* @return {Uint8Array<ArrayBuffer>|null} Returns a v2 update containing all deletes that couldn't be applied yet; or null if all deletes were applied successfully.
|
|
@@ -906,599 +618,10 @@ export const readAndApplyDeleteSet = (decoder, transaction, store) => {
|
|
|
906
618
|
}
|
|
907
619
|
}
|
|
908
620
|
if (unappliedDS.clients.size > 0) {
|
|
909
|
-
const ds = new
|
|
621
|
+
const ds = new UpdateEncoder()
|
|
910
622
|
encoding.writeVarUint(ds.restEncoder, 0) // encode 0 structs
|
|
911
623
|
writeIdSet(ds, unappliedDS)
|
|
912
624
|
return ds.toUint8Array()
|
|
913
625
|
}
|
|
914
626
|
return null
|
|
915
627
|
}
|
|
916
|
-
|
|
917
|
-
/**
|
|
918
|
-
* @template Attrs
|
|
919
|
-
*/
|
|
920
|
-
export class AttrRange {
|
|
921
|
-
/**
|
|
922
|
-
* @param {number} clock
|
|
923
|
-
* @param {number} len
|
|
924
|
-
* @param {Array<ContentAttribute<Attrs>>} attrs
|
|
925
|
-
*/
|
|
926
|
-
constructor (clock, len, attrs) {
|
|
927
|
-
/**
|
|
928
|
-
* @readonly
|
|
929
|
-
*/
|
|
930
|
-
this.clock = clock
|
|
931
|
-
/**
|
|
932
|
-
* @readonly
|
|
933
|
-
*/
|
|
934
|
-
this.len = len
|
|
935
|
-
/**
|
|
936
|
-
* @readonly
|
|
937
|
-
*/
|
|
938
|
-
this.attrs = attrs
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
/**
|
|
942
|
-
* @param {number} clock
|
|
943
|
-
* @param {number} len
|
|
944
|
-
*/
|
|
945
|
-
copyWith (clock, len) {
|
|
946
|
-
return new AttrRange(clock, len, this.attrs)
|
|
947
|
-
}
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
/**
|
|
951
|
-
* @todo rename this to `Attribute`
|
|
952
|
-
* @template V
|
|
953
|
-
*/
|
|
954
|
-
export class ContentAttribute {
|
|
955
|
-
/**
|
|
956
|
-
* @param {string} name
|
|
957
|
-
* @param {V} val
|
|
958
|
-
*/
|
|
959
|
-
constructor (name, val) {
|
|
960
|
-
this.name = name
|
|
961
|
-
this.val = val
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
hash () {
|
|
965
|
-
const encoder = encoding.createEncoder()
|
|
966
|
-
encoding.writeVarString(encoder, this.name)
|
|
967
|
-
encoding.writeAny(encoder, /** @type {any} */ (this.val))
|
|
968
|
-
return buf.toBase64(rabin.fingerprint(rabin.StandardIrreducible128, encoding.toUint8Array(encoder)))
|
|
969
|
-
}
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
/**
|
|
973
|
-
* @template V
|
|
974
|
-
* @param {string} name
|
|
975
|
-
* @param {V} val
|
|
976
|
-
* @return {ContentAttribute<V>}
|
|
977
|
-
*/
|
|
978
|
-
export const createContentAttribute = (name, val) => new ContentAttribute(name, val)
|
|
979
|
-
|
|
980
|
-
/**
|
|
981
|
-
* @template Attrs
|
|
982
|
-
* @typedef {{ clock: number, len: number, attrs: Array<ContentAttribute<Attrs>>? }} MaybeAttrRange
|
|
983
|
-
*/
|
|
984
|
-
|
|
985
|
-
/**
|
|
986
|
-
* @template Attrs
|
|
987
|
-
*
|
|
988
|
-
* @param {number} clock
|
|
989
|
-
* @param {number} len
|
|
990
|
-
* @param {Array<ContentAttribute<Attrs>>?} attrs
|
|
991
|
-
* @return {MaybeAttrRange<Attrs>}
|
|
992
|
-
*/
|
|
993
|
-
export const createMaybeAttrRange = (clock, len, attrs) => new AttrRange(clock, len, /** @type {any} */ (attrs))
|
|
994
|
-
|
|
995
|
-
/**
|
|
996
|
-
* @template T
|
|
997
|
-
* @param {Array<T>} a
|
|
998
|
-
* @param {Array<T>} b
|
|
999
|
-
*/
|
|
1000
|
-
const idmapAttrRangeJoin = (a, b) => a.concat(b.filter(attr => !idmapAttrsHas(a, attr)))
|
|
1001
|
-
|
|
1002
|
-
/**
|
|
1003
|
-
* Whenever this is instantiated, it must receive a fresh array of ops, not something copied.
|
|
1004
|
-
*
|
|
1005
|
-
* @template Attrs
|
|
1006
|
-
*/
|
|
1007
|
-
export class AttrRanges {
|
|
1008
|
-
/**
|
|
1009
|
-
* @param {Array<AttrRange<Attrs>>} ids
|
|
1010
|
-
*/
|
|
1011
|
-
constructor (ids) {
|
|
1012
|
-
this.sorted = false
|
|
1013
|
-
/**
|
|
1014
|
-
* @private
|
|
1015
|
-
*/
|
|
1016
|
-
this._ids = ids
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
|
-
copy () {
|
|
1020
|
-
const cpy = new AttrRanges(this._ids.slice())
|
|
1021
|
-
cpy.sorted = this.sorted
|
|
1022
|
-
return cpy
|
|
1023
|
-
}
|
|
1024
|
-
|
|
1025
|
-
/**
|
|
1026
|
-
* @param {number} clock
|
|
1027
|
-
* @param {number} length
|
|
1028
|
-
* @param {Array<ContentAttribute<Attrs>>} attrs
|
|
1029
|
-
*/
|
|
1030
|
-
add (clock, length, attrs) {
|
|
1031
|
-
if (length === 0) return
|
|
1032
|
-
this.sorted = false
|
|
1033
|
-
this._ids.push(new AttrRange(clock, length, attrs))
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
/**
|
|
1037
|
-
* Return the list of id ranges, sorted and merged.
|
|
1038
|
-
*/
|
|
1039
|
-
getIds () {
|
|
1040
|
-
const ids = this._ids
|
|
1041
|
-
if (!this.sorted) {
|
|
1042
|
-
this.sorted = true
|
|
1043
|
-
ids.sort((a, b) => a.clock - b.clock)
|
|
1044
|
-
/**
|
|
1045
|
-
* algorithm thoughts:
|
|
1046
|
-
* - sort (by clock AND by length), bigger length is to the right (or not, we can't make
|
|
1047
|
-
* assumptions abouth length after long length has been split)
|
|
1048
|
-
* -- maybe better: sort by clock+length. Then split items from right to left. This way, items are always
|
|
1049
|
-
* in the right order. But I also need to swap if left items is smaller after split
|
|
1050
|
-
* --- thought: there is no way to go around swapping. Unless, for each item from left to
|
|
1051
|
-
* right, when I have to split because one of the look-ahead items is overlapping, i split
|
|
1052
|
-
* it and merge the attributes into the following ones (that I also need to split). Best is
|
|
1053
|
-
* probably left to right with lookahead.
|
|
1054
|
-
* - left to right, split overlapping items so that we can make the assumption that either an
|
|
1055
|
-
* item is overlapping with the next 1-on-1 or it is not overlapping at all (when splitting,
|
|
1056
|
-
* we can already incorporate the attributes)
|
|
1057
|
-
* -- better: for each item, go left to right and add own attributes to overlapping items.
|
|
1058
|
-
* Split them if necessary. After split, i must insert the retainer at a valid position.
|
|
1059
|
-
* - merge items if neighbor has same attributes
|
|
1060
|
-
*/
|
|
1061
|
-
for (let i = 0; i < ids.length - 1;) {
|
|
1062
|
-
const range = ids[i]
|
|
1063
|
-
const nextRange = ids[i + 1]
|
|
1064
|
-
// find out how to split range. it must match with next range.
|
|
1065
|
-
// 1) we have space. Split if necessary.
|
|
1066
|
-
// 2) concat attributes in range to the next range. Split range and splice the remainder at
|
|
1067
|
-
// the correct position.
|
|
1068
|
-
if (range.clock < nextRange.clock) { // might need to split range
|
|
1069
|
-
if (range.clock + range.len > nextRange.clock) {
|
|
1070
|
-
// is overlapping
|
|
1071
|
-
const diff = nextRange.clock - range.clock
|
|
1072
|
-
ids[i] = new AttrRange(range.clock, diff, range.attrs)
|
|
1073
|
-
ids.splice(i + 1, 0, new AttrRange(nextRange.clock, range.len - diff, range.attrs))
|
|
1074
|
-
}
|
|
1075
|
-
i++
|
|
1076
|
-
continue
|
|
1077
|
-
}
|
|
1078
|
-
// now we know that range.clock === nextRange.clock
|
|
1079
|
-
// merge range with nextRange
|
|
1080
|
-
const largerRange = range.len > nextRange.len ? range : nextRange
|
|
1081
|
-
const smallerLen = range.len < nextRange.len ? range.len : nextRange.len
|
|
1082
|
-
ids[i] = new AttrRange(range.clock, smallerLen, idmapAttrRangeJoin(range.attrs, nextRange.attrs))
|
|
1083
|
-
if (range.len === nextRange.len) {
|
|
1084
|
-
ids.splice(i + 1, 1)
|
|
1085
|
-
} else {
|
|
1086
|
-
ids[i + 1] = new AttrRange(range.clock + smallerLen, largerRange.len - smallerLen, largerRange.attrs)
|
|
1087
|
-
array.bubblesortItem(ids, i + 1, (a, b) => a.clock - b.clock)
|
|
1088
|
-
}
|
|
1089
|
-
if (smallerLen === 0) i++
|
|
1090
|
-
}
|
|
1091
|
-
while (ids.length > 0 && ids[0].len === 0) {
|
|
1092
|
-
ids.splice(0, 1)
|
|
1093
|
-
}
|
|
1094
|
-
// merge items without filtering or splicing the array.
|
|
1095
|
-
// i is the current pointer
|
|
1096
|
-
// j refers to the current insert position for the pointed item
|
|
1097
|
-
// try to merge dels[i] into dels[j-1] or set dels[j]=dels[i]
|
|
1098
|
-
let i, j
|
|
1099
|
-
for (i = 1, j = 1; i < ids.length; i++) {
|
|
1100
|
-
const left = ids[j - 1]
|
|
1101
|
-
const right = ids[i]
|
|
1102
|
-
if (left.clock + left.len === right.clock && idmapAttrsEqual(left.attrs, right.attrs)) {
|
|
1103
|
-
ids[j - 1] = new AttrRange(left.clock, left.len + right.len, left.attrs)
|
|
1104
|
-
} else if (right.len !== 0) {
|
|
1105
|
-
if (j < i) {
|
|
1106
|
-
ids[j] = right
|
|
1107
|
-
}
|
|
1108
|
-
j++
|
|
1109
|
-
}
|
|
1110
|
-
}
|
|
1111
|
-
ids.length = ids.length === 0 ? 0 : (ids[j - 1].len === 0 ? j - 1 : j)
|
|
1112
|
-
}
|
|
1113
|
-
return ids
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
/**
|
|
1117
|
-
* Test a predicate against every attribute held by these ranges.
|
|
1118
|
-
*
|
|
1119
|
-
* Unlike {@link AttrRanges#getIds} this does **not** sort/merge - i.e. it does not mutate its
|
|
1120
|
-
* receiver, which matters because it backs {@link $idMap}`.check`. The *set* of attributes is
|
|
1121
|
-
* invariant under sorting/merging (merging only ever concatenates existing attr arrays), so this
|
|
1122
|
-
* observes exactly the attributes that `getIds()` would expose.
|
|
1123
|
-
*
|
|
1124
|
-
* @param {(attr:ContentAttribute<Attrs>) => boolean} f
|
|
1125
|
-
* @return {boolean}
|
|
1126
|
-
*/
|
|
1127
|
-
everyAttr (f) {
|
|
1128
|
-
const ids = this._ids
|
|
1129
|
-
for (let i = 0; i < ids.length; i++) {
|
|
1130
|
-
const attrs = ids[i].attrs
|
|
1131
|
-
// only `createMaybeAttrRange` yields null attrs, never `clients` - defensive
|
|
1132
|
-
if (attrs == null) continue
|
|
1133
|
-
for (let j = 0; j < attrs.length; j++) {
|
|
1134
|
-
if (!f(attrs[j])) return false
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
return true
|
|
1138
|
-
}
|
|
1139
|
-
}
|
|
1140
|
-
|
|
1141
|
-
/**
|
|
1142
|
-
* @template Attrs
|
|
1143
|
-
*/
|
|
1144
|
-
export class IdMap {
|
|
1145
|
-
constructor () {
|
|
1146
|
-
/**
|
|
1147
|
-
* @type {Map<number,AttrRanges<Attrs>>}
|
|
1148
|
-
*/
|
|
1149
|
-
this.clients = new Map()
|
|
1150
|
-
/**
|
|
1151
|
-
* @type {Map<string, ContentAttribute<Attrs>>}
|
|
1152
|
-
*/
|
|
1153
|
-
this.attrsH = new Map()
|
|
1154
|
-
/**
|
|
1155
|
-
* @type {Set<ContentAttribute<Attrs>>}
|
|
1156
|
-
*/
|
|
1157
|
-
this.attrs = new Set()
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
/**
|
|
1161
|
-
* @param {(attrRange:AttrRange<Attrs>, client:number) => void} f
|
|
1162
|
-
*/
|
|
1163
|
-
forEach (f) {
|
|
1164
|
-
this.clients.forEach((ranges, client) => {
|
|
1165
|
-
ranges.getIds().forEach((range) => {
|
|
1166
|
-
f(range, client)
|
|
1167
|
-
})
|
|
1168
|
-
})
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
isEmpty () {
|
|
1172
|
-
return this.clients.size === 0
|
|
1173
|
-
}
|
|
1174
|
-
|
|
1175
|
-
/**
|
|
1176
|
-
* @param {ID} id
|
|
1177
|
-
* @return {boolean}
|
|
1178
|
-
*/
|
|
1179
|
-
hasId (id) {
|
|
1180
|
-
return this.has(id.client, id.clock)
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
/**
|
|
1184
|
-
* @param {number} client
|
|
1185
|
-
* @param {number} clock
|
|
1186
|
-
* @return {boolean}
|
|
1187
|
-
*/
|
|
1188
|
-
has (client, clock) {
|
|
1189
|
-
const dr = this.clients.get(client)
|
|
1190
|
-
if (dr) {
|
|
1191
|
-
return findIndexInIdRanges(dr.getIds(), clock) !== null
|
|
1192
|
-
}
|
|
1193
|
-
return false
|
|
1194
|
-
}
|
|
1195
|
-
|
|
1196
|
-
/**
|
|
1197
|
-
* Total number of ids in `[clock, clock+len)` of `client` contained in this map (i.e. carrying
|
|
1198
|
-
* an attribution, incl. an empty `[]`). Allocation-free (binary search + linear scan).
|
|
1199
|
-
* Equivalent to `slice(client, clock, len).reduce((s, r) => r.attrs != null ? s + r.len : s, 0)`
|
|
1200
|
-
* without allocating.
|
|
1201
|
-
*
|
|
1202
|
-
* @param {number} client
|
|
1203
|
-
* @param {number} clock
|
|
1204
|
-
* @param {number} len
|
|
1205
|
-
* @return {number}
|
|
1206
|
-
*/
|
|
1207
|
-
coveredLength (client, clock, len) {
|
|
1208
|
-
const dr = this.clients.get(client)
|
|
1209
|
-
let covered = 0
|
|
1210
|
-
if (dr) {
|
|
1211
|
-
const ranges = dr.getIds()
|
|
1212
|
-
const end = clock + len
|
|
1213
|
-
let index = findRangeStartInIdRanges(ranges, clock)
|
|
1214
|
-
if (index !== null) {
|
|
1215
|
-
for (; index < ranges.length; index++) {
|
|
1216
|
-
const r = ranges[index]
|
|
1217
|
-
if (r.clock >= end) break
|
|
1218
|
-
const from = r.clock < clock ? clock : r.clock
|
|
1219
|
-
const rEnd = r.clock + r.len
|
|
1220
|
-
const to = rEnd > end ? end : rEnd
|
|
1221
|
-
covered += to - from
|
|
1222
|
-
}
|
|
1223
|
-
}
|
|
1224
|
-
}
|
|
1225
|
-
return covered
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
/**
|
|
1229
|
-
* Return attributions for a slice of ids.
|
|
1230
|
-
*
|
|
1231
|
-
* @param {ID} id
|
|
1232
|
-
* @param {number} len
|
|
1233
|
-
* @return {Array<MaybeAttrRange<Attrs>>}
|
|
1234
|
-
*/
|
|
1235
|
-
sliceId (id, len) {
|
|
1236
|
-
return this.slice(id.client, id.clock, len)
|
|
1237
|
-
}
|
|
1238
|
-
|
|
1239
|
-
/**
|
|
1240
|
-
* Return attributions for a slice of ids.
|
|
1241
|
-
*
|
|
1242
|
-
* @param {number} client
|
|
1243
|
-
* @param {number} clock
|
|
1244
|
-
* @param {number} len
|
|
1245
|
-
* @return {Array<MaybeAttrRange<Attrs>>}
|
|
1246
|
-
*/
|
|
1247
|
-
slice (client, clock, len) {
|
|
1248
|
-
const dr = this.clients.get(client)
|
|
1249
|
-
/**
|
|
1250
|
-
* @type {Array<MaybeAttrRange<Attrs>>}
|
|
1251
|
-
*/
|
|
1252
|
-
const res = []
|
|
1253
|
-
if (dr) {
|
|
1254
|
-
/**
|
|
1255
|
-
* @type {Array<AttrRange<Attrs>>}
|
|
1256
|
-
*/
|
|
1257
|
-
const ranges = dr.getIds()
|
|
1258
|
-
let index = findRangeStartInIdRanges(ranges, clock)
|
|
1259
|
-
if (index !== null) {
|
|
1260
|
-
let prev = null
|
|
1261
|
-
while (index < ranges.length) {
|
|
1262
|
-
let r = ranges[index]
|
|
1263
|
-
if (r.clock < clock) {
|
|
1264
|
-
r = new AttrRange(clock, r.len - (clock - r.clock), r.attrs)
|
|
1265
|
-
}
|
|
1266
|
-
if (r.clock + r.len > clock + len) {
|
|
1267
|
-
r = new AttrRange(r.clock, clock + len - r.clock, r.attrs)
|
|
1268
|
-
}
|
|
1269
|
-
if (r.len <= 0) break
|
|
1270
|
-
const prevEnd = prev != null ? prev.clock + prev.len : clock
|
|
1271
|
-
if (prevEnd < r.clock) {
|
|
1272
|
-
res.push(createMaybeAttrRange(prevEnd, r.clock - prevEnd, null))
|
|
1273
|
-
}
|
|
1274
|
-
prev = r
|
|
1275
|
-
res.push(r)
|
|
1276
|
-
index++
|
|
1277
|
-
}
|
|
1278
|
-
}
|
|
1279
|
-
}
|
|
1280
|
-
if (res.length > 0) {
|
|
1281
|
-
const last = res[res.length - 1]
|
|
1282
|
-
const end = last.clock + last.len
|
|
1283
|
-
if (end < clock + len) {
|
|
1284
|
-
res.push(createMaybeAttrRange(end, clock + len - end, null))
|
|
1285
|
-
}
|
|
1286
|
-
} else {
|
|
1287
|
-
res.push(createMaybeAttrRange(clock, len, null))
|
|
1288
|
-
}
|
|
1289
|
-
return res
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
|
-
/**
|
|
1293
|
-
* @param {number} client
|
|
1294
|
-
* @param {number} clock
|
|
1295
|
-
* @param {number} len
|
|
1296
|
-
* @param {Array<ContentAttribute<Attrs>>} attrs
|
|
1297
|
-
*/
|
|
1298
|
-
add (client, clock, len, attrs) {
|
|
1299
|
-
if (len === 0) return
|
|
1300
|
-
attrs = _ensureAttrs(this, attrs)
|
|
1301
|
-
const ranges = this.clients.get(client)
|
|
1302
|
-
if (ranges == null) {
|
|
1303
|
-
this.clients.set(client, new AttrRanges([new AttrRange(clock, len, attrs)]))
|
|
1304
|
-
} else {
|
|
1305
|
-
ranges.add(clock, len, attrs)
|
|
1306
|
-
}
|
|
1307
|
-
}
|
|
1308
|
-
|
|
1309
|
-
/**
|
|
1310
|
-
* @param {number} client
|
|
1311
|
-
* @param {number} clock
|
|
1312
|
-
* @param {number} len
|
|
1313
|
-
*/
|
|
1314
|
-
delete (client, clock, len) {
|
|
1315
|
-
_deleteRangeFromIdSet(this, client, clock, len)
|
|
1316
|
-
}
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
/**
|
|
1320
|
-
* @template T
|
|
1321
|
-
* @param {Array<T>} attrs
|
|
1322
|
-
* @param {T} attr
|
|
1323
|
-
*
|
|
1324
|
-
*/
|
|
1325
|
-
const idmapAttrsHas = (attrs, attr) => attrs.find(a => a === attr)
|
|
1326
|
-
|
|
1327
|
-
/**
|
|
1328
|
-
* @template T
|
|
1329
|
-
* @param {Array<T>} a
|
|
1330
|
-
* @param {Array<T>} b
|
|
1331
|
-
*/
|
|
1332
|
-
export const idmapAttrsEqual = (a, b) => a.length === b.length && a.every(v => idmapAttrsHas(b, v))
|
|
1333
|
-
|
|
1334
|
-
/**
|
|
1335
|
-
* Efficiently encodes IdMap to a binary form. Ensures that information is de-duplicated when
|
|
1336
|
-
* written. Attribute.names are referenced by id. Attributes themselfs are also referenced by id.
|
|
1337
|
-
*
|
|
1338
|
-
* @template Attr
|
|
1339
|
-
* @param {IdSetEncoderV1 | IdSetEncoderV2} encoder
|
|
1340
|
-
* @param {IdMap<Attr>} idmap
|
|
1341
|
-
*
|
|
1342
|
-
* @private
|
|
1343
|
-
* @function
|
|
1344
|
-
*/
|
|
1345
|
-
export const writeIdMap = (encoder, idmap) => {
|
|
1346
|
-
encoding.writeVarUint(encoder.restEncoder, idmap.clients.size)
|
|
1347
|
-
let lastWrittenClientId = 0
|
|
1348
|
-
/**
|
|
1349
|
-
* @type {Map<ContentAttribute<Attr>, number>}
|
|
1350
|
-
*/
|
|
1351
|
-
const visitedAttributions = map.create()
|
|
1352
|
-
/**
|
|
1353
|
-
* @type {Map<string, number>}
|
|
1354
|
-
*/
|
|
1355
|
-
const visitedAttrNames = map.create()
|
|
1356
|
-
// Ensure that the ids are written in a deterministic order (smaller clientids first)
|
|
1357
|
-
array.from(idmap.clients.entries())
|
|
1358
|
-
.sort((a, b) => a[0] - b[0])
|
|
1359
|
-
.forEach(([client, _idRanges]) => {
|
|
1360
|
-
const attrRanges = _idRanges.getIds()
|
|
1361
|
-
encoder.resetIdSetCurVal()
|
|
1362
|
-
const diff = client - lastWrittenClientId
|
|
1363
|
-
encoding.writeVarUint(encoder.restEncoder, diff)
|
|
1364
|
-
lastWrittenClientId = client
|
|
1365
|
-
const len = attrRanges.length
|
|
1366
|
-
encoding.writeVarUint(encoder.restEncoder, len)
|
|
1367
|
-
for (let i = 0; i < len; i++) {
|
|
1368
|
-
const item = attrRanges[i]
|
|
1369
|
-
const attrs = item.attrs
|
|
1370
|
-
const attrLen = attrs.length
|
|
1371
|
-
encoder.writeIdSetClock(item.clock)
|
|
1372
|
-
encoder.writeIdSetLen(item.len)
|
|
1373
|
-
encoding.writeVarUint(encoder.restEncoder, attrLen)
|
|
1374
|
-
for (let j = 0; j < attrLen; j++) {
|
|
1375
|
-
const attr = attrs[j]
|
|
1376
|
-
const attrId = visitedAttributions.get(attr)
|
|
1377
|
-
if (attrId != null) {
|
|
1378
|
-
encoding.writeVarUint(encoder.restEncoder, attrId)
|
|
1379
|
-
} else {
|
|
1380
|
-
const newAttrId = visitedAttributions.size
|
|
1381
|
-
visitedAttributions.set(attr, newAttrId)
|
|
1382
|
-
encoding.writeVarUint(encoder.restEncoder, newAttrId)
|
|
1383
|
-
const attrNameId = visitedAttrNames.get(attr.name)
|
|
1384
|
-
// write attr.name
|
|
1385
|
-
if (attrNameId != null) {
|
|
1386
|
-
encoding.writeVarUint(encoder.restEncoder, attrNameId)
|
|
1387
|
-
} else {
|
|
1388
|
-
const newAttrNameId = visitedAttrNames.size
|
|
1389
|
-
encoding.writeVarUint(encoder.restEncoder, newAttrNameId)
|
|
1390
|
-
encoding.writeVarString(encoder.restEncoder, attr.name)
|
|
1391
|
-
visitedAttrNames.set(attr.name, newAttrNameId)
|
|
1392
|
-
}
|
|
1393
|
-
encoding.writeAny(encoder.restEncoder, /** @type {any} */ (attr.val))
|
|
1394
|
-
}
|
|
1395
|
-
}
|
|
1396
|
-
}
|
|
1397
|
-
})
|
|
1398
|
-
}
|
|
1399
|
-
|
|
1400
|
-
/**
|
|
1401
|
-
* @param {IdMap<any>} idmap
|
|
1402
|
-
*/
|
|
1403
|
-
export const encodeIdMap = idmap => {
|
|
1404
|
-
const encoder = new IdSetEncoderV2()
|
|
1405
|
-
writeIdMap(encoder, idmap)
|
|
1406
|
-
return encoder.toUint8Array()
|
|
1407
|
-
}
|
|
1408
|
-
|
|
1409
|
-
/**
|
|
1410
|
-
* @param {IdSetDecoderV1 | IdSetDecoderV2} decoder
|
|
1411
|
-
* @return {IdMap<any>}
|
|
1412
|
-
*
|
|
1413
|
-
* @private
|
|
1414
|
-
* @function
|
|
1415
|
-
*/
|
|
1416
|
-
export const readIdMap = decoder => {
|
|
1417
|
-
const idmap = new IdMap()
|
|
1418
|
-
const numClients = decoding.readVarUint(decoder.restDecoder)
|
|
1419
|
-
/**
|
|
1420
|
-
* @type {Array<ContentAttribute<any>>}
|
|
1421
|
-
*/
|
|
1422
|
-
const visitedAttributions = []
|
|
1423
|
-
/**
|
|
1424
|
-
* @type {Array<string>}
|
|
1425
|
-
*/
|
|
1426
|
-
const visitedAttrNames = []
|
|
1427
|
-
let lastClientId = 0
|
|
1428
|
-
for (let i = 0; i < numClients; i++) {
|
|
1429
|
-
decoder.resetDsCurVal()
|
|
1430
|
-
const client = lastClientId + decoding.readVarUint(decoder.restDecoder)
|
|
1431
|
-
lastClientId = client
|
|
1432
|
-
const numberOfDeletes = decoding.readVarUint(decoder.restDecoder)
|
|
1433
|
-
/**
|
|
1434
|
-
* @type {Array<AttrRange<any>>}
|
|
1435
|
-
*/
|
|
1436
|
-
const attrRanges = []
|
|
1437
|
-
for (let i = 0; i < numberOfDeletes; i++) {
|
|
1438
|
-
const rangeClock = decoder.readDsClock()
|
|
1439
|
-
const rangeLen = decoder.readDsLen()
|
|
1440
|
-
/**
|
|
1441
|
-
* @type {Array<ContentAttribute<any>>}
|
|
1442
|
-
*/
|
|
1443
|
-
const attrs = []
|
|
1444
|
-
const attrsLen = decoding.readVarUint(decoder.restDecoder)
|
|
1445
|
-
for (let j = 0; j < attrsLen; j++) {
|
|
1446
|
-
const attrId = decoding.readVarUint(decoder.restDecoder)
|
|
1447
|
-
if (attrId >= visitedAttributions.length) {
|
|
1448
|
-
// attrId not known yet
|
|
1449
|
-
const attrNameId = decoding.readVarUint(decoder.restDecoder)
|
|
1450
|
-
if (attrNameId >= visitedAttrNames.length) {
|
|
1451
|
-
visitedAttrNames.push(decoding.readVarString(decoder.restDecoder))
|
|
1452
|
-
}
|
|
1453
|
-
visitedAttributions.push(new ContentAttribute(visitedAttrNames[attrNameId], decoding.readAny(decoder.restDecoder)))
|
|
1454
|
-
}
|
|
1455
|
-
attrs.push(visitedAttributions[attrId])
|
|
1456
|
-
}
|
|
1457
|
-
attrRanges.push(new AttrRange(rangeClock, rangeLen, attrs))
|
|
1458
|
-
}
|
|
1459
|
-
idmap.clients.set(client, new AttrRanges(attrRanges))
|
|
1460
|
-
}
|
|
1461
|
-
visitedAttributions.forEach(attr => {
|
|
1462
|
-
idmap.attrs.add(attr)
|
|
1463
|
-
idmap.attrsH.set(attr.hash(), attr)
|
|
1464
|
-
})
|
|
1465
|
-
return idmap
|
|
1466
|
-
}
|
|
1467
|
-
|
|
1468
|
-
/**
|
|
1469
|
-
* @param {Uint8Array} data
|
|
1470
|
-
* @return {IdMap<any>}
|
|
1471
|
-
*/
|
|
1472
|
-
export const decodeIdMap = data => readIdMap(new IdSetDecoderV2(decoding.createDecoder(data)))
|
|
1473
|
-
|
|
1474
|
-
/**
|
|
1475
|
-
* @template Attrs
|
|
1476
|
-
* @param {IdMap<Attrs>} idmap
|
|
1477
|
-
* @param {Array<ContentAttribute<Attrs>>} attrs
|
|
1478
|
-
* @return {Array<ContentAttribute<Attrs>>}
|
|
1479
|
-
*/
|
|
1480
|
-
const _ensureAttrs = (idmap, attrs) => attrs.map(attr =>
|
|
1481
|
-
idmap.attrs.has(attr)
|
|
1482
|
-
? attr
|
|
1483
|
-
: map.setIfUndefined(idmap.attrsH, attr.hash(), () => {
|
|
1484
|
-
idmap.attrs.add(attr)
|
|
1485
|
-
return attr
|
|
1486
|
-
}))
|
|
1487
|
-
|
|
1488
|
-
export const createIdMap = () => new IdMap()
|
|
1489
|
-
|
|
1490
|
-
/**
|
|
1491
|
-
* Schema of an {@link IdSet}.
|
|
1492
|
-
*
|
|
1493
|
-
* Nominal: `check` is a single identity compare against the globally interned `y:idSet` tag, so it
|
|
1494
|
-
* stays sound across duplicate yjs installations (unlike `instanceof`) - the same reason
|
|
1495
|
-
* {@link $renderer} uses `$type`.
|
|
1496
|
-
*/
|
|
1497
|
-
export const $idSet = IdSet.prototype.$type = s.$type('y:idSet', IdSet)
|
|
1498
|
-
|
|
1499
|
-
/**
|
|
1500
|
-
* Schema of an {@link IdMap} with any mapped-value type. This is where the nominal `y:idMap` tag
|
|
1501
|
-
* lives - {@link $idMap} builds on it. Mirrors lib0's `$deltaAny` / `$delta` split.
|
|
1502
|
-
*/
|
|
1503
|
-
export const $idMapAny = /** @type {s.Schema<IdMap<any>>} */ (IdMap.prototype.$type = s.$type('y:idMap', IdMap))
|
|
1504
|
-
|