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
|
@@ -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,6 +11,12 @@ 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;
|
|
14
|
+
/**
|
|
15
|
+
* Log the document's size when it passes `documentWarning` of its quota
|
|
16
|
+
* (`room.quota.warning`): once per crossing; under it again, the next
|
|
17
|
+
* crossing logs again.
|
|
18
|
+
*/
|
|
19
|
+
private watch;
|
|
13
20
|
/** The waiting deletes stored as `pending` records (the engine may hold more, in memory). */
|
|
14
21
|
storedWaiting: Decoded['ds'];
|
|
15
22
|
/**
|
|
@@ -18,13 +25,8 @@ export declare class RoomStorage {
|
|
|
18
25
|
* would write is closed before it is applied, so an outage rebuilds once.
|
|
19
26
|
*/
|
|
20
27
|
outage: unknown;
|
|
21
|
-
private nextRecord;
|
|
22
|
-
/** The snapshot compression in flight (`compressed()`). */
|
|
23
|
-
private compressing;
|
|
24
28
|
/** The raw bytes of the compressed snapshot record (`records` reads it; only `start` can inflate). */
|
|
25
29
|
private inflated;
|
|
26
|
-
/** Alarms in a row that found the rows unreadable: each re-arms later. */
|
|
27
|
-
private saveRetries;
|
|
28
30
|
constructor(room: RoomContext);
|
|
29
31
|
/**
|
|
30
32
|
* Restore from storage, or seed from `onLoad`. Never throws: a throw
|
|
@@ -61,24 +63,12 @@ export declare class RoomStorage {
|
|
|
61
63
|
* engine refuses) is refused for good.
|
|
62
64
|
*/
|
|
63
65
|
private load;
|
|
64
|
-
/**
|
|
65
|
-
* The generation cutover at load (`room.generation.convert`): the
|
|
66
|
-
* records of a generation-4 container are read as JSON
|
|
67
|
-
* (`crdt.generations.previousJSON`), which this generation seeds as
|
|
68
|
-
* `onLoad`'s JSON is (deterministic: every replica converting the same
|
|
69
|
-
* state writes the same update), and the container is replaced by it in
|
|
70
|
-
* one storage transaction: rows, replicas, purge epochs, slot editors
|
|
71
|
-
* and the stored restore go; the document data, the alarm's due tasks
|
|
72
|
-
* and `lastUpdated` stay. What a generation-4 client never sent is not
|
|
73
|
-
* in it; history, attribution and CRDT identity do not cross.
|
|
74
|
-
*/
|
|
75
|
-
private convert;
|
|
76
66
|
/** The bytes of the stored `pending` records (uncompressed, as every record but a snapshot). */
|
|
77
67
|
pendingBytes(): number;
|
|
78
68
|
/**
|
|
79
69
|
* Reassembled logical records in write order (of one kind, with
|
|
80
|
-
* `only`); a torn record throws. A
|
|
81
|
-
* (
|
|
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).
|
|
82
72
|
*/
|
|
83
73
|
records(only?: RowKind): StoredRecord[];
|
|
84
74
|
/**
|
|
@@ -87,17 +77,6 @@ export declare class RoomStorage {
|
|
|
87
77
|
* generation record with it.
|
|
88
78
|
*/
|
|
89
79
|
insert(kind: RowKind, bytes: Uint8Array): number;
|
|
90
|
-
/** Record `record`'s rows (at the row positions `seqs`, when given). */
|
|
91
|
-
private writeRecord;
|
|
92
|
-
/**
|
|
93
|
-
* Compress snapshot `record` in place once it is stored: gzip is
|
|
94
|
-
* asynchronous, and the store-before-ack path is not. Its rows are
|
|
95
|
-
* rewritten (at their positions) only while it is still the stored
|
|
96
|
-
* snapshot and only when that shrinks it; the raw bytes stay in memory
|
|
97
|
-
* (`inflated`) for a rebuild's synchronous read. A platform without
|
|
98
|
-
* `CompressionStream` keeps it raw.
|
|
99
|
-
*/
|
|
100
|
-
private compressLater;
|
|
101
80
|
/** Resolves once the snapshot compression in flight, if any, is stored. */
|
|
102
81
|
compressed(): Promise<void>;
|
|
103
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();
|
|
@@ -93,6 +91,25 @@ export class RoomStorage {
|
|
|
93
91
|
updates = 0;
|
|
94
92
|
/** What the records hold, uncompressed (the generation record aside): the document quota's measure. */
|
|
95
93
|
documentBytes = 0;
|
|
94
|
+
/** The size passed `documentWarning` of the quota and was logged (memory: a wake logs it again). */
|
|
95
|
+
#warned = false;
|
|
96
|
+
/**
|
|
97
|
+
* Log the document's size when it passes `documentWarning` of its quota
|
|
98
|
+
* (`room.quota.warning`): once per crossing; under it again, the next
|
|
99
|
+
* crossing logs again.
|
|
100
|
+
*/
|
|
101
|
+
watch() {
|
|
102
|
+
const room = this.room;
|
|
103
|
+
const { maxDocumentBytes: limit, documentWarning: share } = room.limits;
|
|
104
|
+
if (this.documentBytes < limit * share) {
|
|
105
|
+
this.#warned = false;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (this.#warned)
|
|
109
|
+
return;
|
|
110
|
+
this.#warned = true;
|
|
111
|
+
room.log({ edytor: 'size', bytes: this.documentBytes, limit, share });
|
|
112
|
+
}
|
|
96
113
|
/** The waiting deletes stored as `pending` records (the engine may hold more, in memory). */
|
|
97
114
|
storedWaiting = Y.createIdSet();
|
|
98
115
|
/**
|
|
@@ -101,13 +118,13 @@ export class RoomStorage {
|
|
|
101
118
|
* would write is closed before it is applied, so an outage rebuilds once.
|
|
102
119
|
*/
|
|
103
120
|
outage = null;
|
|
104
|
-
nextRecord = 0;
|
|
121
|
+
#nextRecord = 0;
|
|
105
122
|
/** The snapshot compression in flight (`compressed()`). */
|
|
106
|
-
compressing = Promise.resolve();
|
|
123
|
+
#compressing = Promise.resolve();
|
|
107
124
|
/** The raw bytes of the compressed snapshot record (`records` reads it; only `start` can inflate). */
|
|
108
125
|
inflated = null;
|
|
109
126
|
/** Alarms in a row that found the rows unreadable: each re-arms later. */
|
|
110
|
-
saveRetries = 0;
|
|
127
|
+
#saveRetries = 0;
|
|
111
128
|
constructor(room) {
|
|
112
129
|
this.room = room;
|
|
113
130
|
}
|
|
@@ -271,7 +288,7 @@ export class RoomStorage {
|
|
|
271
288
|
room.live?.destroy();
|
|
272
289
|
this.adopt(doc);
|
|
273
290
|
this.storedWaiting = waiting;
|
|
274
|
-
this
|
|
291
|
+
this.#compressLater(record, snapshot);
|
|
275
292
|
});
|
|
276
293
|
}
|
|
277
294
|
/**
|
|
@@ -310,7 +327,7 @@ export class RoomStorage {
|
|
|
310
327
|
)`);
|
|
311
328
|
room.scheduler.readDues();
|
|
312
329
|
room.history.loadRestore();
|
|
313
|
-
this
|
|
330
|
+
this.#nextRecord = 0;
|
|
314
331
|
records = this.records();
|
|
315
332
|
}
|
|
316
333
|
catch (error) {
|
|
@@ -327,17 +344,14 @@ export class RoomStorage {
|
|
|
327
344
|
}
|
|
328
345
|
const [generation, ...rest] = records;
|
|
329
346
|
const found = JSON.parse(new TextDecoder().decode(generation.bytes));
|
|
330
|
-
// A container of generation 4 converts through its JSON (`room.generation.convert`).
|
|
331
|
-
if (generation.kind === 'generation' && E.isPreviousGenerationRecord(found)) {
|
|
332
|
-
return this.convert(rest);
|
|
333
|
-
}
|
|
334
347
|
if (generation.kind !== 'generation' || !isGenerationRecord(found)) {
|
|
335
348
|
throw new E.GenerationMismatchError(`room ${room.ctx.id}`, found);
|
|
336
349
|
}
|
|
337
350
|
// Applied in one transaction, never merged first: a merge of the
|
|
338
351
|
// records keeps every keystroke's struct and the deleted content.
|
|
339
|
-
const doc = admit(rest.map((record) =>
|
|
352
|
+
const doc = admit(rest.map((record) => record.bytes), `room ${room.ctx.id}`, () => room.history.restoreKeep);
|
|
340
353
|
this.documentBytes = rest.reduce((n, record) => n + record.bytes.length, 0);
|
|
354
|
+
this.watch();
|
|
341
355
|
this.adopt(doc);
|
|
342
356
|
// Every delete the engine holds waiting came from the rows.
|
|
343
357
|
this.storedWaiting = pendingDeletes(doc);
|
|
@@ -348,58 +362,6 @@ export class RoomStorage {
|
|
|
348
362
|
this.fail(error, false);
|
|
349
363
|
}
|
|
350
364
|
}
|
|
351
|
-
/**
|
|
352
|
-
* The generation cutover at load (`room.generation.convert`): the
|
|
353
|
-
* records of a generation-4 container are read as JSON
|
|
354
|
-
* (`crdt.generations.previousJSON`), which this generation seeds as
|
|
355
|
-
* `onLoad`'s JSON is (deterministic: every replica converting the same
|
|
356
|
-
* state writes the same update), and the container is replaced by it in
|
|
357
|
-
* one storage transaction: rows, replicas, purge epochs, slot editors
|
|
358
|
-
* and the stored restore go; the document data, the alarm's due tasks
|
|
359
|
-
* and `lastUpdated` stay. What a generation-4 client never sent is not
|
|
360
|
-
* in it; history, attribution and CRDT identity do not cross.
|
|
361
|
-
*/
|
|
362
|
-
convert(records) {
|
|
363
|
-
const room = this.room;
|
|
364
|
-
const { sql, tables } = room;
|
|
365
|
-
const json = crdt.generations.previousJSON(records.map((record) => (record.v2 ? { v2: record.bytes } : record.bytes)), (doc) => room.facadeOf(doc));
|
|
366
|
-
const scratch = crdt.createDoc();
|
|
367
|
-
const facade = room.facadeOf(scratch);
|
|
368
|
-
facade.seed(json.children, json.data);
|
|
369
|
-
facade.dispose();
|
|
370
|
-
const update = Y.encodeStateAsUpdate(scratch);
|
|
371
|
-
scratch.destroy();
|
|
372
|
-
const doc = admit(update, `room ${room.ctx.id} conversion`, () => room.history.restoreKeep);
|
|
373
|
-
const snapshot = liveState(doc);
|
|
374
|
-
room.ctx.storage.transactionSync(() => {
|
|
375
|
-
for (const table of [
|
|
376
|
-
tables.rows,
|
|
377
|
-
tables.replicas,
|
|
378
|
-
tables.epochs,
|
|
379
|
-
tables.editors,
|
|
380
|
-
tables.restore
|
|
381
|
-
])
|
|
382
|
-
sql.exec(`DELETE FROM ${table}`);
|
|
383
|
-
this.nextRecord = 0;
|
|
384
|
-
this.insert('snapshot', snapshot);
|
|
385
|
-
this.touch();
|
|
386
|
-
for (const replica of stateVector(doc).keys())
|
|
387
|
-
sql.exec(`INSERT OR IGNORE INTO ${tables.replicas} (replica, user) VALUES (?, '')`, replica);
|
|
388
|
-
});
|
|
389
|
-
room.history.clearRestore();
|
|
390
|
-
this.documentBytes = snapshot.length;
|
|
391
|
-
this.updates = 0;
|
|
392
|
-
this.storedWaiting = Y.createIdSet();
|
|
393
|
-
this.adopt(doc);
|
|
394
|
-
room.state.origin = { kind: 'converted', from: E.PREVIOUS_SCHEMA, records: records.length };
|
|
395
|
-
room.log({
|
|
396
|
-
edytor: 'convert',
|
|
397
|
-
from: E.PREVIOUS_SCHEMA,
|
|
398
|
-
to: E.SCHEMA_VERSION,
|
|
399
|
-
blocks: countBlocks(json.children),
|
|
400
|
-
bytes: snapshot.length
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
365
|
/** The bytes of the stored `pending` records (uncompressed, as every record but a snapshot). */
|
|
404
366
|
pendingBytes() {
|
|
405
367
|
return (this.room.sql
|
|
@@ -408,35 +370,21 @@ export class RoomStorage {
|
|
|
408
370
|
}
|
|
409
371
|
/**
|
|
410
372
|
* Reassembled logical records in write order (of one kind, with
|
|
411
|
-
* `only`); a torn record throws. A
|
|
412
|
-
* (
|
|
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).
|
|
413
375
|
*/
|
|
414
376
|
records(only) {
|
|
415
377
|
const rows = this.room.sql
|
|
416
378
|
.exec(`SELECT kind, record, part, parts, bytes FROM ${this.room.tables.rows}${only ? ' WHERE kind = ?' : ''} ORDER BY seq`, ...(only ? [only] : []))
|
|
417
379
|
.toArray();
|
|
418
380
|
for (const row of rows)
|
|
419
|
-
this
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
if (records[0]?.kind === 'generation') {
|
|
424
|
-
try {
|
|
425
|
-
const found = JSON.parse(new TextDecoder().decode(records[0].bytes));
|
|
426
|
-
if (isGenerationRecord(found) || E.isPreviousGenerationRecord(found))
|
|
427
|
-
format = storageOf(found);
|
|
428
|
-
}
|
|
429
|
-
catch {
|
|
430
|
-
// `load` refuses it
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return records.map((record) => {
|
|
434
|
-
const v2 = format === 'v2' && record.kind === 'snapshot';
|
|
435
|
-
if (!v2 || !isGzip(record.bytes))
|
|
436
|
-
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;
|
|
437
385
|
if (this.inflated?.record !== record.record)
|
|
438
386
|
throw new CompressedRecord();
|
|
439
|
-
return { ...record, bytes: this.inflated.bytes
|
|
387
|
+
return { ...record, bytes: this.inflated.bytes };
|
|
440
388
|
});
|
|
441
389
|
}
|
|
442
390
|
/**
|
|
@@ -445,17 +393,19 @@ export class RoomStorage {
|
|
|
445
393
|
* generation record with it.
|
|
446
394
|
*/
|
|
447
395
|
insert(kind, bytes) {
|
|
448
|
-
if (this
|
|
449
|
-
this.insert('generation', encodeJSON(
|
|
396
|
+
if (this.#nextRecord === 0 && kind !== 'generation') {
|
|
397
|
+
this.insert('generation', encodeJSON(GENERATION_RECORD));
|
|
450
398
|
}
|
|
451
|
-
const record = this
|
|
452
|
-
this
|
|
453
|
-
if (kind !== 'generation')
|
|
399
|
+
const record = this.#nextRecord++;
|
|
400
|
+
this.#writeRecord(kind, record, bytes);
|
|
401
|
+
if (kind !== 'generation') {
|
|
454
402
|
this.documentBytes += bytes.length;
|
|
403
|
+
this.watch();
|
|
404
|
+
}
|
|
455
405
|
return record;
|
|
456
406
|
}
|
|
457
407
|
/** Record `record`'s rows (at the row positions `seqs`, when given). */
|
|
458
|
-
writeRecord(kind, record, bytes, seqs) {
|
|
408
|
+
#writeRecord(kind, record, bytes, seqs) {
|
|
459
409
|
const { sql, tables, limits } = this.room;
|
|
460
410
|
const parts = Math.max(1, Math.ceil(bytes.length / limits.maxRowBytes));
|
|
461
411
|
for (let part = 0; part < parts; part++) {
|
|
@@ -473,10 +423,9 @@ export class RoomStorage {
|
|
|
473
423
|
* asynchronous, and the store-before-ack path is not. Its rows are
|
|
474
424
|
* rewritten (at their positions) only while it is still the stored
|
|
475
425
|
* snapshot and only when that shrinks it; the raw bytes stay in memory
|
|
476
|
-
* (`inflated`) for a rebuild's synchronous read.
|
|
477
|
-
* `CompressionStream` keeps it raw.
|
|
426
|
+
* (`inflated`) for a rebuild's synchronous read.
|
|
478
427
|
*/
|
|
479
|
-
compressLater(record, raw) {
|
|
428
|
+
#compressLater(record, raw) {
|
|
480
429
|
const room = this.room;
|
|
481
430
|
const job = packed(raw)
|
|
482
431
|
.then((bytes) => noTimers(() => {
|
|
@@ -490,17 +439,17 @@ export class RoomStorage {
|
|
|
490
439
|
return;
|
|
491
440
|
room.ctx.storage.transactionSync(() => {
|
|
492
441
|
room.sql.exec(`DELETE FROM ${room.tables.rows} WHERE record = ?`, record);
|
|
493
|
-
this
|
|
442
|
+
this.#writeRecord('snapshot', record, bytes, rows.map((row) => row.seq));
|
|
494
443
|
});
|
|
495
444
|
this.inflated = { record, bytes: raw.slice() };
|
|
496
445
|
}))
|
|
497
446
|
.catch((error) => room.note({ reason: 'storage', detail: `compression: ${String(error)}` }));
|
|
498
|
-
this
|
|
447
|
+
this.#compressing = job;
|
|
499
448
|
room.ctx.waitUntil?.(job);
|
|
500
449
|
}
|
|
501
450
|
/** Resolves once the snapshot compression in flight, if any, is stored. */
|
|
502
451
|
async compressed() {
|
|
503
|
-
await this
|
|
452
|
+
await this.#compressing;
|
|
504
453
|
}
|
|
505
454
|
/** Compaction (`AttachedDocument.compact`). */
|
|
506
455
|
compact() {
|
|
@@ -527,7 +476,7 @@ export class RoomStorage {
|
|
|
527
476
|
.map(({ replica }) => replica);
|
|
528
477
|
const known = new Set([...registered, ...sockets]);
|
|
529
478
|
// Waiting deletes stay apart (a discarded forgery drops them,
|
|
530
|
-
//
|
|
479
|
+
// `#settleDeletes`): the stored ones the engine still holds waiting.
|
|
531
480
|
const all = pendingDeletes(doc);
|
|
532
481
|
const stored = storedPending(pending);
|
|
533
482
|
const waiting = Y.diffIdSet(stored, Y.diffIdSet(stored, all));
|
|
@@ -540,8 +489,7 @@ export class RoomStorage {
|
|
|
540
489
|
room.ctx.storage.transactionSync(() => {
|
|
541
490
|
sql.exec(`DELETE FROM ${tables.rows}`);
|
|
542
491
|
this.documentBytes = 0;
|
|
543
|
-
|
|
544
|
-
this.insert('generation', encodeJSON(STORED_GENERATION_RECORD));
|
|
492
|
+
this.insert('generation', encodeJSON(GENERATION_RECORD));
|
|
545
493
|
record = this.insert('snapshot', snapshot);
|
|
546
494
|
if (!still.isEmpty())
|
|
547
495
|
this.insert('pending', deletesUpdate(still));
|
|
@@ -558,7 +506,7 @@ export class RoomStorage {
|
|
|
558
506
|
}
|
|
559
507
|
this.updates = 0;
|
|
560
508
|
this.storedWaiting = still;
|
|
561
|
-
this
|
|
509
|
+
this.#compressLater(record, snapshot);
|
|
562
510
|
// Unknown ids' deletes go, the ones waiting in memory with a rewrite too.
|
|
563
511
|
forgetWaiting(doc, addIds(Y.createIdSet(), all, (client) => !known.has(client)));
|
|
564
512
|
const rows = sql.exec(`SELECT COUNT(*) AS n FROM ${tables.rows}`).one().n;
|
|
@@ -755,10 +703,10 @@ export class RoomStorage {
|
|
|
755
703
|
if (room.live === null) {
|
|
756
704
|
if (!this.retryable)
|
|
757
705
|
return scheduler.unschedule('save');
|
|
758
|
-
const wait = Math.min(room.limits.saveAfter * 2 ** ++this
|
|
706
|
+
const wait = Math.min(room.limits.saveAfter * 2 ** ++this.#saveRetries, MAX_SAVE_RETRY);
|
|
759
707
|
return scheduler.schedule('save', room.clock() + wait, 'replace');
|
|
760
708
|
}
|
|
761
|
-
this
|
|
709
|
+
this.#saveRetries = 0;
|
|
762
710
|
const due = scheduler.due('save');
|
|
763
711
|
// Cleared first: a change during `onSave` arms the next one.
|
|
764
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
|
}
|