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
|
@@ -7,38 +7,28 @@
|
|
|
7
7
|
* (`applyRemote`) and are stamped with a non-null `remoteApplyOrigin` so
|
|
8
8
|
* echo suppression + undo exclusion keep working.
|
|
9
9
|
*
|
|
10
|
-
* Wire format (y-protocols' layout;
|
|
11
|
-
* schema generation
|
|
10
|
+
* Wire format (y-protocols' layout; every update in the engine's one
|
|
11
|
+
* encoding, the columnar one upstream calls v2, since schema generation 6):
|
|
12
12
|
*
|
|
13
13
|
* ```
|
|
14
14
|
* varuint messageType | payload
|
|
15
15
|
* messageType 0 (SyncStep1): varuint8array stateVector
|
|
16
|
-
* messageType 1 (SyncStep2): varuint8array update
|
|
17
|
-
* messageType 2 (Update): varuint8array update
|
|
16
|
+
* messageType 1 (SyncStep2): varuint8array update
|
|
17
|
+
* messageType 2 (Update): varuint8array update
|
|
18
18
|
* ```
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* relayed as it is. A receiver converts a SyncStep2 to v1
|
|
27
|
-
* ({@link step2Update}) and applies it through the one inbound path. That does NOT mean v13 and v14 peers are interchangeable — the
|
|
28
|
-
* provider layer (`providers/*`) wraps every message in the protocol-version
|
|
29
|
-
* envelope (`protocols/envelope.ts`) so engines that do not speak v14 never
|
|
30
|
-
* reach `readSyncMessage`.
|
|
20
|
+
* What the engine emits on `doc.on('update')` is relayed as it is, and a
|
|
21
|
+
* SyncStep2 is applied through the same inbound path as an Update. That
|
|
22
|
+
* does NOT mean v13 and v14 peers are interchangeable — the provider layer
|
|
23
|
+
* (`providers/*`) wraps every message in the protocol-version envelope
|
|
24
|
+
* (`protocols/envelope.ts`) so engines that do not speak v14 never reach
|
|
25
|
+
* {@link applyRemote}.
|
|
31
26
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* exist for harnesses/custom transports; the shipped providers do not
|
|
38
|
-
* route room traffic through them.
|
|
39
|
-
* - The path the providers use lives in `providers/room.ts`:
|
|
40
|
-
* `applyRemote` + per-type dispatch, so a refused payload never mutates
|
|
41
|
-
* the live doc and an unknown type is a reported drop, not a throw.
|
|
27
|
+
* One inbound path: every payload a client or a server receives applies
|
|
28
|
+
* through `applyRemote`, which refuses a forged schema stamp before
|
|
29
|
+
* anything integrates; the providers dispatch by message type in
|
|
30
|
+
* `providers/room.ts` (an unknown type is a reported drop), the room in
|
|
31
|
+
* `cloudflare/room/admission.ts`.
|
|
42
32
|
*
|
|
43
33
|
* Engine functions are injected (`bindSync(Y)`): `src/lib` never
|
|
44
34
|
* runtime-imports the vendored `.js` (see `engine-api.ts`), so the caller
|
|
@@ -55,7 +45,7 @@ import { asEngineDoc, attrItems } from '../structs.js';
|
|
|
55
45
|
* is optional). Remote integration MUST always arrive under a non-null,
|
|
56
46
|
* non-tracked origin:
|
|
57
47
|
*
|
|
58
|
-
* - history capture (`document.history
|
|
48
|
+
* - history capture (`document.history`, edytor's undo manager) keeps
|
|
59
49
|
* untracked, non-local transactions out of the local undo stack — a
|
|
60
50
|
* `null` origin is ambiguous (it is also the untyped-local marker), so
|
|
61
51
|
* an explicit marker documents intent for `doc.on('update')`
|
|
@@ -73,6 +63,12 @@ const defaultRemoteApplyOrigin = () => Symbol('edytor-remote-apply');
|
|
|
73
63
|
export const messageYjsSyncStep1 = 0;
|
|
74
64
|
export const messageYjsSyncStep2 = 1;
|
|
75
65
|
export const messageYjsUpdate = 2;
|
|
66
|
+
/** An inbound update that could not be read or applied: its handler hears it, the console shows it. */
|
|
67
|
+
const reportUpdateError = (error, errorHandler) => {
|
|
68
|
+
if (errorHandler != null)
|
|
69
|
+
errorHandler(error);
|
|
70
|
+
console.error('Caught error while handling a Yjs update', error);
|
|
71
|
+
};
|
|
76
72
|
/**
|
|
77
73
|
* Bind the sync protocol to a concrete engine module (the vendored v14 `Y`).
|
|
78
74
|
*/
|
|
@@ -85,29 +81,7 @@ export const bindSync = (Y) => {
|
|
|
85
81
|
};
|
|
86
82
|
const writeSyncStep2 = (encoder, doc, encodedStateVector) => {
|
|
87
83
|
encoding.writeVarUint(encoder, messageYjsSyncStep2);
|
|
88
|
-
encoding.writeVarUint8Array(encoder, Y.
|
|
89
|
-
};
|
|
90
|
-
/** A SyncStep2 payload (v2) as the v1 update every inbound path applies. */
|
|
91
|
-
const step2Update = (payload) => Y.convertUpdateFormatV2ToV1(payload);
|
|
92
|
-
/** Read SyncStep1 message and reply with SyncStep2. */
|
|
93
|
-
const readSyncStep1 = (decoder, encoder, doc) => writeSyncStep2(encoder, doc, decoding.readVarUint8Array(decoder));
|
|
94
|
-
/**
|
|
95
|
-
* Read and apply structs + delete set to a doc — through the same
|
|
96
|
-
* inbound refusal as the providers ({@link applyRemote}), which report
|
|
97
|
-
* a refused stamp; this raw reader reports only decode/apply errors.
|
|
98
|
-
*/
|
|
99
|
-
const readSyncStep2 = (decoder, doc, transactionOrigin, errorHandler) => {
|
|
100
|
-
let update;
|
|
101
|
-
try {
|
|
102
|
-
update = step2Update(decoding.readVarUint8Array(decoder));
|
|
103
|
-
}
|
|
104
|
-
catch (error) {
|
|
105
|
-
if (errorHandler != null)
|
|
106
|
-
errorHandler(error);
|
|
107
|
-
console.error('Caught error while handling a Yjs update', error);
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
applyRemote(doc, update, transactionOrigin, errorHandler);
|
|
84
|
+
encoding.writeVarUint8Array(encoder, Y.encodeStateAsUpdate(doc, encodedStateVector));
|
|
111
85
|
};
|
|
112
86
|
/**
|
|
113
87
|
* The state-vector coverage test of the join rule: does the encoded
|
|
@@ -125,10 +99,6 @@ export const bindSync = (Y) => {
|
|
|
125
99
|
encoding.writeVarUint(encoder, messageYjsUpdate);
|
|
126
100
|
encoding.writeVarUint8Array(encoder, update);
|
|
127
101
|
};
|
|
128
|
-
/** Read and apply an Update (v1) through the inbound refusal. */
|
|
129
|
-
const readUpdate = (decoder, doc, transactionOrigin, errorHandler) => {
|
|
130
|
-
applyRemote(doc, decoding.readVarUint8Array(decoder), transactionOrigin, errorHandler);
|
|
131
|
-
};
|
|
132
102
|
/**
|
|
133
103
|
* Inbound refusal: the schema problem `parts` (decoded updates,
|
|
134
104
|
* judged together) would write, or `null`. The frame already proved its
|
|
@@ -193,7 +163,7 @@ export const bindSync = (Y) => {
|
|
|
193
163
|
/** What the engine holds pending on `doc` (structs and deletes waiting for a dependency). */
|
|
194
164
|
const held = (doc) => {
|
|
195
165
|
const pending = [doc.store.pendingStructs?.update, doc.store.pendingDs];
|
|
196
|
-
return pending.flatMap((bytes) => (bytes ? [Y.
|
|
166
|
+
return pending.flatMap((bytes) => (bytes ? [Y.decodeUpdate(bytes)] : []));
|
|
197
167
|
};
|
|
198
168
|
/**
|
|
199
169
|
* Apply one inbound update (SyncStep2 / Update payload) to the live doc
|
|
@@ -230,9 +200,7 @@ export const bindSync = (Y) => {
|
|
|
230
200
|
: { applied: true, problem: null, discarded };
|
|
231
201
|
}
|
|
232
202
|
catch (error) {
|
|
233
|
-
|
|
234
|
-
errorHandler(error);
|
|
235
|
-
console.error('Caught error while handling a Yjs update', error);
|
|
203
|
+
reportUpdateError(error, errorHandler);
|
|
236
204
|
return { applied: false, problem: null };
|
|
237
205
|
}
|
|
238
206
|
};
|
|
@@ -248,12 +216,12 @@ export const bindSync = (Y) => {
|
|
|
248
216
|
* vector alone ignores the second field; a body without it acknowledges
|
|
249
217
|
* no deletes.
|
|
250
218
|
*/
|
|
251
|
-
const writeSaved = (encoder, doc, deletes, unstored = doc.store.pendingDs && Y.
|
|
219
|
+
const writeSaved = (encoder, doc, deletes, unstored = doc.store.pendingDs && Y.decodeUpdate(doc.store.pendingDs).ds) => {
|
|
252
220
|
encoding.writeVarUint8Array(encoder, Y.encodeStateVector(doc));
|
|
253
221
|
const held = deletes && unstored ? Y.diffIdSet(deletes, unstored) : deletes;
|
|
254
222
|
if (!held || held.isEmpty())
|
|
255
223
|
return;
|
|
256
|
-
const body = new Y.
|
|
224
|
+
const body = new Y.UpdateEncoder();
|
|
257
225
|
encoding.writeVarUint(body.restEncoder, 0); // no structs
|
|
258
226
|
Y.writeIdSet(body, held);
|
|
259
227
|
encoding.writeVarUint8Array(encoder, body.toUint8Array());
|
|
@@ -265,31 +233,6 @@ export const bindSync = (Y) => {
|
|
|
265
233
|
? Y.decodeUpdate(decoding.readVarUint8Array(decoder)).ds
|
|
266
234
|
: null
|
|
267
235
|
});
|
|
268
|
-
/**
|
|
269
|
-
* Read a sync message from `decoder`; writes any reply (SyncStep2) into
|
|
270
|
-
* `encoder`. Returns the decoded message type. Callers MUST gate the
|
|
271
|
-
* protocol-version envelope before invoking this (see `envelope.ts`).
|
|
272
|
-
* RAW: payloads apply through the inbound refusal (unreported) and an
|
|
273
|
-
* unknown message type THROWS — the shipped providers dispatch through
|
|
274
|
-
* `providers/room.ts` (`applyRemote` + reported drops) instead.
|
|
275
|
-
*/
|
|
276
|
-
const readSyncMessage = (decoder, encoder, doc, transactionOrigin, errorHandler) => {
|
|
277
|
-
const messageType = decoding.readVarUint(decoder);
|
|
278
|
-
switch (messageType) {
|
|
279
|
-
case messageYjsSyncStep1:
|
|
280
|
-
readSyncStep1(decoder, encoder, doc);
|
|
281
|
-
break;
|
|
282
|
-
case messageYjsSyncStep2:
|
|
283
|
-
readSyncStep2(decoder, doc, transactionOrigin, errorHandler);
|
|
284
|
-
break;
|
|
285
|
-
case messageYjsUpdate:
|
|
286
|
-
readUpdate(decoder, doc, transactionOrigin, errorHandler);
|
|
287
|
-
break;
|
|
288
|
-
default:
|
|
289
|
-
throw new Error('Unknown message type');
|
|
290
|
-
}
|
|
291
|
-
return messageType;
|
|
292
|
-
};
|
|
293
236
|
return {
|
|
294
237
|
messageYjsSyncStep1,
|
|
295
238
|
messageYjsSyncStep2,
|
|
@@ -297,12 +240,7 @@ export const bindSync = (Y) => {
|
|
|
297
240
|
remoteApplyOrigin,
|
|
298
241
|
writeSyncStep1,
|
|
299
242
|
writeSyncStep2,
|
|
300
|
-
step2Update,
|
|
301
|
-
readSyncStep1,
|
|
302
|
-
readSyncStep2,
|
|
303
243
|
writeUpdate,
|
|
304
|
-
readUpdate,
|
|
305
|
-
readSyncMessage,
|
|
306
244
|
applyRemote,
|
|
307
245
|
lacks,
|
|
308
246
|
writeSaved,
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
import { type ProviderStack } from './index.js';
|
|
1
|
+
import { type PrefetchOptions, type ProviderStack } from './index.js';
|
|
2
2
|
export declare const providers: ProviderStack;
|
|
3
|
+
/** {@link prefetchWith} over the one stack. */
|
|
4
|
+
export declare const prefetch: (options: PrefetchOptions) => Promise<import("./index.js").PrefetchResult>;
|
|
@@ -5,5 +5,7 @@
|
|
|
5
5
|
* `instanceof` holds whichever entry point a consumer imported it from.
|
|
6
6
|
*/
|
|
7
7
|
import { Y } from '../engine.js';
|
|
8
|
-
import { bindProviders } from './index.js';
|
|
8
|
+
import { bindProviders, prefetchWith } from './index.js';
|
|
9
9
|
export const providers = bindProviders(Y);
|
|
10
|
+
/** {@link prefetchWith} over the one stack. */
|
|
11
|
+
export const prefetch = (options) => prefetchWith(Y, providers, options);
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
export declare const UPDATES = "updates";
|
|
2
2
|
export declare const CUSTOM = "custom";
|
|
3
|
-
/**
|
|
3
|
+
/** A request's result, as a promise (its failure as an `Error`). */
|
|
4
|
+
export declare const rtop: <T>(request: IDBRequest<T>) => Promise<T>;
|
|
5
|
+
/** The stores `names` of one read-write transaction on `db`. */
|
|
6
|
+
export declare const storesOf: (db: IDBDatabase, names: string[]) => IDBObjectStore[];
|
|
7
|
+
/** The greatest key of `store` (`null` when it is empty). */
|
|
8
|
+
export declare const lastKey: (store: IDBObjectStore) => Promise<IDBValidKey | null>;
|
|
9
|
+
/** Open (creating when absent) a container with its two stores; it closes when another version opens. */
|
|
4
10
|
export declare const openContainer: (dbName: string) => Promise<IDBDatabase>;
|
|
5
11
|
/** A row is the update's bytes in a buffer of their own. */
|
|
6
12
|
export declare const encodeRow: (update: Uint8Array) => ArrayBuffer;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* makes it smaller). Update rows stay v1 `ArrayBuffer`s. A build from
|
|
12
|
-
* before the v2 snapshots reads such a row as no update at all (`decodeRow` throws),
|
|
13
|
-
* so it fails to load the store instead of misreading it.
|
|
14
|
-
*/
|
|
15
|
-
export type SnapshotRow = {
|
|
16
|
-
v2: ArrayBuffer;
|
|
17
|
-
};
|
|
18
|
-
export declare const snapshotRow: (updateV2: Uint8Array) => Promise<SnapshotRow>;
|
|
19
|
-
/** A stored row as the update to apply: `{ v2 }` for a snapshot row (inflated). */
|
|
20
|
-
export declare const readRow: (row: unknown) => Promise<Uint8Array | {
|
|
21
|
-
v2: Uint8Array;
|
|
22
|
-
}>;
|
|
13
|
+
/** A snapshot row: the document's state, gzip-compressed where that makes it smaller. */
|
|
14
|
+
export declare const snapshotRow: (update: Uint8Array) => Promise<ArrayBuffer>;
|
|
15
|
+
/** A stored row as the update to apply (a compressed snapshot inflated). */
|
|
16
|
+
export declare const readRow: (row: unknown) => Promise<Uint8Array>;
|
|
23
17
|
/**
|
|
24
18
|
* The one verify-or-stamp rule: a container carrying this generation's
|
|
25
19
|
* record passes; an EMPTY container without a record is stamped; anything
|
|
@@ -1,38 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The v14 IndexedDB container — one owner for the store names, the row
|
|
3
|
-
* codec (
|
|
4
|
-
*
|
|
3
|
+
* codec (every row an update in the engine's one encoding, a snapshot
|
|
4
|
+
* gzip-compressed where that makes it smaller), the open, the non-creating
|
|
5
|
+
* probe and the ONE verify-or-stamp rule. Rows are append-only for every
|
|
5
6
|
* writer (a provider's compaction appends its snapshot before deleting the
|
|
6
7
|
* rows it subsumes).
|
|
7
8
|
*/
|
|
8
|
-
import
|
|
9
|
-
import { GENERATION_KEY, GenerationMismatchError, isGenerationRecord, STORED_GENERATION_RECORD } from '../protocols/envelope.js';
|
|
9
|
+
import { GENERATION_KEY, GenerationMismatchError, GENERATION_RECORD, isGenerationRecord } from '../protocols/envelope.js';
|
|
10
10
|
import { gunzip, packed } from '../storage.js';
|
|
11
11
|
export const UPDATES = 'updates';
|
|
12
12
|
export const CUSTOM = 'custom';
|
|
13
|
-
/**
|
|
14
|
-
export const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
throw new TypeError('Stored Yjs update is not binary data');
|
|
13
|
+
/** A request's result, as a promise (its failure as an `Error`). */
|
|
14
|
+
export const rtop = (request) => new Promise((resolve, reject) => {
|
|
15
|
+
request.onerror = () => reject(new Error(String(request.error)));
|
|
16
|
+
request.onsuccess = () => resolve(request.result);
|
|
17
|
+
});
|
|
18
|
+
/** The stores `names` of one read-write transaction on `db`. */
|
|
19
|
+
export const storesOf = (db, names) => {
|
|
20
|
+
const transaction = db.transaction(names, 'readwrite');
|
|
21
|
+
return names.map((name) => transaction.objectStore(name));
|
|
23
22
|
};
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
/** The greatest key of `store` (`null` when it is empty). */
|
|
24
|
+
export const lastKey = (store) => rtop(store.openKeyCursor(null, 'prev')).then((cursor) => cursor?.key ?? null);
|
|
25
|
+
/** Open (creating when absent) a container with its two stores; it closes when another version opens. */
|
|
26
|
+
export const openContainer = (dbName) => new Promise((resolve, reject) => {
|
|
27
|
+
const request = indexedDB.open(dbName);
|
|
28
|
+
request.onupgradeneeded = () => {
|
|
29
|
+
request.result.createObjectStore(UPDATES, { autoIncrement: true });
|
|
30
|
+
request.result.createObjectStore(CUSTOM);
|
|
31
|
+
};
|
|
32
|
+
request.onerror = () => reject(request.error);
|
|
33
|
+
request.onsuccess = () => {
|
|
34
|
+
const db = request.result;
|
|
35
|
+
db.onversionchange = () => db.close();
|
|
36
|
+
resolve(db);
|
|
37
|
+
};
|
|
26
38
|
});
|
|
27
|
-
/** A
|
|
39
|
+
/** A row is the update's bytes in a buffer of their own. */
|
|
40
|
+
export const encodeRow = (update) => update.slice().buffer;
|
|
41
|
+
/** A snapshot row: the document's state, gzip-compressed where that makes it smaller. */
|
|
42
|
+
export const snapshotRow = async (update) => encodeRow(await packed(update));
|
|
43
|
+
/** A stored row as the update to apply (a compressed snapshot inflated). */
|
|
28
44
|
export const readRow = async (row) => {
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
throw new TypeError('Stored snapshot is not binary data');
|
|
33
|
-
return { v2: await gunzip(new Uint8Array(bytes)) };
|
|
34
|
-
}
|
|
35
|
-
return decodeRow(row);
|
|
45
|
+
if (!(row instanceof ArrayBuffer))
|
|
46
|
+
throw new TypeError('Stored Yjs update is not binary data');
|
|
47
|
+
return gunzip(new Uint8Array(row));
|
|
36
48
|
};
|
|
37
49
|
/**
|
|
38
50
|
* The one verify-or-stamp rule: a container carrying this generation's
|
|
@@ -41,9 +53,9 @@ export const readRow = async (row) => {
|
|
|
41
53
|
* {@link GenerationMismatchError} — nothing inside a row is inspected.
|
|
42
54
|
*/
|
|
43
55
|
export const verifyOrStamp = async (name, updates, custom) => {
|
|
44
|
-
const found = await
|
|
45
|
-
if (found === undefined && (await
|
|
46
|
-
await
|
|
56
|
+
const found = await rtop(custom.get(GENERATION_KEY));
|
|
57
|
+
if (found === undefined && (await rtop(updates.count())) === 0) {
|
|
58
|
+
await rtop(custom.put({ ...GENERATION_RECORD }, GENERATION_KEY));
|
|
47
59
|
}
|
|
48
60
|
else if (!isGenerationRecord(found)) {
|
|
49
61
|
throw new GenerationMismatchError(name, found);
|
|
@@ -127,9 +127,6 @@ export type LastUpdatedOptions = WebsocketTarget & {
|
|
|
127
127
|
};
|
|
128
128
|
export type ProviderStack = ReturnType<typeof bindProviders>;
|
|
129
129
|
export declare const bindProviders: (Y: EngineApi) => {
|
|
130
|
-
prefetch: (options: PrefetchOptions) => Promise<PrefetchResult>;
|
|
131
|
-
lastUpdated: (options: LastUpdatedOptions) => Promise<number | null>;
|
|
132
|
-
documentSnapshot: (options: LastUpdatedOptions) => Promise<JSONDoc | null>;
|
|
133
130
|
IndexeddbPersistence: {
|
|
134
131
|
new (name: string, doc: YDoc, options?: import("./indexeddb.js").IndexeddbPersistenceOptions): {
|
|
135
132
|
doc: YDoc;
|
|
@@ -153,7 +150,7 @@ export declare const bindProviders: (Y: EngineApi) => {
|
|
|
153
150
|
bcconnected: boolean;
|
|
154
151
|
disableBc: boolean;
|
|
155
152
|
_ownsAwareness: boolean;
|
|
156
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
153
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
157
154
|
_awarenessUpdateHandler: (updates: {
|
|
158
155
|
added: number[];
|
|
159
156
|
updated: number[];
|
|
@@ -225,7 +222,7 @@ export declare const bindProviders: (Y: EngineApi) => {
|
|
|
225
222
|
bcChannel: string;
|
|
226
223
|
bcconnected: boolean;
|
|
227
224
|
disableBc: boolean;
|
|
228
|
-
_bcSubscriber: (data: ArrayBuffer, origin: unknown) => void;
|
|
225
|
+
_bcSubscriber: (data: ArrayBuffer | Uint8Array, origin: unknown) => void;
|
|
229
226
|
_fromTab: {};
|
|
230
227
|
wsUnsuccessfulReconnects: number;
|
|
231
228
|
wsLastMessageReceived: number;
|
|
@@ -292,9 +289,40 @@ export declare const bindProviders: (Y: EngineApi) => {
|
|
|
292
289
|
_dbsize: number;
|
|
293
290
|
_destroyed: boolean;
|
|
294
291
|
}, forceStore?: boolean) => Promise<undefined>;
|
|
295
|
-
clearDocument: (name: string) => Promise<
|
|
292
|
+
clearDocument: (name: string) => Promise<void>;
|
|
296
293
|
PREFERRED_TRIM_SIZE: number;
|
|
297
294
|
createIndexeddbSync: (name: string) => EdytorSync;
|
|
298
295
|
createWebsocketSync: (options: WebsocketSyncOptions) => WebsocketSync;
|
|
299
296
|
};
|
|
300
297
|
export type { IndexeddbProvider };
|
|
298
|
+
/**
|
|
299
|
+
* `[serverUrl (no trailing slash), room]` of a target, the room id checked.
|
|
300
|
+
* The target is `{ server, room }`; the names before them are refused, in
|
|
301
|
+
* a message that names the `caller` it was passed to.
|
|
302
|
+
*/
|
|
303
|
+
export declare const targetOf: (caller: string, options: WebsocketTarget) => [string, string];
|
|
304
|
+
/**
|
|
305
|
+
* Keep a document fresh without opening it: load its local store
|
|
306
|
+
* (the one `createWebsocketSync` keeps, `edytor:<server>/<room>` unless
|
|
307
|
+
* `persistName` names another), dial the room once, take what it lacks
|
|
308
|
+
* and hand it what the store holds that the room lacks, wait until the
|
|
309
|
+
* room stored it, then close. Resolves with whether the room sent
|
|
310
|
+
* anything new; rejects with the room's refusal (`SyncRefusedError`),
|
|
311
|
+
* after `timeout`, or where there is no IndexedDB. Over the provider
|
|
312
|
+
* classes of `stack` (bound to `Y`).
|
|
313
|
+
*/
|
|
314
|
+
export declare const prefetchWith: (Y: EngineApi, stack: ProviderStack, options: PrefetchOptions) => Promise<PrefetchResult>;
|
|
315
|
+
/**
|
|
316
|
+
* When the room last stored a change (ms since the epoch), or `null`:
|
|
317
|
+
* `?lastUpdated`, answered without opening the document. Compare it with
|
|
318
|
+
* when a document was last fetched to decide whether to `prefetch` it.
|
|
319
|
+
* Throws on an HTTP error (`403` refused, `401` expired).
|
|
320
|
+
*/
|
|
321
|
+
export declare const lastUpdated: (options: LastUpdatedOptions) => Promise<number | null>;
|
|
322
|
+
/**
|
|
323
|
+
* The room's document as JSON, or `null` when it stores nothing yet:
|
|
324
|
+
* `?snapshot`, answered from the room's live document. Show it while a
|
|
325
|
+
* view's own copy hydrates: `<Edytor snapshot>`. Throws on an HTTP error
|
|
326
|
+
* (`403` refused, `401` expired).
|
|
327
|
+
*/
|
|
328
|
+
export declare const documentSnapshot: (options: LastUpdatedOptions) => Promise<JSONDoc | null>;
|
|
@@ -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
|
+
};
|