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
|
@@ -16,16 +16,6 @@ export type IndexeddbPersistenceOptions = {
|
|
|
16
16
|
awareness?: Awareness;
|
|
17
17
|
/** Stay off the BroadcastChannel room (no cross-tab sync): storage only. */
|
|
18
18
|
disableBc?: boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Convert the generation-4 store of the same name (`edytor-v14:<name>`)
|
|
21
|
-
* into this one when this one is empty (the generation cutover): its
|
|
22
|
-
* visible document is read as JSON and seeded as this generation's.
|
|
23
|
-
* For a document stored only here; a document a room keeps takes its
|
|
24
|
-
* state from the room instead (two replicas seeding different
|
|
25
|
-
* conversions of one document would collide). Default `false`;
|
|
26
|
-
* `createIndexeddbSync` sets it.
|
|
27
|
-
*/
|
|
28
|
-
convertPrevious?: boolean;
|
|
29
19
|
};
|
|
30
20
|
export type IndexeddbProvider = ReturnType<typeof bindIndexeddbProvider>;
|
|
31
21
|
/** Instance type of the bound provider class. */
|
|
@@ -60,7 +50,7 @@ export declare const bindIndexeddbProvider: (Y: EngineApi) => {
|
|
|
60
50
|
bcconnected: boolean;
|
|
61
51
|
disableBc: boolean;
|
|
62
52
|
_ownsAwareness: boolean;
|
|
63
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
53
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
64
54
|
_awarenessUpdateHandler: (updates: {
|
|
65
55
|
added: number[];
|
|
66
56
|
updated: number[];
|
|
@@ -201,6 +191,6 @@ export declare const bindIndexeddbProvider: (Y: EngineApi) => {
|
|
|
201
191
|
};
|
|
202
192
|
};
|
|
203
193
|
storeState: (idbPersistence: IdbPersistenceLike, forceStore?: boolean) => Promise<undefined>;
|
|
204
|
-
clearDocument: (name: string) => Promise<
|
|
194
|
+
clearDocument: (name: string) => Promise<void>;
|
|
205
195
|
PREFERRED_TRIM_SIZE: number;
|
|
206
196
|
};
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Semantics preserved from the v13 provider:
|
|
7
7
|
*
|
|
8
|
-
* - `updates` object store (auto-increment keys) holds
|
|
9
|
-
*
|
|
8
|
+
* - `updates` object store (auto-increment keys) holds update rows, each
|
|
9
|
+
* in a fresh ArrayBuffer (`container.ts`); `custom` holds the
|
|
10
10
|
* generation record.
|
|
11
11
|
* - `PREFERRED_TRIM_SIZE = 500`: past it, a debounced `storeState` appends a
|
|
12
12
|
* compacted `encodeStateAsUpdate` snapshot and deletes prior rows. Every
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
*
|
|
22
22
|
* The generation gate (see `protocols/envelope.ts`):
|
|
23
23
|
*
|
|
24
|
-
* - STORAGE: the database name is `edytor-v14-
|
|
25
|
-
*
|
|
24
|
+
* - STORAGE: the database name is `edytor-v14-g<schema>:<name>`; another
|
|
25
|
+
* generation's database is never opened here. A `generation` record
|
|
26
26
|
* (engine, protocol, schema) in `custom` is written on creation and
|
|
27
27
|
* verified before any row is applied — a container of another
|
|
28
28
|
* generation fails the load; nothing inside a row is inspected.
|
|
@@ -34,64 +34,20 @@
|
|
|
34
34
|
* The engine module is injected (`bindIndexeddbProvider(Y)`) — `src/lib`
|
|
35
35
|
* never runtime-imports the vendored `.js`.
|
|
36
36
|
*/
|
|
37
|
-
import * as idb from 'lib0-v14/indexeddb';
|
|
38
37
|
import * as promise from 'lib0-v14/promise';
|
|
39
|
-
import * as bc from 'lib0-v14/broadcastchannel';
|
|
40
38
|
import * as encoding from 'lib0-v14/encoding';
|
|
41
39
|
import { Awareness } from '../protocols/awareness.js';
|
|
42
40
|
import { IsolatedObservable } from '../protocols/observable.js';
|
|
43
41
|
import { bindSync } from '../protocols/sync.js';
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import { beginDestroy, bindRoomProtocol, emitFailed, initLifecycle, markSynced, quarantined } from './room.js';
|
|
42
|
+
import { generationDbName } from '../protocols/envelope.js';
|
|
43
|
+
import { CUSTOM as customStoreName, encodeRow, lastKey, openContainer, readRow, rtop, snapshotRow, storesOf, UPDATES as updatesStoreName, verifyOrStamp } from './container.js';
|
|
44
|
+
import { beginDestroy, bindRoomProtocol, tabs, emitFailed, initLifecycle, markSynced, quarantined } from './room.js';
|
|
48
45
|
export const PREFERRED_TRIM_SIZE = 500;
|
|
49
46
|
/**
|
|
50
47
|
* Bind the IndexedDB persistence provider to the vendored v14 engine module.
|
|
51
48
|
*/
|
|
52
49
|
export const bindIndexeddbProvider = (Y) => {
|
|
53
50
|
const syncProtocol = bindSync(Y);
|
|
54
|
-
const generations = bindGenerations(Y);
|
|
55
|
-
/**
|
|
56
|
-
* The generation cutover of a local store (`IndexeddbPersistenceOptions.convertPrevious`):
|
|
57
|
-
* when `db` is empty and the generation-4 store of `name` exists, its
|
|
58
|
-
* visible document is read as JSON and this generation's seed of it is
|
|
59
|
-
* written as `db`'s first row, with the generation record, in one
|
|
60
|
-
* transaction. The generation-4 store is left as it was.
|
|
61
|
-
*/
|
|
62
|
-
const convertPrevious = async (name, db) => {
|
|
63
|
-
const [updates, custom] = idb.transact(db, [updatesStoreName, customStoreName], 'readonly');
|
|
64
|
-
// Both requests before either settles: one transaction.
|
|
65
|
-
const reads = [idb.get(custom, GENERATION_KEY), idb.count(updates)];
|
|
66
|
-
const found = await reads[0];
|
|
67
|
-
if (found !== undefined || (await reads[1]) > 0)
|
|
68
|
-
return;
|
|
69
|
-
const old = await openIfExists(PREVIOUS_GENERATION_PREFIX + name);
|
|
70
|
-
if (old === null)
|
|
71
|
-
return;
|
|
72
|
-
try {
|
|
73
|
-
if (!old.objectStoreNames.contains(customStoreName))
|
|
74
|
-
return;
|
|
75
|
-
const [oldUpdates, oldCustom] = idb.transact(old, [updatesStoreName, customStoreName], 'readonly');
|
|
76
|
-
const reads = [idb.get(oldCustom, GENERATION_KEY), idb.getAll(oldUpdates)];
|
|
77
|
-
const record = await reads[0];
|
|
78
|
-
const stored = await reads[1];
|
|
79
|
-
if (!generations.isPreviousGenerationRecord(record))
|
|
80
|
-
return;
|
|
81
|
-
const rows = await promise.all(stored.map(readRow));
|
|
82
|
-
if (rows.length === 0)
|
|
83
|
-
return;
|
|
84
|
-
const seed = generations.seedOf(generations.previousJSONWith(rows));
|
|
85
|
-
const [newUpdates, newCustom] = idb.transact(db, [updatesStoreName, customStoreName]);
|
|
86
|
-
await promise.all([
|
|
87
|
-
idb.rtop(newCustom.put({ ...STORED_GENERATION_RECORD }, GENERATION_KEY)),
|
|
88
|
-
idb.addAutoKey(newUpdates, encodeRow(seed))
|
|
89
|
-
]);
|
|
90
|
-
}
|
|
91
|
-
finally {
|
|
92
|
-
old.close();
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
51
|
/**
|
|
96
52
|
* The shared room protocol — dispatch, the join rule, awareness
|
|
97
53
|
* flow, BC subscriber + join/leave, the lifecycle. This provider keeps
|
|
@@ -112,17 +68,15 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
112
68
|
*/
|
|
113
69
|
const fetchUpdates = (idbPersistence, beforeApplyUpdatesCallback = () => { }, afterApplyUpdatesCallback = () => { }) => {
|
|
114
70
|
const db = idbPersistence.db;
|
|
115
|
-
const [updatesStore, customStore] =
|
|
71
|
+
const [updatesStore, customStore] = storesOf(db, [updatesStoreName, customStoreName]);
|
|
116
72
|
return verifyOrStamp(idbPersistence.name, updatesStore, customStore)
|
|
117
|
-
.then(() =>
|
|
73
|
+
.then(() => rtop(updatesStore.getAll(IDBKeyRange.lowerBound(idbPersistence._dbref, false))))
|
|
118
74
|
.then((rows) => {
|
|
119
75
|
// The pre-hydration state row is written before the last key is read.
|
|
120
76
|
if (!idbPersistence._destroyed)
|
|
121
77
|
beforeApplyUpdatesCallback(updatesStore);
|
|
122
|
-
return
|
|
123
|
-
.
|
|
124
|
-
.then(([lastKey, cnt]) => {
|
|
125
|
-
idbPersistence._dbref = lastKey + 1;
|
|
78
|
+
return Promise.all([lastKey(updatesStore), rtop(updatesStore.count())]).then(([last, cnt]) => {
|
|
79
|
+
idbPersistence._dbref = Number(last) + 1;
|
|
126
80
|
idbPersistence._dbsize = cnt;
|
|
127
81
|
return promise.all(rows.map(readRow));
|
|
128
82
|
});
|
|
@@ -131,20 +85,16 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
131
85
|
if (idbPersistence._destroyed)
|
|
132
86
|
return;
|
|
133
87
|
Y.transact(idbPersistence.doc, () => {
|
|
134
|
-
for (const update of updates)
|
|
135
|
-
|
|
136
|
-
Y.applyUpdate(idbPersistence.doc, update);
|
|
137
|
-
else
|
|
138
|
-
Y.applyUpdateV2(idbPersistence.doc, update.v2);
|
|
139
|
-
}
|
|
88
|
+
for (const update of updates)
|
|
89
|
+
Y.applyUpdate(idbPersistence.doc, update);
|
|
140
90
|
}, idbPersistence, false);
|
|
141
91
|
afterApplyUpdatesCallback();
|
|
142
92
|
});
|
|
143
93
|
};
|
|
144
|
-
/** One transaction: the snapshot row, the rows below `below` deleted
|
|
94
|
+
/** One transaction: the snapshot row, the rows below `below` deleted. */
|
|
145
95
|
const writeSnapshot = (idbPersistence, row, below) => {
|
|
146
96
|
const db = idbPersistence.db;
|
|
147
|
-
const [updatesStore
|
|
97
|
+
const [updatesStore] = storesOf(db, [updatesStoreName]);
|
|
148
98
|
// Track transaction commit: listeners attach while it is still active.
|
|
149
99
|
const tx = updatesStore.transaction;
|
|
150
100
|
const transactionDone = promise.create((resolve, reject) => {
|
|
@@ -153,12 +103,9 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
153
103
|
});
|
|
154
104
|
return promise
|
|
155
105
|
.all([
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
.
|
|
159
|
-
.then(() => idb.del(updatesStore, idb.createIDBKeyRangeUpperBound(below, true)))
|
|
160
|
-
.then(() => idb.rtop(customStore.put({ ...STORED_GENERATION_RECORD }, GENERATION_KEY)))
|
|
161
|
-
.then(() => idb.count(updatesStore).then((cnt) => {
|
|
106
|
+
rtop(updatesStore.add(row))
|
|
107
|
+
.then(() => rtop(updatesStore.delete(IDBKeyRange.upperBound(below, true))))
|
|
108
|
+
.then(() => rtop(updatesStore.count()).then((cnt) => {
|
|
162
109
|
idbPersistence._dbsize = cnt;
|
|
163
110
|
})),
|
|
164
111
|
transactionDone
|
|
@@ -168,9 +115,8 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
168
115
|
/**
|
|
169
116
|
* Persist the current state: fetch pending rows, then (when `forceStore`
|
|
170
117
|
* or past `PREFERRED_TRIM_SIZE`) append a compacted snapshot and delete
|
|
171
|
-
* the rows it subsumes. The snapshot is
|
|
172
|
-
* platform can
|
|
173
|
-
* with its storage format in the same transaction.
|
|
118
|
+
* the rows it subsumes. The snapshot is gzip-compressed where the
|
|
119
|
+
* platform can and that makes it smaller.
|
|
174
120
|
*
|
|
175
121
|
* Every applied row is represented in the snapshot, so deleting
|
|
176
122
|
* `key < _dbref` (read before the snapshot is compressed: rows stored
|
|
@@ -195,13 +141,13 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
195
141
|
return undefined;
|
|
196
142
|
}
|
|
197
143
|
const below = idbPersistence._dbref;
|
|
198
|
-
return snapshotRow(Y.
|
|
144
|
+
return snapshotRow(Y.encodeStateAsUpdate(idbPersistence.doc)).then((row) => idbPersistence._destroyed ? undefined : writeSnapshot(idbPersistence, row, below));
|
|
199
145
|
});
|
|
200
146
|
/**
|
|
201
|
-
* Delete
|
|
202
|
-
* prefix is applied here;
|
|
147
|
+
* Delete this generation's database by LOGICAL name (the generation
|
|
148
|
+
* prefix is applied here; another generation's store is left).
|
|
203
149
|
*/
|
|
204
|
-
const clearDocument = (name) =>
|
|
150
|
+
const clearDocument = (name) => rtop(indexedDB.deleteDatabase(generationDbName(name))).then(() => undefined);
|
|
205
151
|
/**
|
|
206
152
|
* Each provider's doc-`destroy` listener: it ends the provider (it never
|
|
207
153
|
* rejects: the close is caught). Kept off the class, so it is not part
|
|
@@ -247,12 +193,7 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
247
193
|
this.awareness = options.awareness ?? new Awareness(doc);
|
|
248
194
|
this._ownsAwareness = !options.awareness;
|
|
249
195
|
this.disableBc = options.disableBc === true;
|
|
250
|
-
this._db = openContainer(this.dbName)
|
|
251
|
-
? convertPrevious(name, db).then(() => db, (error) => {
|
|
252
|
-
db.close();
|
|
253
|
-
throw error;
|
|
254
|
-
})
|
|
255
|
-
: db);
|
|
196
|
+
this._db = openContainer(this.dbName);
|
|
256
197
|
this.destroy = this.destroy.bind(this);
|
|
257
198
|
initLifecycle(this, this.destroy, () => room.depart(this));
|
|
258
199
|
this._bcSubscriber = room.bcSubscriber(this);
|
|
@@ -275,9 +216,7 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
275
216
|
// A read-only doc's pre-hydration state is never persisted.
|
|
276
217
|
const beforeApplyUpdatesCallback = (updatesStore) => {
|
|
277
218
|
if (!quarantined(doc)) {
|
|
278
|
-
|
|
279
|
-
.addAutoKey(updatesStore, encodeRow(Y.encodeStateAsUpdate(doc)))
|
|
280
|
-
.catch((error) => this.emit('message-error', [error, this]));
|
|
219
|
+
rtop(updatesStore.add(encodeRow(Y.encodeStateAsUpdate(doc)))).catch((error) => this.emit('message-error', [error, this]));
|
|
281
220
|
}
|
|
282
221
|
};
|
|
283
222
|
// Hydrated: join the room and claim `synced` (lifetime).
|
|
@@ -311,10 +250,10 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
311
250
|
return;
|
|
312
251
|
if (this.db) {
|
|
313
252
|
try {
|
|
314
|
-
const [updatesStore] =
|
|
253
|
+
const [updatesStore] = storesOf(this.db, [updatesStoreName]);
|
|
315
254
|
// Storage failures must surface — never an unobserved
|
|
316
255
|
// rejection (the error channel observes every failure mode).
|
|
317
|
-
|
|
256
|
+
rtop(updatesStore.add(encodeRow(update))).catch((error) => {
|
|
318
257
|
this.emit('message-error', [error, this]);
|
|
319
258
|
});
|
|
320
259
|
if (++this._dbsize >= PREFERRED_TRIM_SIZE) {
|
|
@@ -362,7 +301,7 @@ export const bindIndexeddbProvider = (Y) => {
|
|
|
362
301
|
readMessage = (buf, emitSynced) => room.readMessage(this, buf, emitSynced);
|
|
363
302
|
broadcastMessage(buf) {
|
|
364
303
|
if (this.bcconnected) {
|
|
365
|
-
|
|
304
|
+
tabs.publish(this.dbName, buf, this);
|
|
366
305
|
}
|
|
367
306
|
}
|
|
368
307
|
/** Join the BC room (after hydration; again after `disconnectBc`). */
|
|
@@ -1,3 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Room protocol — the transport-agnostic half of the two providers.
|
|
3
|
+
*
|
|
4
|
+
* Both providers speak the same enveloped protocol
|
|
5
|
+
* (`protocols/envelope.ts`) — the IndexedDB provider on one
|
|
6
|
+
* BroadcastChannel room per document, the websocket provider on its
|
|
7
|
+
* socket plus the same BroadcastChannel room (cross-tab, on by default): the generation word,
|
|
8
|
+
* the message-type dispatch, the sync handler, and the awareness
|
|
9
|
+
* publish/query flow are identical between them — this module is their
|
|
10
|
+
* ONE owner. It owns:
|
|
11
|
+
*
|
|
12
|
+
* - the two schema rules that bytes of a proven generation
|
|
13
|
+
* still need: the inbound refusal of an update that writes a foreign
|
|
14
|
+
* schema stamp (reported, never integrated), and the outbound quarantine
|
|
15
|
+
* of a read-only document (it answers no state request, publishes no
|
|
16
|
+
* update);
|
|
17
|
+
* - ONE join rule, derived from state vectors, identical on the socket and
|
|
18
|
+
* the BroadcastChannel and correct behind an opaque relay: joining
|
|
19
|
+
* sends a hello (Step1 + presence); a Step1 is answered with a Step2 and,
|
|
20
|
+
* when the asker holds anything we lack, with our own Step1. Once two
|
|
21
|
+
* replicas have each received one Step1 from the other, each holds the
|
|
22
|
+
* other's state — no periodic resync is needed for that;
|
|
23
|
+
* - the provider lifecycle: `hasSynced` (lifetime) apart from a
|
|
24
|
+
* transport's `connected`/`synced` (transient), the terminal `failed`
|
|
25
|
+
* (once, never after `hasSynced`), `whenSynced`, the destroy guard, and
|
|
26
|
+
* the departure announcement (leaving the page destroys the provider,
|
|
27
|
+
* which announces its presence removal on every transport it speaks).
|
|
28
|
+
*
|
|
29
|
+
* `bindRoomProtocol(syncProtocol, behavior)` is bound once per provider
|
|
30
|
+
* class; the returned handle takes the provider instance on every call.
|
|
31
|
+
* Real per-provider differences stay in the behavior hooks:
|
|
32
|
+
*
|
|
33
|
+
* - `broadcast` — ws sends room traffic on its socket and the BC channel;
|
|
34
|
+
* idb's on the BC channel (`roomChannel`).
|
|
35
|
+
* - `tabOrigin` — ws applies an update heard from another tab under its own
|
|
36
|
+
* origin, so it can relay that update to the server (idb skips it: the
|
|
37
|
+
* other tab stored it in the same database).
|
|
38
|
+
* - `heard` — ws claims its connection's `synced` when it holds a member's
|
|
39
|
+
* state (an applied Step2, or a Step1 it covers, received on the
|
|
40
|
+
* socket); idb's `synced` is its local-hydration claim.
|
|
41
|
+
* - `handlers` — ws adds `messageAuth` (the auth reply exists only on a
|
|
42
|
+
* server socket — a BC room has no authority to deny).
|
|
43
|
+
*/
|
|
1
44
|
import * as encoding from 'lib0-v14/encoding';
|
|
2
45
|
import * as decoding from 'lib0-v14/decoding';
|
|
3
46
|
import { type Awareness, type AwarenessUpdate } from '../protocols/awareness.js';
|
|
@@ -69,6 +112,18 @@ export type SchemaMismatchDetail = {
|
|
|
69
112
|
docName: string;
|
|
70
113
|
problem: SchemaProblem;
|
|
71
114
|
};
|
|
115
|
+
/** A tab channel's subscriber: the bytes and who published them (`null`: another tab). */
|
|
116
|
+
type TabSubscriber = (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
117
|
+
/**
|
|
118
|
+
* The tabs of one browser, by room name: one `BroadcastChannel` per room,
|
|
119
|
+
* shared by this tab's subscribers. A publish reaches the other tabs and,
|
|
120
|
+
* at once, this tab's other subscribers (with the publisher as origin).
|
|
121
|
+
*/
|
|
122
|
+
export declare const tabs: {
|
|
123
|
+
subscribe: (room: string, f: TabSubscriber) => void;
|
|
124
|
+
unsubscribe: (room: string, f: TabSubscriber) => void;
|
|
125
|
+
publish: (room: string, data: Uint8Array | ArrayBuffer, origin?: unknown) => void;
|
|
126
|
+
};
|
|
72
127
|
/** The outbound quarantine: a read-only document does not spread. */
|
|
73
128
|
export declare const quarantined: (doc: YDoc) => boolean;
|
|
74
129
|
/** The lifecycle a provider carries — installed by {@link initLifecycle}. */
|
|
@@ -189,7 +244,7 @@ export type RoomProvider<P> = LifecycleHost & {
|
|
|
189
244
|
/** A provider that joins the BroadcastChannel room. */
|
|
190
245
|
export type BcMember = {
|
|
191
246
|
bcconnected: boolean;
|
|
192
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
247
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
193
248
|
};
|
|
194
249
|
/** Per-provider hooks — the real differences between the two transports. */
|
|
195
250
|
export type RoomBehavior<P> = {
|
|
@@ -220,7 +275,7 @@ export type RoomBehavior<P> = {
|
|
|
220
275
|
export declare const bindRoomProtocol: <P extends RoomProvider<P>>(syncProtocol: SyncProtocol, behavior: RoomBehavior<P>) => {
|
|
221
276
|
messageHandlers: Record<number, RoomMessageHandler<P>>;
|
|
222
277
|
readMessage: (provider: P, buf: Uint8Array, emitSynced: boolean, send?: (frame: Uint8Array) => void) => encoding.Encoder;
|
|
223
|
-
bcSubscriber: (provider: P) => (data: ArrayBuffer, origin: unknown) => void;
|
|
278
|
+
bcSubscriber: (provider: P) => (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
224
279
|
awarenessUpdateHandler: (provider: P) => ({ added, updated, removed }: AwarenessUpdate, origin: unknown) => void;
|
|
225
280
|
broadcastUpdate: (provider: P, update: Uint8Array, via?: (provider: P, buf: Uint8Array) => void) => void;
|
|
226
281
|
step1: (provider: P) => Uint8Array<ArrayBufferLike>;
|
|
@@ -229,3 +284,4 @@ export declare const bindRoomProtocol: <P extends RoomProvider<P>>(syncProtocol:
|
|
|
229
284
|
connectBc: (provider: P & BcMember) => void;
|
|
230
285
|
disconnectBc: (provider: P & BcMember) => void;
|
|
231
286
|
};
|
|
287
|
+
export {};
|
|
@@ -41,10 +41,8 @@
|
|
|
41
41
|
* - `handlers` — ws adds `messageAuth` (the auth reply exists only on a
|
|
42
42
|
* server socket — a BC room has no authority to deny).
|
|
43
43
|
*/
|
|
44
|
-
import * as bc from 'lib0-v14/broadcastchannel';
|
|
45
44
|
import * as encoding from 'lib0-v14/encoding';
|
|
46
45
|
import * as decoding from 'lib0-v14/decoding';
|
|
47
|
-
import * as env from 'lib0-v14/environment';
|
|
48
46
|
import * as promise from 'lib0-v14/promise';
|
|
49
47
|
import { applyAwarenessUpdate, encodeAwarenessUpdate } from '../protocols/awareness.js';
|
|
50
48
|
import { BARE_REPLY_LENGTH, frame, GENERATION, writeProtocolVersion } from '../protocols/envelope.js';
|
|
@@ -171,6 +169,37 @@ export const createChunkReader = (maxBytes = Infinity, admit = () => true) => {
|
|
|
171
169
|
};
|
|
172
170
|
/** An awareness frame carrying `clients`' entries of `states` (default: their current ones). */
|
|
173
171
|
const awarenessFrame = (awareness, clients, states) => frame(messageAwareness, (e) => encoding.writeVarUint8Array(e, encodeAwarenessUpdate(awareness, clients, states)));
|
|
172
|
+
const channels = new Map();
|
|
173
|
+
const channelNamed = (room) => {
|
|
174
|
+
let c = channels.get(room);
|
|
175
|
+
if (c === undefined) {
|
|
176
|
+
const subs = new Set();
|
|
177
|
+
const bc = new BroadcastChannel(room);
|
|
178
|
+
bc.onmessage = (e) => subs.forEach((sub) => sub(e.data, null));
|
|
179
|
+
channels.set(room, (c = { bc, subs }));
|
|
180
|
+
}
|
|
181
|
+
return c;
|
|
182
|
+
};
|
|
183
|
+
/**
|
|
184
|
+
* The tabs of one browser, by room name: one `BroadcastChannel` per room,
|
|
185
|
+
* shared by this tab's subscribers. A publish reaches the other tabs and,
|
|
186
|
+
* at once, this tab's other subscribers (with the publisher as origin).
|
|
187
|
+
*/
|
|
188
|
+
export const tabs = {
|
|
189
|
+
subscribe: (room, f) => void channelNamed(room).subs.add(f),
|
|
190
|
+
unsubscribe: (room, f) => {
|
|
191
|
+
const c = channels.get(room);
|
|
192
|
+
if (c?.subs.delete(f) && c.subs.size === 0) {
|
|
193
|
+
c.bc.close();
|
|
194
|
+
channels.delete(room);
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
publish: (room, data, origin = null) => {
|
|
198
|
+
const c = channelNamed(room);
|
|
199
|
+
c.bc.postMessage(data);
|
|
200
|
+
c.subs.forEach((sub) => sub(data, origin));
|
|
201
|
+
}
|
|
202
|
+
};
|
|
174
203
|
/** The outbound quarantine: a read-only document does not spread. */
|
|
175
204
|
export const quarantined = (doc) => checkSchema(asEngineDoc(doc)) !== null;
|
|
176
205
|
/**
|
|
@@ -201,7 +230,7 @@ export const initLifecycle = (host, destroy, depart = () => { }) => {
|
|
|
201
230
|
}
|
|
202
231
|
else {
|
|
203
232
|
const leave = () => void destroy();
|
|
204
|
-
const proc =
|
|
233
|
+
const proc = globalThis.process ?? {};
|
|
205
234
|
proc.on?.('exit', leave);
|
|
206
235
|
host._leave = () => proc.off?.('exit', leave);
|
|
207
236
|
}
|
|
@@ -344,21 +373,9 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
344
373
|
// valid envelope surfaces through 'message-error'.
|
|
345
374
|
// A pending forged stamp this update would release is discarded
|
|
346
375
|
// (`discarded`) and reported the same way.
|
|
347
|
-
|
|
348
|
-
const payload = decoding.readVarUint8Array(decoder);
|
|
376
|
+
const update = decoding.readVarUint8Array(decoder);
|
|
349
377
|
const origin = emitSynced ? provider : (behavior.tabOrigin?.(provider) ?? provider);
|
|
350
378
|
const onError = (error) => provider.emit?.('message-error', [error, provider]);
|
|
351
|
-
let update;
|
|
352
|
-
try {
|
|
353
|
-
update =
|
|
354
|
-
syncMessageType === syncProtocol.messageYjsSyncStep2
|
|
355
|
-
? syncProtocol.step2Update(payload)
|
|
356
|
-
: payload;
|
|
357
|
-
}
|
|
358
|
-
catch (error) {
|
|
359
|
-
onError(error);
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
379
|
const { applied, problem, discarded } = syncProtocol.applyRemote(provider.doc, update, origin, onError);
|
|
363
380
|
const refused = problem ?? discarded;
|
|
364
381
|
if (refused) {
|
|
@@ -426,7 +443,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
426
443
|
const channelOf = (provider) => behavior.roomChannel(provider);
|
|
427
444
|
/** The BC subscriber: replies go back on the room channel. */
|
|
428
445
|
const bcSubscriber = (provider) => {
|
|
429
|
-
const send = (buf) =>
|
|
446
|
+
const send = (buf) => tabs.publish(channelOf(provider), buf, provider);
|
|
430
447
|
return (data, origin) => {
|
|
431
448
|
if (origin === provider)
|
|
432
449
|
return;
|
|
@@ -434,7 +451,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
434
451
|
readMessage(provider, new Uint8Array(data), false, send);
|
|
435
452
|
}
|
|
436
453
|
catch (error) {
|
|
437
|
-
//
|
|
454
|
+
// same-tab publishes are delivered synchronously — a malformed
|
|
438
455
|
// message must not propagate into the publisher's call stack.
|
|
439
456
|
provider.emit?.('message-error', [error, provider]);
|
|
440
457
|
}
|
|
@@ -477,12 +494,12 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
477
494
|
const connectBc = (provider) => {
|
|
478
495
|
const channel = channelOf(provider);
|
|
479
496
|
if (!provider.bcconnected) {
|
|
480
|
-
|
|
497
|
+
tabs.subscribe(channel, provider._bcSubscriber);
|
|
481
498
|
provider.bcconnected = true;
|
|
482
499
|
}
|
|
483
500
|
const [sv, presence] = hello(provider);
|
|
484
501
|
for (const buf of [sv, frame(messageQueryAwareness, () => { }), presence]) {
|
|
485
|
-
|
|
502
|
+
tabs.publish(channel, buf, provider);
|
|
486
503
|
}
|
|
487
504
|
};
|
|
488
505
|
/** The departure announcement — our presence, removed — on every transport the provider speaks. */
|
|
@@ -491,7 +508,7 @@ export const bindRoomProtocol = (syncProtocol, behavior) => {
|
|
|
491
508
|
const disconnectBc = (provider) => {
|
|
492
509
|
depart(provider);
|
|
493
510
|
if (provider.bcconnected) {
|
|
494
|
-
|
|
511
|
+
tabs.unsubscribe(channelOf(provider), provider._bcSubscriber);
|
|
495
512
|
provider.bcconnected = false;
|
|
496
513
|
}
|
|
497
514
|
};
|
|
@@ -122,7 +122,7 @@ export declare const bindWebsocketProvider: (Y: EngineApi) => {
|
|
|
122
122
|
bcChannel: string;
|
|
123
123
|
bcconnected: boolean;
|
|
124
124
|
disableBc: boolean;
|
|
125
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
125
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
126
126
|
/** The transaction origin of updates heard from another tab. */
|
|
127
127
|
_fromTab: {};
|
|
128
128
|
wsUnsuccessfulReconnects: number;
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
* via `'protocol-mismatch'`. A v13
|
|
32
32
|
* y-websocket server in the room therefore cannot feed updates to this
|
|
33
33
|
* provider (and vice versa) — see docs/crdt-v14-providers.md §server
|
|
34
|
-
* classification: only an OPAQUE
|
|
34
|
+
* classification: only an OPAQUE relay stays compatible; a server
|
|
35
35
|
* that participates in sync (like upstream `y-websocket-server`) must itself
|
|
36
36
|
* run the vendored v14 engine + v14 protocol modules.
|
|
37
37
|
*
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
* re-sends a Step1 on the live socket for harnesses that drop frames
|
|
47
47
|
* there (TCP never does).
|
|
48
48
|
*/
|
|
49
|
-
import * as bc from 'lib0-v14/broadcastchannel';
|
|
50
49
|
import * as decoding from 'lib0-v14/decoding';
|
|
51
50
|
import * as time from 'lib0-v14/time';
|
|
52
51
|
import * as math from 'lib0-v14/math';
|
|
@@ -57,7 +56,7 @@ import { messagePermissionDenied, messageReadOnly, READ_ONLY_DENIAL, readAuthMes
|
|
|
57
56
|
import { bindSync } from '../protocols/sync.js';
|
|
58
57
|
import { readCommentsMessage, writeCommentsSubscribe } from '../protocols/comments.js';
|
|
59
58
|
import { frame } from '../protocols/envelope.js';
|
|
60
|
-
import { assertRoomId, beginDestroy, bindRoomProtocol, chunkFrame, CLOSE, createChunkReader, emitFailed, initLifecycle, isRefusal, LOCAL_PRESENCE_LOSS, markSynced, messageAuth, messageChunk, messageComments, messageSaved, messageSync, MAX_FRAME_BYTES, SyncRefusedError } from './room.js';
|
|
59
|
+
import { assertRoomId, beginDestroy, bindRoomProtocol, tabs, chunkFrame, CLOSE, createChunkReader, emitFailed, initLifecycle, isRefusal, LOCAL_PRESENCE_LOSS, markSynced, messageAuth, messageChunk, messageComments, messageSaved, messageSync, MAX_FRAME_BYTES, SyncRefusedError } from './room.js';
|
|
61
60
|
import { asEngineDoc } from '../structs.js';
|
|
62
61
|
import { ATTRIBUTION_ROOT } from '../schema.js';
|
|
63
62
|
import { ATTRIBUTION_ORIGIN } from '../attribution/attribution.js';
|
|
@@ -95,7 +94,7 @@ export const bindWebsocketProvider = (Y) => {
|
|
|
95
94
|
/** Traffic for the other tabs goes out on the channel. */
|
|
96
95
|
const toTabs = (provider, buf) => {
|
|
97
96
|
if (provider.bcconnected)
|
|
98
|
-
|
|
97
|
+
tabs.publish(provider.bcChannel, buf, provider);
|
|
99
98
|
};
|
|
100
99
|
/** Room traffic goes to the server and to the other tabs. */
|
|
101
100
|
const broadcast = (provider, buf) => {
|
package/dist/crdt/purge.d.ts
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* held), a text delete mark record, a placement candidate.
|
|
14
14
|
*/
|
|
15
15
|
import type { EngineApi, EngineDoc } from './engine-api.js';
|
|
16
|
-
import type
|
|
17
|
-
import type
|
|
16
|
+
import { type PlacementModel } from './placement/model.js';
|
|
17
|
+
import { type TextEngine } from './text/model.js';
|
|
18
18
|
/** The horizon: the time and encoded state vector of the room's epoch (`room.purge.timing`). */
|
|
19
19
|
export type Horizon = {
|
|
20
20
|
at: number;
|
package/dist/crdt/purge.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { view as modelView } from './placement/model.js';
|
|
2
|
+
import { purgeStreams } from './text/model.js';
|
|
1
3
|
import { AT, BLOCK_ATTR_ROOT, DATA, DATA_LEAF_PREFIX, DEL_PREFIX, HORIZON_ATTR, HORIZON_ROOT, isNodeLike, REC_PREFIX, REGISTRY_KEY, WITHDRAW_PREFIX } from './schema.js';
|
|
2
4
|
import { bindDeletes } from './text/deletes.js';
|
|
5
|
+
import { deleteIndex } from './text/delete-index.js';
|
|
3
6
|
import { baseIdOf, isIncarnationId } from './incarnations.js';
|
|
4
7
|
import { attrItems, firstItem } from './structs.js';
|
|
5
8
|
const mapOf = (node) => attrItems(node);
|
|
@@ -12,14 +15,74 @@ export const readHorizon = (doc) => {
|
|
|
12
15
|
};
|
|
13
16
|
export const bindPurge = (Y) => {
|
|
14
17
|
const D = bindDeletes(Y);
|
|
18
|
+
const { rootSpans, holders, dropMarks, recordsIn, copiesOf, liveRoots, forget, collect } = deleteIndex(Y);
|
|
19
|
+
/**
|
|
20
|
+
* Whether every live mark holding a character of `spans` was written
|
|
21
|
+
* where `old` says (a withdrawn block's content was deleted
|
|
22
|
+
* before the horizon). Characters no mark holds count as old.
|
|
23
|
+
*/
|
|
24
|
+
const heldBefore = (doc, spans, old) => {
|
|
25
|
+
const s = D.state(doc);
|
|
26
|
+
return spans
|
|
27
|
+
.flatMap((sp) => rootSpans(s, sp))
|
|
28
|
+
.every((r) => holders(s, r).every((mark) => old(mark.client, mark.clock)));
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The text's part (`room.purge.what`), inside the purge
|
|
32
|
+
* transaction: delete every text delete mark record `old` names, and
|
|
33
|
+
* every restoration record `old` names whose copies are all deleted
|
|
34
|
+
* and that no remaining mark holds; its copies are forgotten (the
|
|
35
|
+
* `gcFilter` no longer keeps them) and collected. Writes no mark.
|
|
36
|
+
*/
|
|
37
|
+
const purgeText = (doc, old) => {
|
|
38
|
+
const s = D.state(doc);
|
|
39
|
+
const tr = s.doc._transaction;
|
|
40
|
+
if (tr === null)
|
|
41
|
+
throw new Error('purge: outside a transaction');
|
|
42
|
+
const spans = [];
|
|
43
|
+
const dropped = [];
|
|
44
|
+
for (let it = firstItem(s.marks); it; it = it.right)
|
|
45
|
+
if (!it.deleted)
|
|
46
|
+
for (let j = 0; j < it.length; j++) {
|
|
47
|
+
const r = { client: it.id.client, clock: it.id.clock + j };
|
|
48
|
+
if (!old(r.client, r.clock))
|
|
49
|
+
continue;
|
|
50
|
+
dropped.push(r);
|
|
51
|
+
const last = spans[spans.length - 1];
|
|
52
|
+
if (last !== undefined && last.c === r.client && last.k + last.n === r.clock)
|
|
53
|
+
last.n++;
|
|
54
|
+
else
|
|
55
|
+
spans.push({ c: r.client, k: r.clock, n: 1 });
|
|
56
|
+
}
|
|
57
|
+
dropMarks(s, dropped);
|
|
58
|
+
const marks = dropped.length;
|
|
59
|
+
D.remove(tr, spans);
|
|
60
|
+
const doomed = [];
|
|
61
|
+
attrItems(s.restored).forEach((it, key) => {
|
|
62
|
+
if (it.deleted || !old(it.id.client, it.id.clock))
|
|
63
|
+
return;
|
|
64
|
+
const [record, bytes] = recordsIn(it, null)[0] ?? [];
|
|
65
|
+
if (bytes === undefined)
|
|
66
|
+
return;
|
|
67
|
+
const copies = copiesOf(record, bytes);
|
|
68
|
+
const dead = copies.every((e) => liveRoots(s, { c: e.c, k: e.k, n: e.n, rk: e.k }).length === 0 &&
|
|
69
|
+
holders(s, { c: e.rc, k: e.rk, n: e.n }).length === 0);
|
|
70
|
+
if (dead)
|
|
71
|
+
doomed.push({ key, copies });
|
|
72
|
+
});
|
|
73
|
+
for (const { key, copies } of doomed) {
|
|
74
|
+
s.restored.deleteAttr(key);
|
|
75
|
+
forget(s, copies);
|
|
76
|
+
collect(s, tr, copies);
|
|
77
|
+
}
|
|
78
|
+
return { marks, records: doomed.length };
|
|
79
|
+
};
|
|
15
80
|
/**
|
|
16
81
|
* Purge from `doc` (through `facade`, the facade over it) what was
|
|
17
82
|
* deleted before `horizon`, and write the horizon record. Runs inside the
|
|
18
83
|
* caller's transaction.
|
|
19
84
|
*/
|
|
20
85
|
const purge = (doc, facade, horizon) => {
|
|
21
|
-
const M = facade.model;
|
|
22
|
-
const T = facade.text;
|
|
23
86
|
const report = {
|
|
24
87
|
removed: 0,
|
|
25
88
|
emptied: 0,
|
|
@@ -32,7 +95,7 @@ export const bindPurge = (Y) => {
|
|
|
32
95
|
const vector = Y.decodeStateVector(horizon.sv);
|
|
33
96
|
const old = (client, clock) => clock < (vector.get(client) ?? 0);
|
|
34
97
|
const oldItem = (item) => item !== undefined && !item.deleted && old(item.id.client, item.id.clock);
|
|
35
|
-
const view =
|
|
98
|
+
const view = modelView(doc);
|
|
36
99
|
const { blocks, own, placements } = view;
|
|
37
100
|
const marks = (node, prefix) => [...node.attrKeys()]
|
|
38
101
|
.filter((key) => key.startsWith(prefix))
|
|
@@ -93,7 +156,7 @@ export const bindPurge = (Y) => {
|
|
|
93
156
|
if (dead.has(id))
|
|
94
157
|
continue;
|
|
95
158
|
const s = own.streamOf(id);
|
|
96
|
-
if (s !== undefined && !
|
|
159
|
+
if (s !== undefined && !heldBefore(doc, regionSpans(s), old))
|
|
97
160
|
continue;
|
|
98
161
|
const left = (children.get(id) ?? []).every((child) => {
|
|
99
162
|
const rec = blocks.get(child);
|
|
@@ -157,7 +220,7 @@ export const bindPurge = (Y) => {
|
|
|
157
220
|
// A deleted block that stays: its stream's text (boundaries kept), its
|
|
158
221
|
// data leaves and its claims.
|
|
159
222
|
const emptied = [...dead].filter((id) => !removable.has(id));
|
|
160
|
-
|
|
223
|
+
purgeStreams(emptied.flatMap((id) => {
|
|
161
224
|
const s = own.streamOf(id);
|
|
162
225
|
return s === undefined || s.end - s.start <= s.inert.length ? [] : [s];
|
|
163
226
|
}));
|
|
@@ -250,7 +313,7 @@ export const bindPurge = (Y) => {
|
|
|
250
313
|
report.candidates += rec.cands.length - 1;
|
|
251
314
|
}
|
|
252
315
|
// Text delete marks and restoration records past the horizon.
|
|
253
|
-
const text =
|
|
316
|
+
const text = purgeText(doc, old);
|
|
254
317
|
report.marks = text.marks;
|
|
255
318
|
report.records = text.records;
|
|
256
319
|
// The horizon record, last.
|