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
|
@@ -62,7 +62,7 @@ export class ReplicaRegistry {
|
|
|
62
62
|
return true;
|
|
63
63
|
this.register([{ replica, user }]);
|
|
64
64
|
this.room.note({ reason: 'orphan', detail: { replica, user } });
|
|
65
|
-
this
|
|
65
|
+
this.#bindOrphan(replica, user);
|
|
66
66
|
return true;
|
|
67
67
|
}
|
|
68
68
|
if (owner !== undefined || (sv.get(replica) ?? 0) > 0)
|
|
@@ -120,7 +120,7 @@ export class ReplicaRegistry {
|
|
|
120
120
|
* room holds content of it. A failed write is healed here, the claim
|
|
121
121
|
* kept (the binding then stays as it was).
|
|
122
122
|
*/
|
|
123
|
-
bindOrphan(replica, user) {
|
|
123
|
+
#bindOrphan(replica, user) {
|
|
124
124
|
const room = this.room;
|
|
125
125
|
const doc = room.live;
|
|
126
126
|
if (doc === null || (stateVector(doc).get(replica) ?? 0) === 0)
|
|
@@ -3,6 +3,7 @@ import { type Decoded, type RoomContext } from './context.js';
|
|
|
3
3
|
/** A stored record's kind. `pending`: deletes of items the room does not hold yet (they wait for them). */
|
|
4
4
|
type RowKind = StoredRecord['kind'];
|
|
5
5
|
export declare class RoomStorage {
|
|
6
|
+
#private;
|
|
6
7
|
private readonly room;
|
|
7
8
|
/** The failure is the storage's (a failed read, `onLoad`'s store down): the next dial starts again. */
|
|
8
9
|
retryable: boolean;
|
|
@@ -10,8 +11,6 @@ export declare class RoomStorage {
|
|
|
10
11
|
updates: number;
|
|
11
12
|
/** What the records hold, uncompressed (the generation record aside): the document quota's measure. */
|
|
12
13
|
documentBytes: number;
|
|
13
|
-
/** The size passed `documentWarning` of the quota and was logged (memory: a wake logs it again). */
|
|
14
|
-
private warned;
|
|
15
14
|
/**
|
|
16
15
|
* Log the document's size when it passes `documentWarning` of its quota
|
|
17
16
|
* (`room.quota.warning`): once per crossing; under it again, the next
|
|
@@ -26,13 +25,8 @@ export declare class RoomStorage {
|
|
|
26
25
|
* would write is closed before it is applied, so an outage rebuilds once.
|
|
27
26
|
*/
|
|
28
27
|
outage: unknown;
|
|
29
|
-
private nextRecord;
|
|
30
|
-
/** The snapshot compression in flight (`compressed()`). */
|
|
31
|
-
private compressing;
|
|
32
28
|
/** The raw bytes of the compressed snapshot record (`records` reads it; only `start` can inflate). */
|
|
33
29
|
private inflated;
|
|
34
|
-
/** Alarms in a row that found the rows unreadable: each re-arms later. */
|
|
35
|
-
private saveRetries;
|
|
36
30
|
constructor(room: RoomContext);
|
|
37
31
|
/**
|
|
38
32
|
* Restore from storage, or seed from `onLoad`. Never throws: a throw
|
|
@@ -69,24 +63,12 @@ export declare class RoomStorage {
|
|
|
69
63
|
* engine refuses) is refused for good.
|
|
70
64
|
*/
|
|
71
65
|
private load;
|
|
72
|
-
/**
|
|
73
|
-
* The generation cutover at load (`room.generation.convert`): the
|
|
74
|
-
* records of a generation-4 container are read as JSON
|
|
75
|
-
* (`crdt.generations.previousJSON`), which this generation seeds as
|
|
76
|
-
* `onLoad`'s JSON is (deterministic: every replica converting the same
|
|
77
|
-
* state writes the same update), and the container is replaced by it in
|
|
78
|
-
* one storage transaction: rows, replicas, purge epochs, slot editors
|
|
79
|
-
* and the stored restore go; the document data, the alarm's due tasks
|
|
80
|
-
* and `lastUpdated` stay. What a generation-4 client never sent is not
|
|
81
|
-
* in it; history, attribution and CRDT identity do not cross.
|
|
82
|
-
*/
|
|
83
|
-
private convert;
|
|
84
66
|
/** The bytes of the stored `pending` records (uncompressed, as every record but a snapshot). */
|
|
85
67
|
pendingBytes(): number;
|
|
86
68
|
/**
|
|
87
69
|
* Reassembled logical records in write order (of one kind, with
|
|
88
|
-
* `only`); a torn record throws. A
|
|
89
|
-
* (
|
|
70
|
+
* `only`); a torn record throws. A snapshot stored compressed is
|
|
71
|
+
* inflated (gzip's magic never starts an update nor the record's JSON).
|
|
90
72
|
*/
|
|
91
73
|
records(only?: RowKind): StoredRecord[];
|
|
92
74
|
/**
|
|
@@ -95,17 +77,6 @@ export declare class RoomStorage {
|
|
|
95
77
|
* generation record with it.
|
|
96
78
|
*/
|
|
97
79
|
insert(kind: RowKind, bytes: Uint8Array): number;
|
|
98
|
-
/** Record `record`'s rows (at the row positions `seqs`, when given). */
|
|
99
|
-
private writeRecord;
|
|
100
|
-
/**
|
|
101
|
-
* Compress snapshot `record` in place once it is stored: gzip is
|
|
102
|
-
* asynchronous, and the store-before-ack path is not. Its rows are
|
|
103
|
-
* rewritten (at their positions) only while it is still the stored
|
|
104
|
-
* snapshot and only when that shrinks it; the raw bytes stay in memory
|
|
105
|
-
* (`inflated`) for a rebuild's synchronous read. A platform without
|
|
106
|
-
* `CompressionStream` keeps it raw.
|
|
107
|
-
*/
|
|
108
|
-
private compressLater;
|
|
109
80
|
/** Resolves once the snapshot compression in flight, if any, is stored. */
|
|
110
81
|
compressed(): Promise<void>;
|
|
111
82
|
/** Compaction (`AttachedDocument.compact`). */
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { Y } from '../../crdt/engine.js';
|
|
10
10
|
import * as E from '../../crdt/protocol.js';
|
|
11
|
-
import {
|
|
11
|
+
import { GENERATION_RECORD, isGenerationRecord } from '../../crdt/protocols/envelope.js';
|
|
12
12
|
import { gunzip, isGzip, packed } from '../../crdt/storage.js';
|
|
13
13
|
import { SOCKET_TAG, noTimers } from './shared.js';
|
|
14
14
|
import { parseReplica } from './access.js';
|
|
@@ -55,8 +55,6 @@ const loadedUpdate = (found, seed) => {
|
|
|
55
55
|
}
|
|
56
56
|
throw new TypeError('onLoad returned neither a JSONDoc, a v14 update nor { update, replicas }');
|
|
57
57
|
};
|
|
58
|
-
/** How many blocks `children` holds, nested ones included. */
|
|
59
|
-
const countBlocks = (children) => children.reduce((n, block) => n + 1 + countBlocks(block.children ?? []), 0);
|
|
60
58
|
/** Rows grouped into their records, in write order; a record missing rows throws. */
|
|
61
59
|
const reassemble = (rows) => {
|
|
62
60
|
const byRecord = new Map();
|
|
@@ -94,7 +92,7 @@ export class RoomStorage {
|
|
|
94
92
|
/** What the records hold, uncompressed (the generation record aside): the document quota's measure. */
|
|
95
93
|
documentBytes = 0;
|
|
96
94
|
/** The size passed `documentWarning` of the quota and was logged (memory: a wake logs it again). */
|
|
97
|
-
warned = false;
|
|
95
|
+
#warned = false;
|
|
98
96
|
/**
|
|
99
97
|
* Log the document's size when it passes `documentWarning` of its quota
|
|
100
98
|
* (`room.quota.warning`): once per crossing; under it again, the next
|
|
@@ -104,12 +102,12 @@ export class RoomStorage {
|
|
|
104
102
|
const room = this.room;
|
|
105
103
|
const { maxDocumentBytes: limit, documentWarning: share } = room.limits;
|
|
106
104
|
if (this.documentBytes < limit * share) {
|
|
107
|
-
this
|
|
105
|
+
this.#warned = false;
|
|
108
106
|
return;
|
|
109
107
|
}
|
|
110
|
-
if (this
|
|
108
|
+
if (this.#warned)
|
|
111
109
|
return;
|
|
112
|
-
this
|
|
110
|
+
this.#warned = true;
|
|
113
111
|
room.log({ edytor: 'size', bytes: this.documentBytes, limit, share });
|
|
114
112
|
}
|
|
115
113
|
/** The waiting deletes stored as `pending` records (the engine may hold more, in memory). */
|
|
@@ -120,13 +118,13 @@ export class RoomStorage {
|
|
|
120
118
|
* would write is closed before it is applied, so an outage rebuilds once.
|
|
121
119
|
*/
|
|
122
120
|
outage = null;
|
|
123
|
-
nextRecord = 0;
|
|
121
|
+
#nextRecord = 0;
|
|
124
122
|
/** The snapshot compression in flight (`compressed()`). */
|
|
125
|
-
compressing = Promise.resolve();
|
|
123
|
+
#compressing = Promise.resolve();
|
|
126
124
|
/** The raw bytes of the compressed snapshot record (`records` reads it; only `start` can inflate). */
|
|
127
125
|
inflated = null;
|
|
128
126
|
/** Alarms in a row that found the rows unreadable: each re-arms later. */
|
|
129
|
-
saveRetries = 0;
|
|
127
|
+
#saveRetries = 0;
|
|
130
128
|
constructor(room) {
|
|
131
129
|
this.room = room;
|
|
132
130
|
}
|
|
@@ -290,7 +288,7 @@ export class RoomStorage {
|
|
|
290
288
|
room.live?.destroy();
|
|
291
289
|
this.adopt(doc);
|
|
292
290
|
this.storedWaiting = waiting;
|
|
293
|
-
this
|
|
291
|
+
this.#compressLater(record, snapshot);
|
|
294
292
|
});
|
|
295
293
|
}
|
|
296
294
|
/**
|
|
@@ -329,7 +327,7 @@ export class RoomStorage {
|
|
|
329
327
|
)`);
|
|
330
328
|
room.scheduler.readDues();
|
|
331
329
|
room.history.loadRestore();
|
|
332
|
-
this
|
|
330
|
+
this.#nextRecord = 0;
|
|
333
331
|
records = this.records();
|
|
334
332
|
}
|
|
335
333
|
catch (error) {
|
|
@@ -346,16 +344,12 @@ export class RoomStorage {
|
|
|
346
344
|
}
|
|
347
345
|
const [generation, ...rest] = records;
|
|
348
346
|
const found = JSON.parse(new TextDecoder().decode(generation.bytes));
|
|
349
|
-
// A container of generation 4 converts through its JSON (`room.generation.convert`).
|
|
350
|
-
if (generation.kind === 'generation' && E.isPreviousGenerationRecord(found)) {
|
|
351
|
-
return this.convert(rest);
|
|
352
|
-
}
|
|
353
347
|
if (generation.kind !== 'generation' || !isGenerationRecord(found)) {
|
|
354
348
|
throw new E.GenerationMismatchError(`room ${room.ctx.id}`, found);
|
|
355
349
|
}
|
|
356
350
|
// Applied in one transaction, never merged first: a merge of the
|
|
357
351
|
// records keeps every keystroke's struct and the deleted content.
|
|
358
|
-
const doc = admit(rest.map((record) =>
|
|
352
|
+
const doc = admit(rest.map((record) => record.bytes), `room ${room.ctx.id}`, () => room.history.restoreKeep);
|
|
359
353
|
this.documentBytes = rest.reduce((n, record) => n + record.bytes.length, 0);
|
|
360
354
|
this.watch();
|
|
361
355
|
this.adopt(doc);
|
|
@@ -368,59 +362,6 @@ export class RoomStorage {
|
|
|
368
362
|
this.fail(error, false);
|
|
369
363
|
}
|
|
370
364
|
}
|
|
371
|
-
/**
|
|
372
|
-
* The generation cutover at load (`room.generation.convert`): the
|
|
373
|
-
* records of a generation-4 container are read as JSON
|
|
374
|
-
* (`crdt.generations.previousJSON`), which this generation seeds as
|
|
375
|
-
* `onLoad`'s JSON is (deterministic: every replica converting the same
|
|
376
|
-
* state writes the same update), and the container is replaced by it in
|
|
377
|
-
* one storage transaction: rows, replicas, purge epochs, slot editors
|
|
378
|
-
* and the stored restore go; the document data, the alarm's due tasks
|
|
379
|
-
* and `lastUpdated` stay. What a generation-4 client never sent is not
|
|
380
|
-
* in it; history, attribution and CRDT identity do not cross.
|
|
381
|
-
*/
|
|
382
|
-
convert(records) {
|
|
383
|
-
const room = this.room;
|
|
384
|
-
const { sql, tables } = room;
|
|
385
|
-
const json = crdt.generations.previousJSON(records.map((record) => (record.v2 ? { v2: record.bytes } : record.bytes)), (doc) => room.facadeOf(doc));
|
|
386
|
-
const scratch = crdt.createDoc();
|
|
387
|
-
const facade = room.facadeOf(scratch);
|
|
388
|
-
facade.seed(json.children, json.data);
|
|
389
|
-
facade.dispose();
|
|
390
|
-
const update = Y.encodeStateAsUpdate(scratch);
|
|
391
|
-
scratch.destroy();
|
|
392
|
-
const doc = admit(update, `room ${room.ctx.id} conversion`, () => room.history.restoreKeep);
|
|
393
|
-
const snapshot = liveState(doc);
|
|
394
|
-
room.ctx.storage.transactionSync(() => {
|
|
395
|
-
for (const table of [
|
|
396
|
-
tables.rows,
|
|
397
|
-
tables.replicas,
|
|
398
|
-
tables.epochs,
|
|
399
|
-
tables.editors,
|
|
400
|
-
tables.restore
|
|
401
|
-
])
|
|
402
|
-
sql.exec(`DELETE FROM ${table}`);
|
|
403
|
-
this.nextRecord = 0;
|
|
404
|
-
this.insert('snapshot', snapshot);
|
|
405
|
-
this.touch();
|
|
406
|
-
for (const replica of stateVector(doc).keys())
|
|
407
|
-
sql.exec(`INSERT OR IGNORE INTO ${tables.replicas} (replica, user) VALUES (?, '')`, replica);
|
|
408
|
-
});
|
|
409
|
-
room.history.clearRestore();
|
|
410
|
-
this.documentBytes = snapshot.length;
|
|
411
|
-
this.watch();
|
|
412
|
-
this.updates = 0;
|
|
413
|
-
this.storedWaiting = Y.createIdSet();
|
|
414
|
-
this.adopt(doc);
|
|
415
|
-
room.state.origin = { kind: 'converted', from: E.PREVIOUS_SCHEMA, records: records.length };
|
|
416
|
-
room.log({
|
|
417
|
-
edytor: 'convert',
|
|
418
|
-
from: E.PREVIOUS_SCHEMA,
|
|
419
|
-
to: E.SCHEMA_VERSION,
|
|
420
|
-
blocks: countBlocks(json.children),
|
|
421
|
-
bytes: snapshot.length
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
365
|
/** The bytes of the stored `pending` records (uncompressed, as every record but a snapshot). */
|
|
425
366
|
pendingBytes() {
|
|
426
367
|
return (this.room.sql
|
|
@@ -429,35 +370,21 @@ export class RoomStorage {
|
|
|
429
370
|
}
|
|
430
371
|
/**
|
|
431
372
|
* Reassembled logical records in write order (of one kind, with
|
|
432
|
-
* `only`); a torn record throws. A
|
|
433
|
-
* (
|
|
373
|
+
* `only`); a torn record throws. A snapshot stored compressed is
|
|
374
|
+
* inflated (gzip's magic never starts an update nor the record's JSON).
|
|
434
375
|
*/
|
|
435
376
|
records(only) {
|
|
436
377
|
const rows = this.room.sql
|
|
437
378
|
.exec(`SELECT kind, record, part, parts, bytes FROM ${this.room.tables.rows}${only ? ' WHERE kind = ?' : ''} ORDER BY seq`, ...(only ? [only] : []))
|
|
438
379
|
.toArray();
|
|
439
380
|
for (const row of rows)
|
|
440
|
-
this
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
if (records[0]?.kind === 'generation') {
|
|
445
|
-
try {
|
|
446
|
-
const found = JSON.parse(new TextDecoder().decode(records[0].bytes));
|
|
447
|
-
if (isGenerationRecord(found) || E.isPreviousGenerationRecord(found))
|
|
448
|
-
format = storageOf(found);
|
|
449
|
-
}
|
|
450
|
-
catch {
|
|
451
|
-
// `load` refuses it
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
return records.map((record) => {
|
|
455
|
-
const v2 = format === 'v2' && record.kind === 'snapshot';
|
|
456
|
-
if (!v2 || !isGzip(record.bytes))
|
|
457
|
-
return { ...record, v2 };
|
|
381
|
+
this.#nextRecord = Math.max(this.#nextRecord, row.record + 1);
|
|
382
|
+
return reassemble(rows).map((record) => {
|
|
383
|
+
if (!isGzip(record.bytes))
|
|
384
|
+
return record;
|
|
458
385
|
if (this.inflated?.record !== record.record)
|
|
459
386
|
throw new CompressedRecord();
|
|
460
|
-
return { ...record, bytes: this.inflated.bytes
|
|
387
|
+
return { ...record, bytes: this.inflated.bytes };
|
|
461
388
|
});
|
|
462
389
|
}
|
|
463
390
|
/**
|
|
@@ -466,11 +393,11 @@ export class RoomStorage {
|
|
|
466
393
|
* generation record with it.
|
|
467
394
|
*/
|
|
468
395
|
insert(kind, bytes) {
|
|
469
|
-
if (this
|
|
470
|
-
this.insert('generation', encodeJSON(
|
|
396
|
+
if (this.#nextRecord === 0 && kind !== 'generation') {
|
|
397
|
+
this.insert('generation', encodeJSON(GENERATION_RECORD));
|
|
471
398
|
}
|
|
472
|
-
const record = this
|
|
473
|
-
this
|
|
399
|
+
const record = this.#nextRecord++;
|
|
400
|
+
this.#writeRecord(kind, record, bytes);
|
|
474
401
|
if (kind !== 'generation') {
|
|
475
402
|
this.documentBytes += bytes.length;
|
|
476
403
|
this.watch();
|
|
@@ -478,7 +405,7 @@ export class RoomStorage {
|
|
|
478
405
|
return record;
|
|
479
406
|
}
|
|
480
407
|
/** Record `record`'s rows (at the row positions `seqs`, when given). */
|
|
481
|
-
writeRecord(kind, record, bytes, seqs) {
|
|
408
|
+
#writeRecord(kind, record, bytes, seqs) {
|
|
482
409
|
const { sql, tables, limits } = this.room;
|
|
483
410
|
const parts = Math.max(1, Math.ceil(bytes.length / limits.maxRowBytes));
|
|
484
411
|
for (let part = 0; part < parts; part++) {
|
|
@@ -496,10 +423,9 @@ export class RoomStorage {
|
|
|
496
423
|
* asynchronous, and the store-before-ack path is not. Its rows are
|
|
497
424
|
* rewritten (at their positions) only while it is still the stored
|
|
498
425
|
* snapshot and only when that shrinks it; the raw bytes stay in memory
|
|
499
|
-
* (`inflated`) for a rebuild's synchronous read.
|
|
500
|
-
* `CompressionStream` keeps it raw.
|
|
426
|
+
* (`inflated`) for a rebuild's synchronous read.
|
|
501
427
|
*/
|
|
502
|
-
compressLater(record, raw) {
|
|
428
|
+
#compressLater(record, raw) {
|
|
503
429
|
const room = this.room;
|
|
504
430
|
const job = packed(raw)
|
|
505
431
|
.then((bytes) => noTimers(() => {
|
|
@@ -513,17 +439,17 @@ export class RoomStorage {
|
|
|
513
439
|
return;
|
|
514
440
|
room.ctx.storage.transactionSync(() => {
|
|
515
441
|
room.sql.exec(`DELETE FROM ${room.tables.rows} WHERE record = ?`, record);
|
|
516
|
-
this
|
|
442
|
+
this.#writeRecord('snapshot', record, bytes, rows.map((row) => row.seq));
|
|
517
443
|
});
|
|
518
444
|
this.inflated = { record, bytes: raw.slice() };
|
|
519
445
|
}))
|
|
520
446
|
.catch((error) => room.note({ reason: 'storage', detail: `compression: ${String(error)}` }));
|
|
521
|
-
this
|
|
447
|
+
this.#compressing = job;
|
|
522
448
|
room.ctx.waitUntil?.(job);
|
|
523
449
|
}
|
|
524
450
|
/** Resolves once the snapshot compression in flight, if any, is stored. */
|
|
525
451
|
async compressed() {
|
|
526
|
-
await this
|
|
452
|
+
await this.#compressing;
|
|
527
453
|
}
|
|
528
454
|
/** Compaction (`AttachedDocument.compact`). */
|
|
529
455
|
compact() {
|
|
@@ -550,7 +476,7 @@ export class RoomStorage {
|
|
|
550
476
|
.map(({ replica }) => replica);
|
|
551
477
|
const known = new Set([...registered, ...sockets]);
|
|
552
478
|
// Waiting deletes stay apart (a discarded forgery drops them,
|
|
553
|
-
//
|
|
479
|
+
// `#settleDeletes`): the stored ones the engine still holds waiting.
|
|
554
480
|
const all = pendingDeletes(doc);
|
|
555
481
|
const stored = storedPending(pending);
|
|
556
482
|
const waiting = Y.diffIdSet(stored, Y.diffIdSet(stored, all));
|
|
@@ -563,8 +489,7 @@ export class RoomStorage {
|
|
|
563
489
|
room.ctx.storage.transactionSync(() => {
|
|
564
490
|
sql.exec(`DELETE FROM ${tables.rows}`);
|
|
565
491
|
this.documentBytes = 0;
|
|
566
|
-
|
|
567
|
-
this.insert('generation', encodeJSON(STORED_GENERATION_RECORD));
|
|
492
|
+
this.insert('generation', encodeJSON(GENERATION_RECORD));
|
|
568
493
|
record = this.insert('snapshot', snapshot);
|
|
569
494
|
if (!still.isEmpty())
|
|
570
495
|
this.insert('pending', deletesUpdate(still));
|
|
@@ -581,7 +506,7 @@ export class RoomStorage {
|
|
|
581
506
|
}
|
|
582
507
|
this.updates = 0;
|
|
583
508
|
this.storedWaiting = still;
|
|
584
|
-
this
|
|
509
|
+
this.#compressLater(record, snapshot);
|
|
585
510
|
// Unknown ids' deletes go, the ones waiting in memory with a rewrite too.
|
|
586
511
|
forgetWaiting(doc, addIds(Y.createIdSet(), all, (client) => !known.has(client)));
|
|
587
512
|
const rows = sql.exec(`SELECT COUNT(*) AS n FROM ${tables.rows}`).one().n;
|
|
@@ -778,10 +703,10 @@ export class RoomStorage {
|
|
|
778
703
|
if (room.live === null) {
|
|
779
704
|
if (!this.retryable)
|
|
780
705
|
return scheduler.unschedule('save');
|
|
781
|
-
const wait = Math.min(room.limits.saveAfter * 2 ** ++this
|
|
706
|
+
const wait = Math.min(room.limits.saveAfter * 2 ** ++this.#saveRetries, MAX_SAVE_RETRY);
|
|
782
707
|
return scheduler.schedule('save', room.clock() + wait, 'replace');
|
|
783
708
|
}
|
|
784
|
-
this
|
|
709
|
+
this.#saveRetries = 0;
|
|
785
710
|
const due = scheduler.due('save');
|
|
786
711
|
// Cleared first: a change during `onSave` arms the next one.
|
|
787
712
|
scheduler.unschedule('save');
|
|
@@ -13,6 +13,8 @@ export declare const heldClock: (doc: YDoc, client: number) => number;
|
|
|
13
13
|
export declare const storedStruct: (doc: YDoc, client: number, clock: number) => import("../../crdt/vendor/yjs/dts/index.js").Item | import("../../crdt/vendor/yjs/dts/index.js").GC | null;
|
|
14
14
|
/** The struct of `run` (one client's, in clock order) at `clock`, or `undefined`. */
|
|
15
15
|
export declare const structAt: (run: Struct[], clock: number) => Struct | undefined;
|
|
16
|
+
/** A frame's structs by client, each run in clock order. */
|
|
17
|
+
export declare const runsOf: (structs: Struct[]) => Map<number, Struct[]>;
|
|
16
18
|
/**
|
|
17
19
|
* The map entries that the rewrites among `structs` which `pick` selects
|
|
18
20
|
* replace (a rewrite deletes the entry it replaces: storing that delete
|
|
@@ -56,7 +58,7 @@ export declare const pendingDeletes: (doc: YDoc) => Decoded["ds"];
|
|
|
56
58
|
export declare const addIds: (into: Decoded["ds"], from: Decoded["ds"], keep?: (client: number) => boolean) => Decoded["ds"];
|
|
57
59
|
/** Whether two byte strings are equal. */
|
|
58
60
|
export declare const sameBytes: (a: Uint8Array, b: Uint8Array) => boolean;
|
|
59
|
-
/**
|
|
61
|
+
/** An update carrying only `deletes`. */
|
|
60
62
|
export declare const deletesUpdate: (deletes: Decoded["ds"]) => Uint8Array;
|
|
61
63
|
/** The engine forgets `ids` of its waiting deletes: it re-reads the others, which wait again. */
|
|
62
64
|
export declare const forgetWaiting: (doc: YDoc, ids: Decoded["ds"]) => void;
|
|
@@ -84,6 +86,4 @@ export declare const liveState: (doc: YDoc) => Uint8Array;
|
|
|
84
86
|
/** A fresh room document (`prepareRoomDoc`'s collection rules). */
|
|
85
87
|
export declare const roomDoc: (keep: () => Decoded["ds"] | null) => YDoc;
|
|
86
88
|
/** Admit stored or loaded updates into a room document (`prepareRoomDoc`'s collection rules). */
|
|
87
|
-
export declare const admit: (updates: Uint8Array |
|
|
88
|
-
v2: Uint8Array;
|
|
89
|
-
}>, name: string, keep: () => Decoded["ds"] | null) => YDoc;
|
|
89
|
+
export declare const admit: (updates: Uint8Array | Uint8Array[], name: string, keep: () => Decoded["ds"] | null) => YDoc;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as encoding from 'lib0-v14/encoding';
|
|
7
7
|
import { Y } from '../../crdt/engine.js';
|
|
8
|
-
import { asEngineDoc, keepFromCollection } from '../../crdt/structs.js';
|
|
8
|
+
import { asEngineDoc, keepFromCollection, structAt as storeStructAt } from '../../crdt/structs.js';
|
|
9
9
|
import { ROOM_ORIGIN } from './shared.js';
|
|
10
10
|
import { crdt } from './context.js';
|
|
11
11
|
export const stateVector = (doc) => Y.decodeStateVector(Y.encodeStateVector(doc));
|
|
@@ -39,18 +39,16 @@ export const storedStruct = (doc, client, clock) => {
|
|
|
39
39
|
return struct instanceof Y.Skip ? null : struct;
|
|
40
40
|
};
|
|
41
41
|
/** The struct of `run` (one client's, in clock order) at `clock`, or `undefined`. */
|
|
42
|
-
export const structAt = (run, clock) =>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
else
|
|
51
|
-
return run[mid];
|
|
42
|
+
export const structAt = (run, clock) => storeStructAt(Y, run, clock) ?? undefined;
|
|
43
|
+
/** A frame's structs by client, each run in clock order. */
|
|
44
|
+
export const runsOf = (structs) => {
|
|
45
|
+
const runs = new Map();
|
|
46
|
+
for (const struct of structs) {
|
|
47
|
+
const run = runs.get(struct.id.client) ?? [];
|
|
48
|
+
run.push(struct);
|
|
49
|
+
runs.set(struct.id.client, run);
|
|
52
50
|
}
|
|
53
|
-
return
|
|
51
|
+
return runs;
|
|
54
52
|
};
|
|
55
53
|
/**
|
|
56
54
|
* The map entries that the rewrites among `structs` which `pick` selects
|
|
@@ -63,12 +61,7 @@ export const structAt = (run, clock) => {
|
|
|
63
61
|
* or the frame holds collected, may be an entry.
|
|
64
62
|
*/
|
|
65
63
|
export const replacedEntries = (doc, structs, pick) => {
|
|
66
|
-
const frame =
|
|
67
|
-
for (const struct of structs) {
|
|
68
|
-
const run = frame.get(struct.id.client) ?? [];
|
|
69
|
-
run.push(struct);
|
|
70
|
-
frame.set(struct.id.client, run);
|
|
71
|
-
}
|
|
64
|
+
const frame = runsOf(structs);
|
|
72
65
|
const known = new Map();
|
|
73
66
|
const isEntry = (id) => {
|
|
74
67
|
const chain = new Set();
|
|
@@ -130,8 +123,8 @@ export const withoutClients = ({ structs, ds }, clients, doc, dropped = Y.create
|
|
|
130
123
|
run.push(struct);
|
|
131
124
|
kept.set(client, run);
|
|
132
125
|
}
|
|
133
|
-
// The
|
|
134
|
-
const encoder = new Y.
|
|
126
|
+
// The update layout: #clients, then per client #structs, client, first clock, structs.
|
|
127
|
+
const encoder = new Y.UpdateEncoder();
|
|
135
128
|
encoding.writeVarUint(encoder.restEncoder, kept.size);
|
|
136
129
|
for (const [client, run] of kept) {
|
|
137
130
|
encoding.writeVarUint(encoder.restEncoder, run.length);
|
|
@@ -222,7 +215,7 @@ export const releasedWaiting = (structs, stripped, before, after) => {
|
|
|
222
215
|
return false;
|
|
223
216
|
};
|
|
224
217
|
/** The deletes `doc`'s engine holds pending: of items it does not hold yet. */
|
|
225
|
-
export const pendingDeletes = (doc) => doc.store.pendingDs ? Y.
|
|
218
|
+
export const pendingDeletes = (doc) => doc.store.pendingDs ? Y.decodeUpdate(doc.store.pendingDs).ds : Y.createIdSet();
|
|
226
219
|
/** `into` with the ranges of `from` added — of the clients `keep` selects. */
|
|
227
220
|
export const addIds = (into, from, keep = () => true) => {
|
|
228
221
|
for (const [client, ranges] of from.clients) {
|
|
@@ -235,9 +228,9 @@ export const addIds = (into, from, keep = () => true) => {
|
|
|
235
228
|
};
|
|
236
229
|
/** Whether two byte strings are equal. */
|
|
237
230
|
export const sameBytes = (a, b) => a.length === b.length && a.every((byte, i) => byte === b[i]);
|
|
238
|
-
/**
|
|
231
|
+
/** An update carrying only `deletes`. */
|
|
239
232
|
export const deletesUpdate = (deletes) => {
|
|
240
|
-
const encoder = new Y.
|
|
233
|
+
const encoder = new Y.UpdateEncoder();
|
|
241
234
|
encoding.writeVarUint(encoder.restEncoder, 0); // no structs
|
|
242
235
|
Y.writeIdSet(encoder, deletes);
|
|
243
236
|
return encoder.toUint8Array();
|
|
@@ -307,7 +300,7 @@ export const withoutPending = (doc, read) => {
|
|
|
307
300
|
* waits (`withoutPending`). Memory never runs ahead of storage, so it
|
|
308
301
|
* holds exactly what the stored records hold, collected.
|
|
309
302
|
*/
|
|
310
|
-
export const liveState = (doc) => withoutPending(doc, () => Y.
|
|
303
|
+
export const liveState = (doc) => withoutPending(doc, () => Y.encodeStateAsUpdate(doc));
|
|
311
304
|
/**
|
|
312
305
|
* A room document's collection rules, before any update applies: it keeps
|
|
313
306
|
* what an editing replica keeps, and the content the last restore
|
|
@@ -24,10 +24,10 @@ export type Validation = {
|
|
|
24
24
|
off: () => void;
|
|
25
25
|
};
|
|
26
26
|
export declare class RoomValidation {
|
|
27
|
+
#private;
|
|
27
28
|
private readonly room;
|
|
28
29
|
/** The index `validate` reads (built at its first frame, for the live document). */
|
|
29
30
|
private validation;
|
|
30
|
-
private _validator;
|
|
31
31
|
constructor(room: RoomContext);
|
|
32
32
|
/**
|
|
33
33
|
* The frame check, resolved at first use: per-block locks (`locks`),
|
|
@@ -38,8 +38,6 @@ export declare class RoomValidation {
|
|
|
38
38
|
get active(): boolean;
|
|
39
39
|
/** The live document was replaced: the index read the old one. */
|
|
40
40
|
reset(): void;
|
|
41
|
-
/** A shown block's state, read from the facade (`null`: it does not show). */
|
|
42
|
-
private blockState;
|
|
43
41
|
/**
|
|
44
42
|
* The index `validate` reads, for `doc`, set to record the frame of
|
|
45
43
|
* `origin`: every shown block's state and each parent's children, built
|
|
@@ -48,8 +46,6 @@ export declare class RoomValidation {
|
|
|
48
46
|
* records the frame for its compensation.
|
|
49
47
|
*/
|
|
50
48
|
begin(doc: YDoc, origin: unknown): Validation;
|
|
51
|
-
/** Keep the index from one change report, recording what the frame being validated touched. */
|
|
52
|
-
private indexChange;
|
|
53
49
|
/**
|
|
54
50
|
* Ask `validate` about the frame just applied; a denial is
|
|
55
51
|
* compensated by the room's own transaction: the history undo of that
|
|
@@ -1,40 +1,19 @@
|
|
|
1
1
|
import { asEngineDoc } from '../../crdt/structs.js';
|
|
2
|
+
import { common } from '../../crdt/data.js';
|
|
2
3
|
import { ROOM_ORIGIN } from './shared.js';
|
|
3
4
|
import { lockedBlocks } from '../locks.js';
|
|
4
5
|
import { crdt } from './context.js';
|
|
5
|
-
/** The ids of `next` that left their order relative to the others both lists hold (a longest
|
|
6
|
+
/** The ids of `next` that left their order relative to the others both lists hold (a longest common run kept). */
|
|
6
7
|
const reordered = (previous, next) => {
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
const tails = [];
|
|
11
|
-
const links = new Array(common.length).fill(-1);
|
|
12
|
-
const tailAt = [];
|
|
13
|
-
common.forEach((id, i) => {
|
|
14
|
-
const position = at.get(id);
|
|
15
|
-
let lo = 0;
|
|
16
|
-
let hi = tails.length;
|
|
17
|
-
while (lo < hi) {
|
|
18
|
-
const mid = (lo + hi) >> 1;
|
|
19
|
-
if (tails[mid] < position)
|
|
20
|
-
lo = mid + 1;
|
|
21
|
-
else
|
|
22
|
-
hi = mid;
|
|
23
|
-
}
|
|
24
|
-
tails[lo] = position;
|
|
25
|
-
tailAt[lo] = i;
|
|
26
|
-
links[i] = lo > 0 ? tailAt[lo - 1] : -1;
|
|
27
|
-
});
|
|
28
|
-
const kept = new Set();
|
|
29
|
-
for (let i = tails.length ? tailAt[tails.length - 1] : -1; i !== -1; i = links[i])
|
|
30
|
-
kept.add(i);
|
|
31
|
-
return common.filter((_, i) => !kept.has(i));
|
|
8
|
+
const kept = new Set(common(previous, next).map(([, j]) => next[j]));
|
|
9
|
+
const held = new Set(previous);
|
|
10
|
+
return next.filter((id) => held.has(id) && !kept.has(id));
|
|
32
11
|
};
|
|
33
12
|
export class RoomValidation {
|
|
34
13
|
room;
|
|
35
14
|
/** The index `validate` reads (built at its first frame, for the live document). */
|
|
36
15
|
validation = null;
|
|
37
|
-
_validator;
|
|
16
|
+
#_validator;
|
|
38
17
|
constructor(room) {
|
|
39
18
|
this.room = room;
|
|
40
19
|
}
|
|
@@ -43,12 +22,12 @@ export class RoomValidation {
|
|
|
43
22
|
* then `validate`; `null` when neither is set (no block index is kept).
|
|
44
23
|
*/
|
|
45
24
|
get validator() {
|
|
46
|
-
if (this
|
|
47
|
-
return this
|
|
25
|
+
if (this.#_validator !== undefined)
|
|
26
|
+
return this.#_validator;
|
|
48
27
|
const locks = this.room.options.locks;
|
|
49
28
|
const validate = this.room.options.validate;
|
|
50
29
|
const locked = locks ? lockedBlocks(locks) : null;
|
|
51
|
-
return (this
|
|
30
|
+
return (this.#_validator =
|
|
52
31
|
locked === null
|
|
53
32
|
? (validate ?? null)
|
|
54
33
|
: validate === undefined
|
|
@@ -65,7 +44,7 @@ export class RoomValidation {
|
|
|
65
44
|
this.validation = null;
|
|
66
45
|
}
|
|
67
46
|
/** A shown block's state, read from the facade (`null`: it does not show). */
|
|
68
|
-
blockState(id) {
|
|
47
|
+
#blockState(id) {
|
|
69
48
|
const facade = this.room.facade;
|
|
70
49
|
if (!facade.isVisibleBlock(id))
|
|
71
50
|
return null;
|
|
@@ -95,7 +74,7 @@ export class RoomValidation {
|
|
|
95
74
|
const ids = facade.childrenIds(parent);
|
|
96
75
|
children.set(parent, ids);
|
|
97
76
|
for (const id of ids) {
|
|
98
|
-
const state = this
|
|
77
|
+
const state = this.#blockState(id);
|
|
99
78
|
if (state !== null)
|
|
100
79
|
states.set(id, state);
|
|
101
80
|
walk(id);
|
|
@@ -110,7 +89,7 @@ export class RoomValidation {
|
|
|
110
89
|
frame: null,
|
|
111
90
|
off: () => { }
|
|
112
91
|
};
|
|
113
|
-
created.off = facade.onChange((change) => this
|
|
92
|
+
created.off = facade.onChange((change) => this.#indexChange(created, change));
|
|
114
93
|
v = this.validation = created;
|
|
115
94
|
}
|
|
116
95
|
if (v.history === null && crdt.doc.isInitialized(asEngineDoc(doc))) {
|
|
@@ -123,7 +102,7 @@ export class RoomValidation {
|
|
|
123
102
|
return v;
|
|
124
103
|
}
|
|
125
104
|
/** Keep the index from one change report, recording what the frame being validated touched. */
|
|
126
|
-
indexChange(v, change) {
|
|
105
|
+
#indexChange(v, change) {
|
|
127
106
|
const frame = v.frame?.origin === change.origin ? v.frame : null;
|
|
128
107
|
const touch = (id) => {
|
|
129
108
|
if (frame === null)
|
|
@@ -141,7 +120,7 @@ export class RoomValidation {
|
|
|
141
120
|
};
|
|
142
121
|
const read = (id, moved) => {
|
|
143
122
|
const was = v.states.get(id);
|
|
144
|
-
const state = this
|
|
123
|
+
const state = this.#blockState(id);
|
|
145
124
|
if (state === null)
|
|
146
125
|
return drop(id);
|
|
147
126
|
if (!moved || was === undefined || was.parent !== state.parent)
|
|
@@ -186,7 +165,7 @@ export class RoomValidation {
|
|
|
186
165
|
v.frame = null;
|
|
187
166
|
if (frame === null || (frame.touched.size === 0 && !frame.data)) {
|
|
188
167
|
if (v.history)
|
|
189
|
-
|
|
168
|
+
v.history.clear();
|
|
190
169
|
return;
|
|
191
170
|
}
|
|
192
171
|
const touched = [...frame.touched];
|
|
@@ -223,6 +202,6 @@ export class RoomValidation {
|
|
|
223
202
|
}
|
|
224
203
|
}
|
|
225
204
|
if (v.history)
|
|
226
|
-
|
|
205
|
+
v.history.clear();
|
|
227
206
|
}
|
|
228
207
|
}
|