edytor 1.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
|
@@ -13,8 +13,8 @@ export const bindProviders = (Y) => {
|
|
|
13
13
|
provider.on('failed', failed);
|
|
14
14
|
return () => provider.destroy();
|
|
15
15
|
}, { bound: Infinity, target: `indexeddb:${name}` });
|
|
16
|
-
/** A document stored only here
|
|
17
|
-
const createIndexeddbSync = (name) => localSync(name
|
|
16
|
+
/** A document stored only here. */
|
|
17
|
+
const createIndexeddbSync = (name) => localSync(name);
|
|
18
18
|
/**
|
|
19
19
|
* The socket, and by default a local store beside it. The store is its
|
|
20
20
|
* own provider on the document (`attach`), so the document's readiness
|
|
@@ -107,116 +107,7 @@ export const bindProviders = (Y) => {
|
|
|
107
107
|
};
|
|
108
108
|
return Object.assign(sync, { bound: Infinity, target: `websocket:${room}`, persistName });
|
|
109
109
|
};
|
|
110
|
-
/**
|
|
111
|
-
* `[serverUrl (no trailing slash), room]` of a target, the room id checked.
|
|
112
|
-
* The target is `{ server, room }`; the names before them are refused, in
|
|
113
|
-
* a message that names the `caller` it was passed to.
|
|
114
|
-
*/
|
|
115
|
-
const targetOf = (caller, options) => {
|
|
116
|
-
const { server, room } = options;
|
|
117
|
-
if (typeof server !== 'string' || typeof room !== 'string')
|
|
118
|
-
throw new TypeError(`${caller}: the target is \`server\` and \`room\` (\`serverUrl\` and \`roomName\` are gone)`);
|
|
119
|
-
assertRoomId(room);
|
|
120
|
-
return [server.replace(/\/+$/, ''), room];
|
|
121
|
-
};
|
|
122
|
-
/**
|
|
123
|
-
* Keep a document fresh without opening it: load its local store
|
|
124
|
-
* (the one `createWebsocketSync` keeps, `edytor:<server>/<room>` unless
|
|
125
|
-
* `persistName` names another), dial the room once, take what it lacks
|
|
126
|
-
* and hand it what the store holds that the room lacks, wait until the
|
|
127
|
-
* room stored it, then close. Resolves with whether the room sent
|
|
128
|
-
* anything new; rejects with the room's refusal (`SyncRefusedError`),
|
|
129
|
-
* after `timeout`, or where there is no IndexedDB.
|
|
130
|
-
*/
|
|
131
|
-
const prefetch = (options) => {
|
|
132
|
-
const [serverUrl, room] = targetOf('prefetch', options);
|
|
133
|
-
if (typeof indexedDB === 'undefined') {
|
|
134
|
-
return Promise.reject(new TypeError('prefetch needs IndexedDB to keep the document'));
|
|
135
|
-
}
|
|
136
|
-
const doc = keepingReplaced(new Y.Doc());
|
|
137
|
-
const local = new idb.IndexeddbPersistence(options.persistName ?? `edytor:${serverUrl}/${room}`, doc, { disableBc: true });
|
|
138
|
-
let socket = null;
|
|
139
|
-
/** Prefetch's one timer: its deadline (`timeout`), cleared when it closes. */
|
|
140
|
-
let deadline;
|
|
141
|
-
const close = async () => {
|
|
142
|
-
clearTimeout(deadline);
|
|
143
|
-
socket?.destroy();
|
|
144
|
-
await local.destroy();
|
|
145
|
-
doc.destroy();
|
|
146
|
-
};
|
|
147
|
-
return new Promise((resolve, reject) => {
|
|
148
|
-
const fail = (error) => void close().then(() => reject(error));
|
|
149
|
-
deadline = setTimeout(() => fail(new Error(`prefetch of ${room} timed out`)), options.timeout ?? 30_000);
|
|
150
|
-
local.whenSynced.then(() => {
|
|
151
|
-
const before = Y.encodeStateVector(doc);
|
|
152
|
-
const provider = (socket = new ws.WebsocketProvider(serverUrl, room, doc, {
|
|
153
|
-
params: options.params,
|
|
154
|
-
WebSocketPolyfill: options.WebSocketPolyfill,
|
|
155
|
-
maxBackoffTime: options.maxBackoffTime,
|
|
156
|
-
connectTimeout: options.connectTimeout,
|
|
157
|
-
maxFrameBytes: options.maxFrameBytes,
|
|
158
|
-
disableBc: true
|
|
159
|
-
}));
|
|
160
|
-
// A prefetch is nobody's presence.
|
|
161
|
-
provider.awareness.setLocalState(null);
|
|
162
|
-
const done = () => {
|
|
163
|
-
if (!provider.synced || !provider.saved)
|
|
164
|
-
return;
|
|
165
|
-
const after = Y.encodeStateVector(doc);
|
|
166
|
-
const updated = after.length !== before.length || after.some((b, i) => b !== before[i]);
|
|
167
|
-
void close().then(() => resolve({ updated }));
|
|
168
|
-
};
|
|
169
|
-
provider.on('synced', done);
|
|
170
|
-
provider.on('saved', done);
|
|
171
|
-
provider.on('refused', (refusal) => fail(refusal));
|
|
172
|
-
done();
|
|
173
|
-
}, fail);
|
|
174
|
-
});
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* When the room last stored a change (ms since the epoch), or `null`:
|
|
178
|
-
* one authorized HTTP `GET <server>/<room>?lastUpdated`, which
|
|
179
|
-
* `routeDocumentSocket` answers without opening the document. Compare
|
|
180
|
-
* it with when a document was last fetched to decide whether to
|
|
181
|
-
* `prefetch` it. Throws on an HTTP error (`403` refused, `401` expired).
|
|
182
|
-
*/
|
|
183
|
-
const lastUpdated = async (options) => {
|
|
184
|
-
const [serverUrl, room] = targetOf('lastUpdated', options);
|
|
185
|
-
const url = new URL(`${serverUrl.replace(/^ws/, 'http')}/${encodeURIComponent(room)}`);
|
|
186
|
-
for (const [key, value] of Object.entries(options.params ?? {}))
|
|
187
|
-
url.searchParams.set(key, value);
|
|
188
|
-
url.searchParams.set('lastUpdated', '1');
|
|
189
|
-
const response = await (options.fetch ?? fetch)(url.toString());
|
|
190
|
-
if (!response.ok) {
|
|
191
|
-
throw new Error(`lastUpdated of ${room}: ${response.status} ${await response.text()}`);
|
|
192
|
-
}
|
|
193
|
-
const { lastUpdated: at } = (await response.json());
|
|
194
|
-
return typeof at === 'number' ? at : null;
|
|
195
|
-
};
|
|
196
|
-
/**
|
|
197
|
-
* The room's document as JSON, or `null` when it stores nothing yet:
|
|
198
|
-
* one authorized HTTP `GET <server>/<room>?snapshot`, which
|
|
199
|
-
* `routeDocumentSocket` answers from the room's live document. Show it
|
|
200
|
-
* while a view's own copy hydrates: `<Edytor snapshot>`. Throws on an
|
|
201
|
-
* HTTP error (`403` refused, `401` expired).
|
|
202
|
-
*/
|
|
203
|
-
const documentSnapshot = async (options) => {
|
|
204
|
-
const [serverUrl, room] = targetOf('documentSnapshot', options);
|
|
205
|
-
const url = new URL(`${serverUrl.replace(/^ws/, 'http')}/${encodeURIComponent(room)}`);
|
|
206
|
-
for (const [key, value] of Object.entries(options.params ?? {}))
|
|
207
|
-
url.searchParams.set(key, value);
|
|
208
|
-
url.searchParams.set('snapshot', '1');
|
|
209
|
-
const response = await (options.fetch ?? fetch)(url.toString());
|
|
210
|
-
if (!response.ok) {
|
|
211
|
-
throw new Error(`snapshot of ${room}: ${response.status} ${await response.text()}`);
|
|
212
|
-
}
|
|
213
|
-
const { lastUpdated: at, document } = (await response.json());
|
|
214
|
-
return typeof at === 'number' ? document : null;
|
|
215
|
-
};
|
|
216
110
|
return {
|
|
217
|
-
prefetch,
|
|
218
|
-
lastUpdated,
|
|
219
|
-
documentSnapshot,
|
|
220
111
|
IndexeddbPersistence: idb.IndexeddbPersistence,
|
|
221
112
|
WebsocketProvider: ws.WebsocketProvider,
|
|
222
113
|
watchComments: ws.watchComments,
|
|
@@ -227,3 +118,107 @@ export const bindProviders = (Y) => {
|
|
|
227
118
|
createWebsocketSync
|
|
228
119
|
};
|
|
229
120
|
};
|
|
121
|
+
/**
|
|
122
|
+
* `[serverUrl (no trailing slash), room]` of a target, the room id checked.
|
|
123
|
+
* The target is `{ server, room }`; the names before them are refused, in
|
|
124
|
+
* a message that names the `caller` it was passed to.
|
|
125
|
+
*/
|
|
126
|
+
export const targetOf = (caller, options) => {
|
|
127
|
+
const { server, room } = options;
|
|
128
|
+
if (typeof server !== 'string' || typeof room !== 'string')
|
|
129
|
+
throw new TypeError(`${caller}: the target is \`server\` and \`room\``);
|
|
130
|
+
assertRoomId(room);
|
|
131
|
+
return [server.replace(/\/+$/, ''), room];
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Keep a document fresh without opening it: load its local store
|
|
135
|
+
* (the one `createWebsocketSync` keeps, `edytor:<server>/<room>` unless
|
|
136
|
+
* `persistName` names another), dial the room once, take what it lacks
|
|
137
|
+
* and hand it what the store holds that the room lacks, wait until the
|
|
138
|
+
* room stored it, then close. Resolves with whether the room sent
|
|
139
|
+
* anything new; rejects with the room's refusal (`SyncRefusedError`),
|
|
140
|
+
* after `timeout`, or where there is no IndexedDB. Over the provider
|
|
141
|
+
* classes of `stack` (bound to `Y`).
|
|
142
|
+
*/
|
|
143
|
+
export const prefetchWith = (Y, stack, options) => {
|
|
144
|
+
const [serverUrl, room] = targetOf('prefetch', options);
|
|
145
|
+
if (typeof indexedDB === 'undefined') {
|
|
146
|
+
return Promise.reject(new TypeError('prefetch needs IndexedDB to keep the document'));
|
|
147
|
+
}
|
|
148
|
+
const doc = keepingReplaced(new Y.Doc());
|
|
149
|
+
const local = new stack.IndexeddbPersistence(options.persistName ?? `edytor:${serverUrl}/${room}`, doc, { disableBc: true });
|
|
150
|
+
let socket = null;
|
|
151
|
+
/** Prefetch's one timer: its deadline (`timeout`), cleared when it closes. */
|
|
152
|
+
let deadline;
|
|
153
|
+
const close = async () => {
|
|
154
|
+
clearTimeout(deadline);
|
|
155
|
+
socket?.destroy();
|
|
156
|
+
await local.destroy();
|
|
157
|
+
doc.destroy();
|
|
158
|
+
};
|
|
159
|
+
return new Promise((resolve, reject) => {
|
|
160
|
+
const fail = (error) => void close().then(() => reject(error));
|
|
161
|
+
deadline = setTimeout(() => fail(new Error(`prefetch of ${room} timed out`)), options.timeout ?? 30_000);
|
|
162
|
+
local.whenSynced.then(() => {
|
|
163
|
+
const before = Y.encodeStateVector(doc);
|
|
164
|
+
const provider = (socket = new stack.WebsocketProvider(serverUrl, room, doc, {
|
|
165
|
+
params: options.params,
|
|
166
|
+
WebSocketPolyfill: options.WebSocketPolyfill,
|
|
167
|
+
maxBackoffTime: options.maxBackoffTime,
|
|
168
|
+
connectTimeout: options.connectTimeout,
|
|
169
|
+
maxFrameBytes: options.maxFrameBytes,
|
|
170
|
+
disableBc: true
|
|
171
|
+
}));
|
|
172
|
+
// A prefetch is nobody's presence.
|
|
173
|
+
provider.awareness.setLocalState(null);
|
|
174
|
+
const done = () => {
|
|
175
|
+
if (!provider.synced || !provider.saved)
|
|
176
|
+
return;
|
|
177
|
+
const after = Y.encodeStateVector(doc);
|
|
178
|
+
const updated = after.length !== before.length || after.some((b, i) => b !== before[i]);
|
|
179
|
+
void close().then(() => resolve({ updated }));
|
|
180
|
+
};
|
|
181
|
+
provider.on('synced', done);
|
|
182
|
+
provider.on('saved', done);
|
|
183
|
+
provider.on('refused', (refusal) => fail(refusal));
|
|
184
|
+
done();
|
|
185
|
+
}, fail);
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* One authorized HTTP `GET <server>/<room>?<key>` (`lastUpdated`,
|
|
190
|
+
* `snapshot`), which `routeDocumentSocket` answers without a socket: its
|
|
191
|
+
* JSON. Throws on an HTTP error (`403` refused, `401` expired).
|
|
192
|
+
*/
|
|
193
|
+
const query = async (caller, key, options) => {
|
|
194
|
+
const [serverUrl, room] = targetOf(caller, options);
|
|
195
|
+
const url = new URL(`${serverUrl.replace(/^ws/, 'http')}/${encodeURIComponent(room)}`);
|
|
196
|
+
for (const [name, value] of Object.entries(options.params ?? {}))
|
|
197
|
+
url.searchParams.set(name, value);
|
|
198
|
+
url.searchParams.set(key, '1');
|
|
199
|
+
const response = await (options.fetch ?? fetch)(url.toString());
|
|
200
|
+
if (!response.ok) {
|
|
201
|
+
throw new Error(`${key} of ${room}: ${response.status} ${await response.text()}`);
|
|
202
|
+
}
|
|
203
|
+
return (await response.json());
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* When the room last stored a change (ms since the epoch), or `null`:
|
|
207
|
+
* `?lastUpdated`, answered without opening the document. Compare it with
|
|
208
|
+
* when a document was last fetched to decide whether to `prefetch` it.
|
|
209
|
+
* Throws on an HTTP error (`403` refused, `401` expired).
|
|
210
|
+
*/
|
|
211
|
+
export const lastUpdated = async (options) => {
|
|
212
|
+
const { lastUpdated: at } = await query('lastUpdated', 'lastUpdated', options);
|
|
213
|
+
return typeof at === 'number' ? at : null;
|
|
214
|
+
};
|
|
215
|
+
/**
|
|
216
|
+
* The room's document as JSON, or `null` when it stores nothing yet:
|
|
217
|
+
* `?snapshot`, answered from the room's live document. Show it while a
|
|
218
|
+
* view's own copy hydrates: `<Edytor snapshot>`. Throws on an HTTP error
|
|
219
|
+
* (`403` refused, `401` expired).
|
|
220
|
+
*/
|
|
221
|
+
export const documentSnapshot = async (options) => {
|
|
222
|
+
const { lastUpdated: at, document } = await query('documentSnapshot', 'snapshot', options);
|
|
223
|
+
return typeof at === 'number' ? document : null;
|
|
224
|
+
};
|
|
@@ -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 {};
|