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
|
@@ -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
|
};
|
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);
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* ```
|
|
9
9
|
* varuint GENERATION | varuint messageType | payload
|
|
10
|
-
* GENERATION = PROTOCOL_VERSION * 1000 + SCHEMA_VERSION (
|
|
10
|
+
* GENERATION = PROTOCOL_VERSION * 1000 + SCHEMA_VERSION (14006 at schema 6)
|
|
11
11
|
* ```
|
|
12
12
|
*
|
|
13
13
|
* The word names the whole generation — engine and wire (the protocol,
|
|
@@ -35,47 +35,27 @@ export declare const generationWord: (schema: number) => number;
|
|
|
35
35
|
export declare const GENERATION: number;
|
|
36
36
|
/**
|
|
37
37
|
* Storage-generation prefix for the v14 IndexedDB databases: one database
|
|
38
|
-
* per schema generation
|
|
39
|
-
*
|
|
38
|
+
* per schema generation, so an earlier generation's store is left as it
|
|
39
|
+
* was beside its successor (and never read).
|
|
40
40
|
*/
|
|
41
|
-
export declare const GENERATION_PREFIX
|
|
42
|
-
/** The prefix of the IndexedDB databases of schema generations 1 to 4. */
|
|
43
|
-
export declare const PREVIOUS_GENERATION_PREFIX = "edytor-v14:";
|
|
41
|
+
export declare const GENERATION_PREFIX: string;
|
|
44
42
|
/** The IndexedDB name a v14 provider uses for logical document `name`. */
|
|
45
43
|
export declare const generationDbName: (name: string) => string;
|
|
46
44
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
* a compressed snapshot starts with gzip's `1f 8b`, a v2 update with
|
|
51
|
-
* `00`). Update rows stay v1 in both: a keystroke's update is smaller in
|
|
52
|
-
* v1 (24 bytes against 28, a one-character delete 13 against 24).
|
|
45
|
+
* Record written to the `custom` store marking a DB as this generation's.
|
|
46
|
+
* Every row of a container holds an update in the engine's one encoding;
|
|
47
|
+
* a snapshot row may be gzip-compressed (`crdt/storage.ts`).
|
|
53
48
|
*/
|
|
54
|
-
export type StorageFormat = 'v1' | 'v2';
|
|
55
|
-
/** Record written to the `custom` store marking a DB as this generation's. */
|
|
56
49
|
export type GenerationRecord = {
|
|
57
50
|
engine: 'yjs-v14';
|
|
58
51
|
protocol: number;
|
|
59
52
|
schema: number;
|
|
60
|
-
/** Absent: `'v1'` (written before the v2 snapshots). */
|
|
61
|
-
storage?: StorageFormat;
|
|
62
53
|
};
|
|
63
54
|
export declare const GENERATION_KEY = "generation";
|
|
64
|
-
/** This generation's
|
|
55
|
+
/** This generation's record. */
|
|
65
56
|
export declare const GENERATION_RECORD: GenerationRecord;
|
|
66
|
-
/**
|
|
67
|
-
export declare const STORAGE_FORMAT: StorageFormat;
|
|
68
|
-
/** The record this build stamps a container with (its generation and its storage format). */
|
|
69
|
-
export declare const STORED_GENERATION_RECORD: GenerationRecord;
|
|
70
|
-
/**
|
|
71
|
-
* Is `v` this generation's container record? A record without `schema` was
|
|
72
|
-
* written before the schema joined the generation, by builds that spoke
|
|
73
|
-
* schema 1 only — it is a schema-1 record. A storage format this build
|
|
74
|
-
* does not read (a later one) is another generation's.
|
|
75
|
-
*/
|
|
57
|
+
/** Is `v` this generation's container record? Any other is refused, never read. */
|
|
76
58
|
export declare const isGenerationRecord: (v: unknown) => v is GenerationRecord;
|
|
77
|
-
/** The storage format of a container record ({@link isGenerationRecord} first). */
|
|
78
|
-
export declare const storageOf: (record: GenerationRecord) => StorageFormat;
|
|
79
59
|
export declare class GenerationMismatchError extends Error {
|
|
80
60
|
readonly dbName: string;
|
|
81
61
|
readonly found: unknown;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* ```
|
|
9
9
|
* varuint GENERATION | varuint messageType | payload
|
|
10
|
-
* GENERATION = PROTOCOL_VERSION * 1000 + SCHEMA_VERSION (
|
|
10
|
+
* GENERATION = PROTOCOL_VERSION * 1000 + SCHEMA_VERSION (14006 at schema 6)
|
|
11
11
|
* ```
|
|
12
12
|
*
|
|
13
13
|
* The word names the whole generation — engine and wire (the protocol,
|
|
@@ -36,47 +36,30 @@ export const generationWord = (schema) => PROTOCOL_VERSION * 1000 + schema;
|
|
|
36
36
|
export const GENERATION = generationWord(SCHEMA_VERSION);
|
|
37
37
|
/**
|
|
38
38
|
* Storage-generation prefix for the v14 IndexedDB databases: one database
|
|
39
|
-
* per schema generation
|
|
40
|
-
*
|
|
39
|
+
* per schema generation, so an earlier generation's store is left as it
|
|
40
|
+
* was beside its successor (and never read).
|
|
41
41
|
*/
|
|
42
|
-
export const GENERATION_PREFIX =
|
|
43
|
-
/** The prefix of the IndexedDB databases of schema generations 1 to 4. */
|
|
44
|
-
export const PREVIOUS_GENERATION_PREFIX = 'edytor-v14:';
|
|
42
|
+
export const GENERATION_PREFIX = `edytor-v14-g${SCHEMA_VERSION}:`;
|
|
45
43
|
/** The IndexedDB name a v14 provider uses for logical document `name`. */
|
|
46
44
|
export const generationDbName = (name) => GENERATION_PREFIX + name;
|
|
47
45
|
export const GENERATION_KEY = 'generation';
|
|
48
|
-
/** This generation's
|
|
46
|
+
/** This generation's record. */
|
|
49
47
|
export const GENERATION_RECORD = {
|
|
50
48
|
engine: 'yjs-v14',
|
|
51
49
|
protocol: PROTOCOL_VERSION,
|
|
52
50
|
schema: SCHEMA_VERSION
|
|
53
51
|
};
|
|
54
|
-
/**
|
|
55
|
-
export const STORAGE_FORMAT = 'v2';
|
|
56
|
-
/** The record this build stamps a container with (its generation and its storage format). */
|
|
57
|
-
export const STORED_GENERATION_RECORD = {
|
|
58
|
-
...GENERATION_RECORD,
|
|
59
|
-
storage: STORAGE_FORMAT
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Is `v` this generation's container record? A record without `schema` was
|
|
63
|
-
* written before the schema joined the generation, by builds that spoke
|
|
64
|
-
* schema 1 only — it is a schema-1 record. A storage format this build
|
|
65
|
-
* does not read (a later one) is another generation's.
|
|
66
|
-
*/
|
|
52
|
+
/** Is `v` this generation's container record? Any other is refused, never read. */
|
|
67
53
|
export const isGenerationRecord = (v) => typeof v === 'object' &&
|
|
68
54
|
v !== null &&
|
|
69
55
|
v.engine === GENERATION_RECORD.engine &&
|
|
70
56
|
v.protocol === GENERATION_RECORD.protocol &&
|
|
71
|
-
|
|
72
|
-
[undefined, 'v1', 'v2'].includes(v.storage);
|
|
73
|
-
/** The storage format of a container record ({@link isGenerationRecord} first). */
|
|
74
|
-
export const storageOf = (record) => record.storage ?? 'v1';
|
|
57
|
+
v.schema === SCHEMA_VERSION;
|
|
75
58
|
export class GenerationMismatchError extends Error {
|
|
76
59
|
dbName;
|
|
77
60
|
found;
|
|
78
61
|
constructor(dbName, found) {
|
|
79
|
-
super(`Stored document "${dbName}" is not a v14 document generation of this schema (found ${JSON.stringify(found)}). It is never applied —
|
|
62
|
+
super(`Stored document "${dbName}" is not a v14 document generation of this schema (found ${JSON.stringify(found)}). It is never applied — re-import the document from JSON.`);
|
|
80
63
|
this.dbName = dbName;
|
|
81
64
|
this.found = found;
|
|
82
65
|
this.name = 'GenerationMismatchError';
|
|
@@ -7,38 +7,28 @@
|
|
|
7
7
|
* (`applyRemote`) and are stamped with a non-null `remoteApplyOrigin` so
|
|
8
8
|
* echo suppression + undo exclusion keep working.
|
|
9
9
|
*
|
|
10
|
-
* Wire format (y-protocols' layout;
|
|
11
|
-
* schema generation
|
|
10
|
+
* Wire format (y-protocols' layout; every update in the engine's one
|
|
11
|
+
* encoding, the columnar one upstream calls v2, since schema generation 6):
|
|
12
12
|
*
|
|
13
13
|
* ```
|
|
14
14
|
* varuint messageType | payload
|
|
15
15
|
* messageType 0 (SyncStep1): varuint8array stateVector
|
|
16
|
-
* messageType 1 (SyncStep2): varuint8array update
|
|
17
|
-
* messageType 2 (Update): varuint8array update
|
|
16
|
+
* messageType 1 (SyncStep2): varuint8array update
|
|
17
|
+
* messageType 2 (Update): varuint8array update
|
|
18
18
|
* ```
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* relayed as it is. A receiver converts a SyncStep2 to v1
|
|
27
|
-
* ({@link step2Update}) and applies it through the one inbound path. That does NOT mean v13 and v14 peers are interchangeable — the
|
|
28
|
-
* provider layer (`providers/*`) wraps every message in the protocol-version
|
|
29
|
-
* envelope (`protocols/envelope.ts`) so engines that do not speak v14 never
|
|
30
|
-
* reach `readSyncMessage`.
|
|
20
|
+
* What the engine emits on `doc.on('update')` is relayed as it is, and a
|
|
21
|
+
* SyncStep2 is applied through the same inbound path as an Update. That
|
|
22
|
+
* does NOT mean v13 and v14 peers are interchangeable — the provider layer
|
|
23
|
+
* (`providers/*`) wraps every message in the protocol-version envelope
|
|
24
|
+
* (`protocols/envelope.ts`) so engines that do not speak v14 never reach
|
|
25
|
+
* {@link applyRemote}.
|
|
31
26
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* exist for harnesses/custom transports; the shipped providers do not
|
|
38
|
-
* route room traffic through them.
|
|
39
|
-
* - The path the providers use lives in `providers/room.ts`:
|
|
40
|
-
* `applyRemote` + per-type dispatch, so a refused payload never mutates
|
|
41
|
-
* the live doc and an unknown type is a reported drop, not a throw.
|
|
27
|
+
* One inbound path: every payload a client or a server receives applies
|
|
28
|
+
* through `applyRemote`, which refuses a forged schema stamp before
|
|
29
|
+
* anything integrates; the providers dispatch by message type in
|
|
30
|
+
* `providers/room.ts` (an unknown type is a reported drop), the room in
|
|
31
|
+
* `cloudflare/room/admission.ts`.
|
|
42
32
|
*
|
|
43
33
|
* Engine functions are injected (`bindSync(Y)`): `src/lib` never
|
|
44
34
|
* runtime-imports the vendored `.js` (see `engine-api.ts`), so the caller
|
|
@@ -68,12 +58,7 @@ export declare const bindSync: (Y: EngineApi) => {
|
|
|
68
58
|
remoteApplyOrigin: symbol;
|
|
69
59
|
writeSyncStep1: (encoder: encoding.Encoder, doc: YDoc) => void;
|
|
70
60
|
writeSyncStep2: (encoder: encoding.Encoder, doc: YDoc, encodedStateVector?: Uint8Array) => void;
|
|
71
|
-
step2Update: (payload: Uint8Array) => Uint8Array;
|
|
72
|
-
readSyncStep1: (decoder: decoding.Decoder, encoder: encoding.Encoder, doc: YDoc) => void;
|
|
73
|
-
readSyncStep2: (decoder: decoding.Decoder, doc: YDoc, transactionOrigin: unknown, errorHandler?: (error: Error) => unknown) => void;
|
|
74
61
|
writeUpdate: (encoder: encoding.Encoder, update: Uint8Array) => void;
|
|
75
|
-
readUpdate: (decoder: decoding.Decoder, doc: YDoc, transactionOrigin: unknown, errorHandler?: (error: Error) => unknown) => void;
|
|
76
|
-
readSyncMessage: (decoder: decoding.Decoder, encoder: encoding.Encoder, doc: YDoc, transactionOrigin: unknown, errorHandler?: (error: Error) => unknown) => number;
|
|
77
62
|
applyRemote: (doc: YDoc, update: Uint8Array, transactionOrigin: unknown, errorHandler?: (error: Error) => unknown) => {
|
|
78
63
|
applied: boolean;
|
|
79
64
|
problem: SchemaProblem | null;
|