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
|
@@ -69,11 +69,7 @@ export declare const encodeRank: (segs: readonly RankSeg[]) => string;
|
|
|
69
69
|
* strictly-between key always exist (modulo the documented VMIN bound).
|
|
70
70
|
*/
|
|
71
71
|
export declare const rankBetween: (left: string | undefined, right: string | undefined, clientId: number, rand?: () => number, compact?: boolean) => string;
|
|
72
|
-
/**
|
|
73
|
-
* The digit of the run marker data arrays wrote up to 0.1.0-next.21 (a run
|
|
74
|
-
* of that form is the marker segment, then ranks of the client's own): still
|
|
75
|
-
* read as a run, so what a client inserts there stays in it.
|
|
76
|
-
*/
|
|
72
|
+
/** The base of the run band: a run member's digit lies just above it. */
|
|
77
73
|
export declare const RANK_RUN: number;
|
|
78
74
|
/**
|
|
79
75
|
* A rank in `(left, right)` for an insert right after `left` — one rule for
|
|
@@ -66,6 +66,10 @@ export class RankSpaceExhausted extends Error {
|
|
|
66
66
|
this.name = 'RankSpaceExhausted';
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
/** A rank this module cannot encode, a malformed rank, or bounds out of order (a caller's error). */
|
|
70
|
+
const bad = (what) => {
|
|
71
|
+
throw new Error(`rank: ${what}`);
|
|
72
|
+
};
|
|
69
73
|
/** `n` (≥ 0) as exactly `width` base-64 places. */
|
|
70
74
|
const places = (n, width) => {
|
|
71
75
|
let out = '';
|
|
@@ -74,7 +78,7 @@ const places = (n, width) => {
|
|
|
74
78
|
n = Math.floor(n / BASE);
|
|
75
79
|
}
|
|
76
80
|
if (n > 0)
|
|
77
|
-
|
|
81
|
+
bad('overflow');
|
|
78
82
|
return out;
|
|
79
83
|
};
|
|
80
84
|
/** How many base-64 places `m` (≥ 1) takes. */
|
|
@@ -87,13 +91,13 @@ const width = (m) => {
|
|
|
87
91
|
/** A signed integer as a self-delimiting, order-preserving string. */
|
|
88
92
|
const encInt = (v) => {
|
|
89
93
|
if (!Number.isSafeInteger(v))
|
|
90
|
-
|
|
94
|
+
bad('digit');
|
|
91
95
|
if (v === 0)
|
|
92
96
|
return 'H';
|
|
93
97
|
const m = Math.abs(v);
|
|
94
98
|
const k = width(m);
|
|
95
99
|
if (k > MAX_PLACES)
|
|
96
|
-
|
|
100
|
+
bad('overflow');
|
|
97
101
|
if (v > 0)
|
|
98
102
|
return String.fromCharCode(ZERO + k) + places(m, k);
|
|
99
103
|
// Complemented: a greater magnitude sorts first.
|
|
@@ -102,16 +106,14 @@ const encInt = (v) => {
|
|
|
102
106
|
/** The integer at `s[i]`, and where it ends. */
|
|
103
107
|
const decInt = (s, i) => {
|
|
104
108
|
const k = s.charCodeAt(i) - ZERO;
|
|
105
|
-
if (Number.isNaN(k) || Math.abs(k) > MAX_PLACES)
|
|
106
|
-
throw new Error(`rank decode: bad length at ${i}`);
|
|
107
109
|
const n = Math.abs(k);
|
|
108
|
-
if (i + 1 + n > s.length)
|
|
109
|
-
|
|
110
|
+
if (Number.isNaN(k) || n > MAX_PLACES || i + 1 + n > s.length)
|
|
111
|
+
bad('malformed');
|
|
110
112
|
let x = 0;
|
|
111
113
|
for (let j = i + 1; j <= i + n; j++) {
|
|
112
114
|
const d = ALPHABET.indexOf(s[j]);
|
|
113
115
|
if (d < 0)
|
|
114
|
-
|
|
116
|
+
bad('malformed');
|
|
115
117
|
x = x * BASE + d;
|
|
116
118
|
}
|
|
117
119
|
const v = k === 0 ? 0 : k > 0 ? x : -(BASE ** n - 1 - x);
|
|
@@ -120,7 +122,7 @@ const decInt = (s, i) => {
|
|
|
120
122
|
/** Decode a rank string into its segment array (`t: Infinity` where a segment has no tie). */
|
|
121
123
|
export const decodeRank = (rank) => {
|
|
122
124
|
if (rank.length === 0)
|
|
123
|
-
|
|
125
|
+
bad('malformed');
|
|
124
126
|
const segs = [];
|
|
125
127
|
for (let i = 0; i < rank.length;) {
|
|
126
128
|
const [v, j] = decInt(rank, i);
|
|
@@ -131,7 +133,7 @@ export const decodeRank = (rank) => {
|
|
|
131
133
|
segs.push({ v, t });
|
|
132
134
|
}
|
|
133
135
|
if (segs[segs.length - 1].t === Infinity)
|
|
134
|
-
|
|
136
|
+
bad('malformed');
|
|
135
137
|
return segs;
|
|
136
138
|
};
|
|
137
139
|
/** Encode segments back to the persisted string form. */
|
|
@@ -139,7 +141,7 @@ export const encodeRank = (segs) => {
|
|
|
139
141
|
let out = '';
|
|
140
142
|
for (const { v, t } of segs) {
|
|
141
143
|
if (v < RANK_VMIN || v > RANK_VMAX)
|
|
142
|
-
|
|
144
|
+
bad('overflow');
|
|
143
145
|
out += encInt(v);
|
|
144
146
|
if (t !== Infinity)
|
|
145
147
|
out += TIE + encInt(t);
|
|
@@ -170,9 +172,8 @@ const APPEND_WINDOW = 2 ** 16;
|
|
|
170
172
|
export const rankBetween = (left, right, clientId, rand = Math.random, compact = true) => {
|
|
171
173
|
const L = left === undefined ? [] : decodeRank(left);
|
|
172
174
|
const R = right === undefined ? [] : decodeRank(right);
|
|
173
|
-
if (left !== undefined && right !== undefined && left >= right)
|
|
174
|
-
|
|
175
|
-
}
|
|
175
|
+
if (left !== undefined && right !== undefined && left >= right)
|
|
176
|
+
bad('left >= right');
|
|
176
177
|
const rightOpen = right === undefined;
|
|
177
178
|
const path = [];
|
|
178
179
|
// `locked`: the emitted prefix already sorts below the right bound.
|
|
@@ -209,9 +210,8 @@ export const rankBetween = (left, right, clientId, rand = Math.random, compact =
|
|
|
209
210
|
// Right bound ended while left continues: valid only when `locked`
|
|
210
211
|
// already holds (an earlier copied segment was < the right's). If not,
|
|
211
212
|
// right is a proper prefix of left — i.e. right < left, caller error.
|
|
212
|
-
if (!rightOpen && !locked)
|
|
213
|
-
|
|
214
|
-
}
|
|
213
|
+
if (!rightOpen && !locked)
|
|
214
|
+
bad('left >= right');
|
|
215
215
|
// No right bound at this level (open, or `locked` below it): emit
|
|
216
216
|
// within the bounded append window — dense growth, and one more
|
|
217
217
|
// level per exhausted gap, not one per insert (SW12-crdt-2).
|
|
@@ -254,16 +254,12 @@ export const rankBetween = (left, right, clientId, rand = Math.random, compact =
|
|
|
254
254
|
else if (c > 0 && !locked) {
|
|
255
255
|
// Never locked and left's segment exceeds right's at the first
|
|
256
256
|
// differing level → left > right (invalid bounds — caller error).
|
|
257
|
-
|
|
257
|
+
bad('left >= right');
|
|
258
258
|
}
|
|
259
259
|
path.push(lSeg);
|
|
260
260
|
}
|
|
261
261
|
};
|
|
262
|
-
/**
|
|
263
|
-
* The digit of the run marker data arrays wrote up to 0.1.0-next.21 (a run
|
|
264
|
-
* of that form is the marker segment, then ranks of the client's own): still
|
|
265
|
-
* read as a run, so what a client inserts there stays in it.
|
|
266
|
-
*/
|
|
262
|
+
/** The base of the run band: a run member's digit lies just above it. */
|
|
267
263
|
export const RANK_RUN = -(2 ** 30);
|
|
268
264
|
/**
|
|
269
265
|
* A run member's digit lies in `(RANK_RUN, RANK_RUN + RUN_BAND)`: below every
|
|
@@ -297,25 +293,25 @@ export const rankAfter = (left, right, client, rand = Math.random) => {
|
|
|
297
293
|
const top = encodeRank([{ v: RANK_RUN + RUN_BAND, t: 0 }]);
|
|
298
294
|
/**
|
|
299
295
|
* `prefix` and a rank after `after` (`undefined`: the run opens) in the
|
|
300
|
-
* run
|
|
301
|
-
*
|
|
302
|
-
*
|
|
296
|
+
* run, inside the band. Opening, it takes the band's middle, or a digit
|
|
297
|
+
* below the run's first member; at the run's end it appends as an open
|
|
298
|
+
* end does (a window, not half the band); else between the two.
|
|
303
299
|
*/
|
|
304
|
-
const own = (prefix, after
|
|
300
|
+
const own = (prefix, after) => {
|
|
305
301
|
const tail = (r) => r && r.length > prefix.length && r.startsWith(prefix) ? r.slice(prefix.length) : undefined;
|
|
306
302
|
let next = tail(right);
|
|
307
|
-
if (
|
|
303
|
+
if (next !== undefined && next > top)
|
|
308
304
|
next = undefined;
|
|
309
305
|
let mine;
|
|
310
306
|
if (after === undefined) {
|
|
311
307
|
if (next === undefined)
|
|
312
308
|
mine = encodeRank([{ v: RUN_START, t: client }]);
|
|
313
|
-
else if (
|
|
309
|
+
else if (next > bottom)
|
|
314
310
|
mine = rankBetween(bottom, next, client, rand, false);
|
|
315
311
|
else
|
|
316
312
|
return plain();
|
|
317
313
|
}
|
|
318
|
-
else if (next === undefined
|
|
314
|
+
else if (next === undefined) {
|
|
319
315
|
const append = rankBetween(after, undefined, client, rand, false);
|
|
320
316
|
mine = append < top ? append : rankBetween(after, top, client, rand, false);
|
|
321
317
|
}
|
|
@@ -326,17 +322,11 @@ export const rankAfter = (left, right, client, rand = Math.random) => {
|
|
|
326
322
|
};
|
|
327
323
|
// A member of the client's run: the next member, inside the band.
|
|
328
324
|
if (last.t === client && inRun(last.v))
|
|
329
|
-
return own(encodeRank(segs.slice(0, -1)), encodeRank([last])
|
|
330
|
-
// A run of the earlier form (the marker, then the client's ranks): stays in it.
|
|
331
|
-
const k = segs.findLastIndex((g) => g.v === RANK_RUN);
|
|
332
|
-
if (k >= 0 && segs[k].t === client) {
|
|
333
|
-
const prefix = encodeRank(segs.slice(0, k + 1));
|
|
334
|
-
return own(prefix, left.length > prefix.length ? left.slice(prefix.length) : undefined, false);
|
|
335
|
-
}
|
|
325
|
+
return own(encodeRank(segs.slice(0, -1)), encodeRank([last]));
|
|
336
326
|
// A rank the client made: its run opens right after it. The prefix keeps
|
|
337
327
|
// `left`'s tie: a peer's rank of the same digit and a greater tie
|
|
338
328
|
// then sorts after the whole run, never between `left` and it.
|
|
339
329
|
if (last.t === client)
|
|
340
|
-
return own(left, undefined
|
|
330
|
+
return own(left, undefined);
|
|
341
331
|
return plain();
|
|
342
332
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Properties: the deep proxy behind `block.data`, `atom.data`,
|
|
3
|
+
* `edytor.data` and `document.data` (SyncedStore's feel, one small module).
|
|
4
|
+
* It is sugar over the one write path: every mutation is a data patch
|
|
5
|
+
* handed to `write`, which is the `patchData` operation (dispatched on a
|
|
6
|
+
* view, raw on a bare document).
|
|
7
|
+
*
|
|
8
|
+
* A read goes to `read()` every time (the live source), so a reactive
|
|
9
|
+
* reader of `block.data.title` re-runs when anyone changes it, and a key a
|
|
10
|
+
* peer deletes is gone. Plain objects read as nested proxies, arrays as
|
|
11
|
+
* array proxies, everything else as the raw value; a proxy is cached per
|
|
12
|
+
* path, so its identity is stable. An object or array held in an array
|
|
13
|
+
* item is that item's (its path names the item by id, from `ids`): it
|
|
14
|
+
* stays on its item wherever peers move it, so `{#each list as item (item)}`
|
|
15
|
+
* keeps a row on its item; once the item is removed, its writes are
|
|
16
|
+
* refused. A key is a path segment as `keySegment` writes it.
|
|
17
|
+
*
|
|
18
|
+
* Writes, each the patch of only what it changes (per-leaf storage, so
|
|
19
|
+
* concurrent edits of other keys and items merge): `obj.key = v`,
|
|
20
|
+
* `arr[i] = v` and `delete obj.key` patch that path; `push`, `pop`,
|
|
21
|
+
* `shift`, `unshift`, `splice` and `length` are one `splice` (the items
|
|
22
|
+
* kept keep their ids), `sort` and `reverse` one `order` (the items move),
|
|
23
|
+
* `fill` and `copyWithin` writes of the items they change. Assigning a
|
|
24
|
+
* value equal to the one there writes nothing. `JSON.stringify` and
|
|
25
|
+
* `$state.snapshot` read plain JSON through it.
|
|
26
|
+
*/
|
|
27
|
+
import { type DataPatch } from './data.js';
|
|
28
|
+
type Json = Record<string, unknown>;
|
|
29
|
+
export declare const propsProxy: <T extends object = Json>(read: () => Json, write: (ops: DataPatch[]) => void,
|
|
30
|
+
/** The ids of the items of the array at a path (`facade.dataItemIds`). */
|
|
31
|
+
ids?: (path: readonly string[]) => string[]) => T;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Properties: the deep proxy behind `block.data`, `atom.data`,
|
|
3
|
+
* `edytor.data` and `document.data` (SyncedStore's feel, one small module).
|
|
4
|
+
* It is sugar over the one write path: every mutation is a data patch
|
|
5
|
+
* handed to `write`, which is the `patchData` operation (dispatched on a
|
|
6
|
+
* view, raw on a bare document).
|
|
7
|
+
*
|
|
8
|
+
* A read goes to `read()` every time (the live source), so a reactive
|
|
9
|
+
* reader of `block.data.title` re-runs when anyone changes it, and a key a
|
|
10
|
+
* peer deletes is gone. Plain objects read as nested proxies, arrays as
|
|
11
|
+
* array proxies, everything else as the raw value; a proxy is cached per
|
|
12
|
+
* path, so its identity is stable. An object or array held in an array
|
|
13
|
+
* item is that item's (its path names the item by id, from `ids`): it
|
|
14
|
+
* stays on its item wherever peers move it, so `{#each list as item (item)}`
|
|
15
|
+
* keeps a row on its item; once the item is removed, its writes are
|
|
16
|
+
* refused. A key is a path segment as `keySegment` writes it.
|
|
17
|
+
*
|
|
18
|
+
* Writes, each the patch of only what it changes (per-leaf storage, so
|
|
19
|
+
* concurrent edits of other keys and items merge): `obj.key = v`,
|
|
20
|
+
* `arr[i] = v` and `delete obj.key` patch that path; `push`, `pop`,
|
|
21
|
+
* `shift`, `unshift`, `splice` and `length` are one `splice` (the items
|
|
22
|
+
* kept keep their ids), `sort` and `reverse` one `order` (the items move),
|
|
23
|
+
* `fill` and `copyWithin` writes of the items they change. Assigning a
|
|
24
|
+
* value equal to the one there writes nothing. `JSON.stringify` and
|
|
25
|
+
* `$state.snapshot` read plain JSON through it.
|
|
26
|
+
*/
|
|
27
|
+
import { isObject, keySegment, segmentKey } from './data.js';
|
|
28
|
+
import { jsonEquals } from '../utils/json.js';
|
|
29
|
+
/** A plain JSON copy (proxies included), or `undefined`. */
|
|
30
|
+
const plain = (v) => (v === undefined ? v : JSON.parse(JSON.stringify(v)));
|
|
31
|
+
/** The items of `now` that differ from `was`, as writes of those items. */
|
|
32
|
+
const changed = (_, __, was, now) => now.flatMap((value, i) => JSON.stringify(value) === JSON.stringify(was[i]) ? [] : [{ at: `${i}`, value }]);
|
|
33
|
+
/**
|
|
34
|
+
* Each array mutator as the patches of the array (or of its items `at`),
|
|
35
|
+
* from its length `n`, the call's `args`, the array `was` and the result `out`.
|
|
36
|
+
*/
|
|
37
|
+
const MUTATORS = {
|
|
38
|
+
push: (n, args) => ({ splice: [n, 0, ...args] }),
|
|
39
|
+
pop: (n) => ({ splice: [Math.max(n - 1, 0), n && 1] }),
|
|
40
|
+
shift: () => ({ splice: [0, 1] }),
|
|
41
|
+
unshift: (_, args) => ({ splice: [0, 0, ...args] }),
|
|
42
|
+
// The start and count `splice` resolved (negative, fractional, past the end).
|
|
43
|
+
splice: (n, [start, , ...items], _, out) => {
|
|
44
|
+
const s = Math.trunc(Number(start)) || 0;
|
|
45
|
+
return { splice: [s < 0 ? Math.max(n + s, 0) : Math.min(s, n), out.length, ...items] };
|
|
46
|
+
},
|
|
47
|
+
sort: (n, [compare], was) => ({ order: sorted(n, was, compare) }),
|
|
48
|
+
reverse: (n) => ({ order: Array.from({ length: n }, (_, i) => n - 1 - i) }),
|
|
49
|
+
fill: changed,
|
|
50
|
+
copyWithin: changed
|
|
51
|
+
};
|
|
52
|
+
/** The indexes `Array.prototype.sort` puts `values` in (stable, `undefined` compare: by string). */
|
|
53
|
+
const sorted = (n, values, compare) => {
|
|
54
|
+
const by = typeof compare === 'function'
|
|
55
|
+
? compare
|
|
56
|
+
: (a, b) => (`${a}` < `${b}` ? -1 : `${a}` > `${b}` ? 1 : 0);
|
|
57
|
+
return Array.from({ length: n }, (_, i) => i).sort((a, b) => by(values[a], values[b]));
|
|
58
|
+
};
|
|
59
|
+
export const propsProxy = (read, write,
|
|
60
|
+
/** The ids of the items of the array at a path (`facade.dataItemIds`). */
|
|
61
|
+
ids = () => []) => {
|
|
62
|
+
const cache = new Map();
|
|
63
|
+
// Item ids per array path, for the value `read()` last gave.
|
|
64
|
+
let seen;
|
|
65
|
+
const known = new Map();
|
|
66
|
+
const idsOf = (path) => {
|
|
67
|
+
const now = read();
|
|
68
|
+
if (now !== seen) {
|
|
69
|
+
seen = now;
|
|
70
|
+
known.clear();
|
|
71
|
+
}
|
|
72
|
+
const key = JSON.stringify(path);
|
|
73
|
+
return known.get(key) ?? known.set(key, ids(path)).get(key);
|
|
74
|
+
};
|
|
75
|
+
const at = (path) => path.reduce((v, k, n) => /^~[a-z]/.test(k)
|
|
76
|
+
? Array.isArray(v)
|
|
77
|
+
? v[idsOf(path.slice(0, n)).indexOf(k)]
|
|
78
|
+
: undefined // its array is gone
|
|
79
|
+
: v !== null && typeof v === 'object'
|
|
80
|
+
? v[segmentKey(k)]
|
|
81
|
+
: undefined, read());
|
|
82
|
+
const put = (path, value) => {
|
|
83
|
+
const next = plain(value);
|
|
84
|
+
if (jsonEquals(at(path), next))
|
|
85
|
+
return;
|
|
86
|
+
write([{ path, ...(next !== undefined && { value: next }) }]);
|
|
87
|
+
};
|
|
88
|
+
const wrap = (path, v) => Array.isArray(v) || isObject(v) ? proxy(path, Array.isArray(v)) : v;
|
|
89
|
+
const proxy = (path, array) => {
|
|
90
|
+
const key = `${array ? '[' : '{'}${JSON.stringify(path)}`;
|
|
91
|
+
const cached = cache.get(key);
|
|
92
|
+
if (cached)
|
|
93
|
+
return cached;
|
|
94
|
+
const current = () => {
|
|
95
|
+
const v = at(path);
|
|
96
|
+
return array ? (Array.isArray(v) ? v : []) : isObject(v) ? v : {};
|
|
97
|
+
};
|
|
98
|
+
/** The path of child `k`: an item by its id, a key as its segment. */
|
|
99
|
+
const child = (k) => [...path, (array && idsOf(path)[Number(k)]) || keySegment(k)];
|
|
100
|
+
const items = () => current().map((v, i) => wrap(child(`${i}`), v));
|
|
101
|
+
const own = (k) => Object.prototype.hasOwnProperty.call(current(), k);
|
|
102
|
+
const made = new Proxy(array ? [] : {}, {
|
|
103
|
+
get(target, k) {
|
|
104
|
+
if (typeof k === 'symbol')
|
|
105
|
+
return array && k === Symbol.iterator
|
|
106
|
+
? () => items()[Symbol.iterator]()
|
|
107
|
+
: Reflect.get(target, k);
|
|
108
|
+
if (array && k === 'length')
|
|
109
|
+
return current().length;
|
|
110
|
+
if (own(k))
|
|
111
|
+
return wrap(child(k), current()[k]);
|
|
112
|
+
if (array && Object.hasOwn(MUTATORS, k))
|
|
113
|
+
return (...args) => {
|
|
114
|
+
const was = plain(current());
|
|
115
|
+
const next = [...was];
|
|
116
|
+
const fn = Array.prototype[k];
|
|
117
|
+
args = args.map((a) => (a !== null && typeof a === 'object' ? plain(a) : a));
|
|
118
|
+
const out = fn.apply(next, args);
|
|
119
|
+
const ops = [MUTATORS[k](was.length, args, was, out)].flat();
|
|
120
|
+
if (!jsonEquals(was, next))
|
|
121
|
+
write(ops.map(({ at, ...op }) => ({ ...op, path: at ? [...path, at] : path })));
|
|
122
|
+
return out === next ? made : out;
|
|
123
|
+
};
|
|
124
|
+
const method = array ? Array.prototype[k] : undefined;
|
|
125
|
+
if (typeof method === 'function')
|
|
126
|
+
return (...args) => method.apply(items(), args);
|
|
127
|
+
return Reflect.get(target, k);
|
|
128
|
+
},
|
|
129
|
+
set(_, k, value) {
|
|
130
|
+
if (typeof k === 'symbol')
|
|
131
|
+
return false;
|
|
132
|
+
if (array && k === 'length') {
|
|
133
|
+
const n = current().length;
|
|
134
|
+
const nulls = Array.from({ length: Math.max(value - n, 0) }, () => null);
|
|
135
|
+
write([{ path, splice: [Math.min(value, n), Math.max(n - value, 0), ...nulls] }]);
|
|
136
|
+
}
|
|
137
|
+
else
|
|
138
|
+
put([...path, keySegment(k)], value);
|
|
139
|
+
return true;
|
|
140
|
+
},
|
|
141
|
+
deleteProperty(_, k) {
|
|
142
|
+
if (typeof k === 'symbol')
|
|
143
|
+
return false;
|
|
144
|
+
if (own(k))
|
|
145
|
+
put([...path, keySegment(k)], undefined);
|
|
146
|
+
return true;
|
|
147
|
+
},
|
|
148
|
+
has: (target, k) => (typeof k === 'string' && own(k)) || Reflect.has(target, k),
|
|
149
|
+
ownKeys: () => [...Object.keys(current()), ...(array ? ['length'] : [])],
|
|
150
|
+
getOwnPropertyDescriptor(target, k) {
|
|
151
|
+
if (array && k === 'length')
|
|
152
|
+
return (Reflect.getOwnPropertyDescriptor(target, k) && {
|
|
153
|
+
value: current().length,
|
|
154
|
+
writable: true,
|
|
155
|
+
enumerable: false,
|
|
156
|
+
configurable: false
|
|
157
|
+
});
|
|
158
|
+
if (typeof k !== 'string' || !own(k))
|
|
159
|
+
return undefined;
|
|
160
|
+
return {
|
|
161
|
+
value: wrap(child(k), current()[k]),
|
|
162
|
+
writable: true,
|
|
163
|
+
enumerable: true,
|
|
164
|
+
configurable: true
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
cache.set(key, made);
|
|
169
|
+
return made;
|
|
170
|
+
};
|
|
171
|
+
return proxy([], false);
|
|
172
|
+
};
|
package/dist/crdt/protocol.d.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* codec that needs no `Awareness` instance (whose sweep timer blocks
|
|
17
17
|
* hibernation);
|
|
18
18
|
* - the admission gates (`assertAdmission`, `inspectAdmission`, …) that
|
|
19
|
-
* diagnostics
|
|
19
|
+
* diagnostics read;
|
|
20
20
|
* - the raw provider classes behind `createIndexeddbSync` and
|
|
21
21
|
* `createWebsocketSync` (`IndexeddbPersistence`, `WebsocketProvider`)
|
|
22
22
|
* and `storeState`.
|
|
@@ -24,15 +24,14 @@
|
|
|
24
24
|
* `pnpm check:worker` keeps this graph Worker-safe; the site's
|
|
25
25
|
* `server/protocol` page documents the contract.
|
|
26
26
|
*/
|
|
27
|
-
export { bindCrdt, type Crdt, type EngineApi, type EngineDoc, type EngineNode, type
|
|
27
|
+
export { bindCrdt, type Crdt, type EngineApi, type EngineDoc, type EngineNode, type EngineTransaction, type EngineItemRef, type YNode, type YItem, type YDoc, type YUndoManager, type YTransaction } from './index.js';
|
|
28
28
|
export { SCHEMA_VERSION, META_KEY } from './edytor-doc.js';
|
|
29
|
-
export { GENERATION, generationWord, frame, PROTOCOL_VERSION, GENERATION_RECORD,
|
|
30
|
-
export { PREVIOUS_SCHEMA, isPreviousGenerationRecord } from './migration/generation.js';
|
|
29
|
+
export { GENERATION, generationWord, frame, PROTOCOL_VERSION, GENERATION_RECORD, GenerationMismatchError, readProtocolVersion, type GenerationRecord } from './protocols/envelope.js';
|
|
31
30
|
export { messageSync, messageAwareness, messageAuth, messageQueryAwareness, messageSaved, messageChunk, messageComments, MAX_FRAME_BYTES, chunkFrame, createChunkReader, ChunkLimitError, type ChunkReader, CLOSE } from './providers/room.js';
|
|
32
31
|
export { messageYjsSyncStep1, messageYjsSyncStep2, messageYjsUpdate, type SyncProtocol } from './protocols/sync.js';
|
|
33
32
|
export { messagePermissionDenied, messageReadOnly, writePermissionDenied, writeReadOnly } from './protocols/auth.js';
|
|
34
33
|
export { commentsSubscribe, commentsSnapshot, commentsChange, writeCommentsSubscribe, writeCommentsSnapshot, writeCommentsChange, readCommentsMessage, type CommentChange, type CommentMessage, type CommentSnapshot, type CommentThread, type ThreadComment } from './protocols/comments.js';
|
|
35
|
-
export { applyAwarenessUpdate, encodeAwarenessUpdate,
|
|
34
|
+
export { applyAwarenessUpdate, encodeAwarenessUpdate, readAwarenessEntries, writeAwarenessEntries, type AwarenessEntry } from './protocols/awareness.js';
|
|
36
35
|
export { createDecoder, readVarUint, readVarUint8Array, type Decoder } from 'lib0-v14/decoding';
|
|
37
36
|
export { writeVarUint8Array, type Encoder } from 'lib0-v14/encoding';
|
|
38
37
|
export { assertAdmission, assertSchema, assertUsableDoc, checkSchema, inspectAdmission, isInitialized, registryEmpty, schemaVersion, SchemaMismatchError, UndecodableUpdateError, UnsupportedDocError, type AdmissionResult, type AdmissionVerdict, type SchemaProblem } from './admission.js';
|
package/dist/crdt/protocol.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* codec that needs no `Awareness` instance (whose sweep timer blocks
|
|
17
17
|
* hibernation);
|
|
18
18
|
* - the admission gates (`assertAdmission`, `inspectAdmission`, …) that
|
|
19
|
-
* diagnostics
|
|
19
|
+
* diagnostics read;
|
|
20
20
|
* - the raw provider classes behind `createIndexeddbSync` and
|
|
21
21
|
* `createWebsocketSync` (`IndexeddbPersistence`, `WebsocketProvider`)
|
|
22
22
|
* and `storeState`.
|
|
@@ -28,14 +28,13 @@
|
|
|
28
28
|
export { bindCrdt } from './index.js';
|
|
29
29
|
// ── The frame contract and the generation ──────────────────────────────
|
|
30
30
|
export { SCHEMA_VERSION, META_KEY } from './edytor-doc.js';
|
|
31
|
-
export { GENERATION, generationWord, frame, PROTOCOL_VERSION, GENERATION_RECORD,
|
|
32
|
-
export { PREVIOUS_SCHEMA, isPreviousGenerationRecord } from './migration/generation.js';
|
|
31
|
+
export { GENERATION, generationWord, frame, PROTOCOL_VERSION, GENERATION_RECORD, GenerationMismatchError, readProtocolVersion } from './protocols/envelope.js';
|
|
33
32
|
// ── Message types, acknowledgements and chunks ─────────────────────────
|
|
34
33
|
export { messageSync, messageAwareness, messageAuth, messageQueryAwareness, messageSaved, messageChunk, messageComments, MAX_FRAME_BYTES, chunkFrame, createChunkReader, ChunkLimitError, CLOSE } from './providers/room.js';
|
|
35
34
|
export { messageYjsSyncStep1, messageYjsSyncStep2, messageYjsUpdate } from './protocols/sync.js';
|
|
36
35
|
export { messagePermissionDenied, messageReadOnly, writePermissionDenied, writeReadOnly } from './protocols/auth.js';
|
|
37
36
|
export { commentsSubscribe, commentsSnapshot, commentsChange, writeCommentsSubscribe, writeCommentsSnapshot, writeCommentsChange, readCommentsMessage } from './protocols/comments.js';
|
|
38
|
-
export { applyAwarenessUpdate, encodeAwarenessUpdate,
|
|
37
|
+
export { applyAwarenessUpdate, encodeAwarenessUpdate, readAwarenessEntries, writeAwarenessEntries } from './protocols/awareness.js';
|
|
39
38
|
// Minimal wire codec for frame bodies (lib0 — the codec the frames are
|
|
40
39
|
// written with): read the header/subtype/payload, write a payload into a
|
|
41
40
|
// `frame` callback's encoder.
|
|
@@ -32,12 +32,12 @@ type AwarenessEvents = {
|
|
|
32
32
|
* outdated, and remote states expire after {@link outdatedTimeout}.
|
|
33
33
|
*/
|
|
34
34
|
export declare class Awareness extends IsolatedObservable<AwarenessEvents> {
|
|
35
|
+
#private;
|
|
35
36
|
doc: AwarenessDoc;
|
|
36
37
|
clientID: number;
|
|
37
38
|
/** Maps from client id to client state */
|
|
38
39
|
states: AwarenessStates;
|
|
39
40
|
meta: Map<number, MetaClientState>;
|
|
40
|
-
private _checkInterval;
|
|
41
41
|
/**
|
|
42
42
|
* Idempotence guard — `destroy()` is reachable twice through the
|
|
43
43
|
* OWNED-doc + OWNED-awareness composition: `EdytorDocument.destroy()`
|
|
@@ -59,6 +59,7 @@ export declare class Awareness extends IsolatedObservable<AwarenessEvents> {
|
|
|
59
59
|
* peers. This change is propagated to remote clients.
|
|
60
60
|
*/
|
|
61
61
|
export declare const removeAwarenessStates: (awareness: Awareness, clients: number[], origin: unknown) => void;
|
|
62
|
+
/** The update carrying `clients`' entries of `awareness` (their states in `states`). */
|
|
62
63
|
export declare const encodeAwarenessUpdate: (awareness: Awareness, clients: number[], states?: AwarenessStates) => Uint8Array;
|
|
63
64
|
/** One awareness entry on the wire: a client's clock and state (`null` = removed). */
|
|
64
65
|
export type AwarenessEntry = {
|
|
@@ -72,13 +73,8 @@ export type AwarenessEntry = {
|
|
|
72
73
|
* must not hold timers (a hibernating Durable Object) can track presence.
|
|
73
74
|
*/
|
|
74
75
|
export declare const readAwarenessEntries: (update: Uint8Array) => AwarenessEntry[];
|
|
75
|
-
/** Instance-free awareness codec: encode entries as an update
|
|
76
|
+
/** Instance-free awareness codec: encode entries as an update. */
|
|
76
77
|
export declare const writeAwarenessEntries: (entries: readonly AwarenessEntry[]) => Uint8Array;
|
|
77
|
-
/**
|
|
78
|
-
* Modify the content of an awareness update before re-encoding it to an
|
|
79
|
-
* awareness update — e.g. a central server preventing identity hijacking.
|
|
80
|
-
*/
|
|
81
|
-
export declare const modifyAwarenessUpdate: (update: Uint8Array, modify: (state: Record<string, unknown> | null) => Record<string, unknown> | null) => Uint8Array;
|
|
82
78
|
/**
|
|
83
79
|
* Apply an encoded awareness update. `origin` is forwarded on the emitted
|
|
84
80
|
* change/update events.
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
* wire compatibility is not peer compatibility (presence payload versioning
|
|
15
15
|
* is the presence layer's concern).
|
|
16
16
|
*/
|
|
17
|
+
import { jsonEquals } from '../../utils/json.js';
|
|
17
18
|
import * as encoding from 'lib0-v14/encoding';
|
|
18
19
|
import * as decoding from 'lib0-v14/decoding';
|
|
19
20
|
import * as time from 'lib0-v14/time';
|
|
20
21
|
import * as math from 'lib0-v14/math';
|
|
21
|
-
import * as f from 'lib0-v14/function';
|
|
22
22
|
import { IsolatedObservable } from './observable.js';
|
|
23
23
|
export const outdatedTimeout = 30000;
|
|
24
24
|
/**
|
|
@@ -33,7 +33,7 @@ export class Awareness extends IsolatedObservable {
|
|
|
33
33
|
/** Maps from client id to client state */
|
|
34
34
|
states;
|
|
35
35
|
meta;
|
|
36
|
-
|
|
36
|
+
#checkInterval;
|
|
37
37
|
/**
|
|
38
38
|
* Idempotence guard — `destroy()` is reachable twice through the
|
|
39
39
|
* OWNED-doc + OWNED-awareness composition: `EdytorDocument.destroy()`
|
|
@@ -49,7 +49,7 @@ export class Awareness extends IsolatedObservable {
|
|
|
49
49
|
this.clientID = doc.clientID;
|
|
50
50
|
this.states = new Map();
|
|
51
51
|
this.meta = new Map();
|
|
52
|
-
this
|
|
52
|
+
this.#checkInterval = setInterval(() => {
|
|
53
53
|
const now = time.getUnixTime();
|
|
54
54
|
const localMeta = this.meta.get(this.clientID);
|
|
55
55
|
if (this.getLocalState() !== null &&
|
|
@@ -73,7 +73,7 @@ export class Awareness extends IsolatedObservable {
|
|
|
73
73
|
// Node returns a `Timeout` (has `unref`), browsers a number — a stale-
|
|
74
74
|
// state sweep must never be the thing keeping a node/SSR process alive
|
|
75
75
|
// (a server-rendered component can't run its client teardown path).
|
|
76
|
-
this.
|
|
76
|
+
this.#checkInterval.unref?.();
|
|
77
77
|
doc.on('destroy', () => {
|
|
78
78
|
this.destroy();
|
|
79
79
|
});
|
|
@@ -87,7 +87,7 @@ export class Awareness extends IsolatedObservable {
|
|
|
87
87
|
this.emit('destroy', [this]);
|
|
88
88
|
this.setLocalState(null);
|
|
89
89
|
super.destroy();
|
|
90
|
-
clearInterval(this
|
|
90
|
+
clearInterval(this.#checkInterval);
|
|
91
91
|
}
|
|
92
92
|
getLocalState() {
|
|
93
93
|
return this.states.get(this.clientID) || null;
|
|
@@ -121,7 +121,7 @@ export class Awareness extends IsolatedObservable {
|
|
|
121
121
|
}
|
|
122
122
|
else {
|
|
123
123
|
updated.push(clientID);
|
|
124
|
-
if (!
|
|
124
|
+
if (!jsonEquals(prevState, state)) {
|
|
125
125
|
filteredUpdated.push(clientID);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -168,20 +168,12 @@ export const removeAwarenessStates = (awareness, clients, origin) => {
|
|
|
168
168
|
awareness.emit('update', [{ added: [], updated: [], removed }, origin]);
|
|
169
169
|
}
|
|
170
170
|
};
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const state = states.get(clientID) || null;
|
|
178
|
-
const clock = awareness.meta.get(clientID).clock;
|
|
179
|
-
encoding.writeVarUint(encoder, clientID);
|
|
180
|
-
encoding.writeVarUint(encoder, clock);
|
|
181
|
-
encoding.writeVarString(encoder, JSON.stringify(state));
|
|
182
|
-
}
|
|
183
|
-
return encoding.toUint8Array(encoder);
|
|
184
|
-
};
|
|
171
|
+
/** The update carrying `clients`' entries of `awareness` (their states in `states`). */
|
|
172
|
+
export const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => writeAwarenessEntries(clients.map((clientID) => ({
|
|
173
|
+
clientID,
|
|
174
|
+
clock: awareness.meta.get(clientID).clock,
|
|
175
|
+
state: states.get(clientID) || null
|
|
176
|
+
})));
|
|
185
177
|
/**
|
|
186
178
|
* Instance-free awareness codec: decode an update into its entries. Pure —
|
|
187
179
|
* no `Awareness` (whose constructor starts an interval), so a relay that
|
|
@@ -195,7 +187,7 @@ export const readAwarenessEntries = (update) => {
|
|
|
195
187
|
state: JSON.parse(decoding.readVarString(decoder))
|
|
196
188
|
}));
|
|
197
189
|
};
|
|
198
|
-
/** Instance-free awareness codec: encode entries as an update
|
|
190
|
+
/** Instance-free awareness codec: encode entries as an update. */
|
|
199
191
|
export const writeAwarenessEntries = (entries) => encoding.encode((encoder) => {
|
|
200
192
|
encoding.writeVarUint(encoder, entries.length);
|
|
201
193
|
for (const { clientID, clock, state } of entries) {
|
|
@@ -204,27 +196,19 @@ export const writeAwarenessEntries = (entries) => encoding.encode((encoder) => {
|
|
|
204
196
|
encoding.writeVarString(encoder, JSON.stringify(state));
|
|
205
197
|
}
|
|
206
198
|
});
|
|
207
|
-
/**
|
|
208
|
-
* Modify the content of an awareness update before re-encoding it to an
|
|
209
|
-
* awareness update — e.g. a central server preventing identity hijacking.
|
|
210
|
-
*/
|
|
211
|
-
export const modifyAwarenessUpdate = (update, modify) => writeAwarenessEntries(readAwarenessEntries(update).map((entry) => ({ ...entry, state: modify(entry.state) })));
|
|
212
199
|
/**
|
|
213
200
|
* Apply an encoded awareness update. `origin` is forwarded on the emitted
|
|
214
201
|
* change/update events.
|
|
215
202
|
*/
|
|
216
203
|
export const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
217
|
-
const decoder = decoding.createDecoder(update);
|
|
218
204
|
const timestamp = time.getUnixTime();
|
|
219
205
|
const added = [];
|
|
220
206
|
const updated = [];
|
|
221
207
|
const filteredUpdated = [];
|
|
222
208
|
const removed = [];
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
let clock = decoding.readVarUint(decoder);
|
|
227
|
-
const state = JSON.parse(decoding.readVarString(decoder));
|
|
209
|
+
for (const entry of readAwarenessEntries(update)) {
|
|
210
|
+
const { clientID, state } = entry;
|
|
211
|
+
let { clock } = entry;
|
|
228
212
|
const clientMeta = awareness.meta.get(clientID);
|
|
229
213
|
const prevState = awareness.states.get(clientID);
|
|
230
214
|
const currClock = clientMeta === undefined ? 0 : clientMeta.clock;
|
|
@@ -255,7 +239,7 @@ export const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
|
255
239
|
removed.push(clientID);
|
|
256
240
|
}
|
|
257
241
|
else if (state !== null) {
|
|
258
|
-
if (!
|
|
242
|
+
if (!jsonEquals(state, prevState)) {
|
|
259
243
|
filteredUpdated.push(clientID);
|
|
260
244
|
}
|
|
261
245
|
updated.push(clientID);
|