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
|
@@ -52,11 +52,9 @@
|
|
|
52
52
|
* left out of the ack), the rest applied. Compaction reclaims the
|
|
53
53
|
* waiting deletes of client ids no user registered and no socket holds;
|
|
54
54
|
* `dropWaitingDeletes()` every one.
|
|
55
|
-
* - storage format:
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* pending records stay v1. A container without `storage` (0.1.0-next.22)
|
|
59
|
-
* is all v1, and its next compaction rewrites it.
|
|
55
|
+
* - storage format: every record holds an update in the engine's one
|
|
56
|
+
* encoding; a snapshot is compressed in place after it is stored
|
|
57
|
+
* (`#compressLater`) and inflated at start (`inflate`).
|
|
60
58
|
* - a Step2 serves the STORED state: the engine's pending structs (waiting
|
|
61
59
|
* for a dependency, never stored) are not served.
|
|
62
60
|
* - a frame larger than `maxFrameBytes` (32 MiB) goes out as chunks the
|
|
@@ -128,6 +126,8 @@ export declare const DEFAULT_SAVE_AFTER = 2000;
|
|
|
128
126
|
* about 100 MB at worst. Raise it for documents of long text.
|
|
129
127
|
*/
|
|
130
128
|
export declare const DEFAULT_MAX_DOCUMENT_BYTES: number;
|
|
129
|
+
/** The share of the document quota past which the room logs its size, by default. */
|
|
130
|
+
export declare const DEFAULT_DOCUMENT_WARNING = 0.8;
|
|
131
131
|
/**
|
|
132
132
|
* The largest frame a socket may send, reassembled from chunks: room for a
|
|
133
133
|
* whole document at the default quota (a client seeding an empty room).
|
|
@@ -211,6 +211,8 @@ export type DocumentRoomEnv = {
|
|
|
211
211
|
EDYTOR_COMPACT_AFTER?: string | number;
|
|
212
212
|
EDYTOR_SAVE_AFTER?: string | number;
|
|
213
213
|
EDYTOR_MAX_DOCUMENT_BYTES?: string | number;
|
|
214
|
+
/** The share of the document quota past which the room logs its size (`documentWarning`). */
|
|
215
|
+
EDYTOR_DOCUMENT_WARNING?: string | number;
|
|
214
216
|
EDYTOR_MAX_INBOUND_FRAME_BYTES?: string | number;
|
|
215
217
|
EDYTOR_MAX_BUFFERED_BYTES?: string | number;
|
|
216
218
|
EDYTOR_MAX_UPDATES_PER_SECOND?: string | number;
|
|
@@ -290,6 +292,8 @@ export type Timing = {
|
|
|
290
292
|
export type RoomMetrics = {
|
|
291
293
|
/** The document's size as the document quota measures it: its records, uncompressed. */
|
|
292
294
|
documentBytes: number;
|
|
295
|
+
/** The document quota (`maxDocumentBytes`): writes past it are refused (`4413`). */
|
|
296
|
+
documentLimit: number;
|
|
293
297
|
/** What its rows take in storage (a snapshot compressed). */
|
|
294
298
|
storedBytes: number;
|
|
295
299
|
/** Logical records stored (the generation record included), and their rows. */
|
|
@@ -366,6 +370,11 @@ export type RoomLogEntry = {
|
|
|
366
370
|
edytor: 'quota';
|
|
367
371
|
user: string;
|
|
368
372
|
quota: string;
|
|
373
|
+
} | {
|
|
374
|
+
edytor: 'size';
|
|
375
|
+
bytes: number;
|
|
376
|
+
limit: number;
|
|
377
|
+
share: number;
|
|
369
378
|
} | {
|
|
370
379
|
edytor: 'denied';
|
|
371
380
|
user: string;
|
|
@@ -378,12 +387,6 @@ export type RoomLogEntry = {
|
|
|
378
387
|
edytor: 'fault';
|
|
379
388
|
reason: 'storage' | 'internal';
|
|
380
389
|
detail: string;
|
|
381
|
-
} | {
|
|
382
|
-
edytor: 'convert';
|
|
383
|
-
from: number;
|
|
384
|
-
to: number;
|
|
385
|
-
blocks: number;
|
|
386
|
-
bytes: number;
|
|
387
390
|
} | {
|
|
388
391
|
edytor: 'move';
|
|
389
392
|
moveId: string;
|
|
@@ -400,12 +403,11 @@ export type RoomLogEntry = {
|
|
|
400
403
|
};
|
|
401
404
|
/** `pending`: deletes of items the room does not hold yet (they wait for them). */
|
|
402
405
|
type RowKind = 'generation' | 'update' | 'snapshot' | 'pending';
|
|
403
|
-
/** A stored record, reassembled: its kind, record number
|
|
406
|
+
/** A stored record, reassembled: its kind, record number and bytes. */
|
|
404
407
|
export type StoredRecord = {
|
|
405
408
|
kind: RowKind;
|
|
406
409
|
record: number;
|
|
407
410
|
bytes: Uint8Array<ArrayBuffer>;
|
|
408
|
-
v2: boolean;
|
|
409
411
|
};
|
|
410
412
|
/** A block as `validate` reads it, before or after a frame. */
|
|
411
413
|
export type ValidatedBlock = {
|
|
@@ -495,6 +497,12 @@ export type AttachRoomOptions = {
|
|
|
495
497
|
tablePrefix?: string;
|
|
496
498
|
/** Largest document, in stored bytes (default {@link DEFAULT_MAX_DOCUMENT_BYTES}). */
|
|
497
499
|
maxDocumentBytes?: number;
|
|
500
|
+
/**
|
|
501
|
+
* The share of `maxDocumentBytes` past which the room logs the
|
|
502
|
+
* document's size (`size`, once per crossing), above 0 and at most 1
|
|
503
|
+
* (default {@link DEFAULT_DOCUMENT_WARNING}, 0.8).
|
|
504
|
+
*/
|
|
505
|
+
documentWarning?: number;
|
|
498
506
|
/** Largest frame a socket may send, reassembled (default {@link DEFAULT_MAX_INBOUND_FRAME_BYTES}). */
|
|
499
507
|
maxInboundFrameBytes?: number;
|
|
500
508
|
/**
|
|
@@ -588,6 +596,7 @@ export declare class AttachedDocument {
|
|
|
588
596
|
readonly compactAfter: number;
|
|
589
597
|
readonly saveAfter: number;
|
|
590
598
|
readonly maxDocumentBytes: number;
|
|
599
|
+
readonly documentWarning: number;
|
|
591
600
|
readonly maxInboundFrameBytes: number;
|
|
592
601
|
readonly maxBufferedBytes: number;
|
|
593
602
|
readonly maxUpdatesPerSecond: number;
|
|
@@ -608,10 +617,6 @@ export declare class AttachedDocument {
|
|
|
608
617
|
} | {
|
|
609
618
|
kind: 'restored';
|
|
610
619
|
records: number;
|
|
611
|
-
} | {
|
|
612
|
-
kind: 'converted';
|
|
613
|
-
from: number;
|
|
614
|
-
records: number;
|
|
615
620
|
};
|
|
616
621
|
/** The room's parts and what they share (`room/context.ts`). */
|
|
617
622
|
private readonly room;
|
|
@@ -52,11 +52,9 @@
|
|
|
52
52
|
* left out of the ack), the rest applied. Compaction reclaims the
|
|
53
53
|
* waiting deletes of client ids no user registered and no socket holds;
|
|
54
54
|
* `dropWaitingDeletes()` every one.
|
|
55
|
-
* - storage format:
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
* pending records stay v1. A container without `storage` (0.1.0-next.22)
|
|
59
|
-
* is all v1, and its next compaction rewrites it.
|
|
55
|
+
* - storage format: every record holds an update in the engine's one
|
|
56
|
+
* encoding; a snapshot is compressed in place after it is stored
|
|
57
|
+
* (`#compressLater`) and inflated at start (`inflate`).
|
|
60
58
|
* - a Step2 serves the STORED state: the engine's pending structs (waiting
|
|
61
59
|
* for a dependency, never stored) are not served.
|
|
62
60
|
* - a frame larger than `maxFrameBytes` (32 MiB) goes out as chunks the
|
|
@@ -137,6 +135,8 @@ export const DEFAULT_SAVE_AFTER = 2000;
|
|
|
137
135
|
* about 100 MB at worst. Raise it for documents of long text.
|
|
138
136
|
*/
|
|
139
137
|
export const DEFAULT_MAX_DOCUMENT_BYTES = 2 * 1024 * 1024;
|
|
138
|
+
/** The share of the document quota past which the room logs its size, by default. */
|
|
139
|
+
export const DEFAULT_DOCUMENT_WARNING = 0.8;
|
|
140
140
|
/**
|
|
141
141
|
* The largest frame a socket may send, reassembled from chunks: room for a
|
|
142
142
|
* whole document at the default quota (a client seeding an empty room).
|
|
@@ -200,6 +200,7 @@ export class AttachedDocument {
|
|
|
200
200
|
compactAfter;
|
|
201
201
|
saveAfter;
|
|
202
202
|
maxDocumentBytes;
|
|
203
|
+
documentWarning;
|
|
203
204
|
maxInboundFrameBytes;
|
|
204
205
|
maxBufferedBytes;
|
|
205
206
|
maxUpdatesPerSecond;
|
|
@@ -225,6 +226,8 @@ export class AttachedDocument {
|
|
|
225
226
|
this.compactAfter = knob(options.compactAfter, DEFAULT_COMPACT_AFTER, 1e9);
|
|
226
227
|
this.saveAfter = knob(options.saveAfter, DEFAULT_SAVE_AFTER, 1e9);
|
|
227
228
|
this.maxDocumentBytes = knob(options.maxDocumentBytes, DEFAULT_MAX_DOCUMENT_BYTES, QUOTA_CEILING);
|
|
229
|
+
const warning = Number(options.documentWarning);
|
|
230
|
+
this.documentWarning = warning > 0 && warning <= 1 ? warning : DEFAULT_DOCUMENT_WARNING;
|
|
228
231
|
this.maxInboundFrameBytes = knob(options.maxInboundFrameBytes, DEFAULT_MAX_INBOUND_FRAME_BYTES, QUOTA_CEILING);
|
|
229
232
|
this.maxBufferedBytes = Math.max(this.maxInboundFrameBytes, knob(options.maxBufferedBytes, 2 * this.maxInboundFrameBytes, QUOTA_CEILING));
|
|
230
233
|
this.maxUpdatesPerSecond = knob(options.maxUpdatesPerSecond, DEFAULT_MAX_UPDATES_PER_SECOND, QUOTA_CEILING);
|
|
@@ -492,6 +495,7 @@ export class AttachedDocument {
|
|
|
492
495
|
const { counters } = room;
|
|
493
496
|
return {
|
|
494
497
|
documentBytes: room.storage.documentBytes,
|
|
498
|
+
documentLimit: room.limits.maxDocumentBytes,
|
|
495
499
|
storedBytes: stored?.bytes ?? 0,
|
|
496
500
|
records: stored?.records ?? 0,
|
|
497
501
|
rows: stored?.rows ?? 0,
|
|
@@ -649,6 +653,7 @@ export class DocumentRoom extends DurableObject {
|
|
|
649
653
|
compactAfter: Number(knobs.EDYTOR_COMPACT_AFTER),
|
|
650
654
|
saveAfter: Number(knobs.EDYTOR_SAVE_AFTER),
|
|
651
655
|
maxDocumentBytes: Number(knobs.EDYTOR_MAX_DOCUMENT_BYTES),
|
|
656
|
+
documentWarning: Number(knobs.EDYTOR_DOCUMENT_WARNING),
|
|
652
657
|
maxInboundFrameBytes: Number(knobs.EDYTOR_MAX_INBOUND_FRAME_BYTES),
|
|
653
658
|
maxBufferedBytes: Number(knobs.EDYTOR_MAX_BUFFERED_BYTES),
|
|
654
659
|
maxUpdatesPerSecond: Number(knobs.EDYTOR_MAX_UPDATES_PER_SECOND),
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* `cloudflare:workers`); built on the Worker-safe CRDT entry. Documented in
|
|
5
5
|
* the site's `server/` section (room, authorization, extending, protocol).
|
|
6
6
|
*/
|
|
7
|
-
export { DocumentRoom, AttachedDocument, attachRoom, SOCKET_TAG, closedSocket, type AttachRoomOptions, type CommentOptions, DEFAULT_COMPACT_AFTER, DEFAULT_MAX_ROW_BYTES, DEFAULT_SAVE_AFTER, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_MAX_INBOUND_FRAME_BYTES, DEFAULT_MAX_BUFFERED_BYTES, DEFAULT_MAX_UPDATES_PER_SECOND, DEFAULT_MAX_PRESENCE_BYTES, DEFAULT_MAX_PRESENCE_PER_SECOND, DEFAULT_MAX_PRESENCE_FANOUT, DEFAULT_MAX_COMMENT_BYTES, DEFAULT_MAX_COMMENT_REQUESTS_PER_SECOND, MAX_REFUSALS, MAX_WAITING_DELETES, ROOM_ORIGIN, RESTORE_ORIGIN, PURGE_ORIGIN, IDENTITY_HEADERS, PROBE_HEADER, noTimers, type Attachment, type DocumentRoomEnv, type LoadedDocument, type Refusal, type ReplicaOwner, type SavedDocument, type SocketIdentity, type StoredRecord, type FrameValidation, type ValidatedBlock, type RoomMetrics, type RoomLogEntry, type RestoreResult, type Timing } from './DocumentRoom.js';
|
|
7
|
+
export { DocumentRoom, AttachedDocument, attachRoom, SOCKET_TAG, closedSocket, type AttachRoomOptions, type CommentOptions, DEFAULT_COMPACT_AFTER, DEFAULT_MAX_ROW_BYTES, DEFAULT_SAVE_AFTER, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_DOCUMENT_WARNING, DEFAULT_MAX_INBOUND_FRAME_BYTES, DEFAULT_MAX_BUFFERED_BYTES, DEFAULT_MAX_UPDATES_PER_SECOND, DEFAULT_MAX_PRESENCE_BYTES, DEFAULT_MAX_PRESENCE_PER_SECOND, DEFAULT_MAX_PRESENCE_FANOUT, DEFAULT_MAX_COMMENT_BYTES, DEFAULT_MAX_COMMENT_REQUESTS_PER_SECOND, MAX_REFUSALS, MAX_WAITING_DELETES, ROOM_ORIGIN, RESTORE_ORIGIN, PURGE_ORIGIN, IDENTITY_HEADERS, PROBE_HEADER, noTimers, type Attachment, type DocumentRoomEnv, type LoadedDocument, type Refusal, type ReplicaOwner, type SavedDocument, type SocketIdentity, type StoredRecord, type FrameValidation, type ValidatedBlock, type RoomMetrics, type RoomLogEntry, type RestoreResult, type Timing } from './DocumentRoom.js';
|
|
8
8
|
export { DEFAULT_RETENTION_DAYS, HISTORY_MAX_VALUE_BYTES, R2_HISTORY_MAX_VALUE_BYTES, ROOM_HISTORY_MAX_BYTES, ROOM_HISTORY_MAX_VALUE_BYTES, kvHistory, r2History, roomHistory, type HistoryEntry, type HistoryMetadata, type HistoryOptions, type HistoryRoomStorage, type HistoryStore, type HistoryStoreFactory, type HistoryStoreRecord, type KVLike, type R2BucketLike } from './history.js';
|
|
9
9
|
export { type PurgeReport } from '../crdt/purge.js';
|
|
10
10
|
export { COMMENT_ROW_BYTES, COMMENT_STATUS, MAX_COMMENT_LENGTH, MAX_COMMENTS_PER_THREAD, MAX_THREADS, commentAnchors, commentBytes, decideComment, type ThreadComment, type CommentActor, type CommentChange, type CommentOutcome, type CommentRefusal, type CommentRequest, type CommentRun, type CommentSnapshot, type CommentThread } from '../crdt/protocols/comments.js';
|
package/dist/cloudflare/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* `cloudflare:workers`); built on the Worker-safe CRDT entry. Documented in
|
|
5
5
|
* the site's `server/` section (room, authorization, extending, protocol).
|
|
6
6
|
*/
|
|
7
|
-
export { DocumentRoom, AttachedDocument, attachRoom, SOCKET_TAG, closedSocket, DEFAULT_COMPACT_AFTER, DEFAULT_MAX_ROW_BYTES, DEFAULT_SAVE_AFTER, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_MAX_INBOUND_FRAME_BYTES, DEFAULT_MAX_BUFFERED_BYTES, DEFAULT_MAX_UPDATES_PER_SECOND, DEFAULT_MAX_PRESENCE_BYTES, DEFAULT_MAX_PRESENCE_PER_SECOND, DEFAULT_MAX_PRESENCE_FANOUT, DEFAULT_MAX_COMMENT_BYTES, DEFAULT_MAX_COMMENT_REQUESTS_PER_SECOND, MAX_REFUSALS, MAX_WAITING_DELETES, ROOM_ORIGIN, RESTORE_ORIGIN, PURGE_ORIGIN, IDENTITY_HEADERS, PROBE_HEADER, noTimers } from './DocumentRoom.js';
|
|
7
|
+
export { DocumentRoom, AttachedDocument, attachRoom, SOCKET_TAG, closedSocket, DEFAULT_COMPACT_AFTER, DEFAULT_MAX_ROW_BYTES, DEFAULT_SAVE_AFTER, DEFAULT_MAX_DOCUMENT_BYTES, DEFAULT_DOCUMENT_WARNING, DEFAULT_MAX_INBOUND_FRAME_BYTES, DEFAULT_MAX_BUFFERED_BYTES, DEFAULT_MAX_UPDATES_PER_SECOND, DEFAULT_MAX_PRESENCE_BYTES, DEFAULT_MAX_PRESENCE_PER_SECOND, DEFAULT_MAX_PRESENCE_FANOUT, DEFAULT_MAX_COMMENT_BYTES, DEFAULT_MAX_COMMENT_REQUESTS_PER_SECOND, MAX_REFUSALS, MAX_WAITING_DELETES, ROOM_ORIGIN, RESTORE_ORIGIN, PURGE_ORIGIN, IDENTITY_HEADERS, PROBE_HEADER, noTimers } from './DocumentRoom.js';
|
|
8
8
|
export { DEFAULT_RETENTION_DAYS, HISTORY_MAX_VALUE_BYTES, R2_HISTORY_MAX_VALUE_BYTES, ROOM_HISTORY_MAX_BYTES, ROOM_HISTORY_MAX_VALUE_BYTES, kvHistory, r2History, roomHistory } from './history.js';
|
|
9
9
|
export {} from '../crdt/purge.js';
|
|
10
10
|
export { COMMENT_ROW_BYTES, COMMENT_STATUS, MAX_COMMENT_LENGTH, MAX_COMMENTS_PER_THREAD, MAX_THREADS, commentAnchors, commentBytes, decideComment } from '../crdt/protocols/comments.js';
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
* `moveBlocksBetweenRooms(namespace, …)` runs steps 1–3 from the host Worker.
|
|
30
30
|
*/
|
|
31
31
|
import type { JSONBlock } from '../utils/json.js';
|
|
32
|
+
import { type Unit } from '../crdt/restore.js';
|
|
32
33
|
/** Where imported blocks land in the destination: under `parent` at `index`. */
|
|
33
34
|
export type MoveDestination = {
|
|
34
35
|
parent: string | null;
|
|
@@ -105,23 +106,6 @@ export type MoveNamespace = {
|
|
|
105
106
|
};
|
|
106
107
|
/** The default grace period: late edits are forwarded this long after the commit. */
|
|
107
108
|
export declare const DEFAULT_MOVE_GRACE_DAYS = 30;
|
|
108
|
-
/** One display unit: a character (a code point) with its marks, or an inline atom. */
|
|
109
|
-
type Unit = {
|
|
110
|
-
key: string;
|
|
111
|
-
text?: string;
|
|
112
|
-
marks?: Record<string, unknown>;
|
|
113
|
-
atom?: JSONBlock;
|
|
114
|
-
};
|
|
115
|
-
/** `content` one unit each, keyed for comparison. */
|
|
116
|
-
export declare const unitsOf: (content?: JSONBlock["content"]) => Unit[];
|
|
117
|
-
/** Units back to JSON content (adjacent text of equal marks joined). */
|
|
118
|
-
export declare const contentOf: (units: readonly Unit[]) => NonNullable<JSONBlock["content"]>;
|
|
119
|
-
/** The one changed stretch from `x` to `y`: `x[p, e)` became `mid`. */
|
|
120
|
-
export declare const hunk: (x: readonly Unit[], y: readonly Unit[]) => {
|
|
121
|
-
p: number;
|
|
122
|
-
e: number;
|
|
123
|
-
mid: Unit[];
|
|
124
|
-
};
|
|
125
109
|
/**
|
|
126
110
|
* Merge the source's change (`base` → `src`) into the destination's
|
|
127
111
|
* (`base` → `dst`), each read as one stretch: disjoint stretches both
|
|
@@ -156,4 +140,3 @@ export declare const moveBlocksBetweenRooms: (namespace: MoveNamespace, move: {
|
|
|
156
140
|
* cannot reach the destination itself. Returns how many batches went.
|
|
157
141
|
*/
|
|
158
142
|
export declare const forwardLateEdits: (namespace: MoveNamespace, from: string) => Promise<number>;
|
|
159
|
-
export {};
|
package/dist/cloudflare/move.js
CHANGED
|
@@ -1,54 +1,8 @@
|
|
|
1
1
|
import { canonKey } from '../crdt/text/model.js';
|
|
2
|
+
import { hunk } from '../crdt/restore.js';
|
|
2
3
|
/** The default grace period: late edits are forwarded this long after the commit. */
|
|
3
4
|
export const DEFAULT_MOVE_GRACE_DAYS = 30;
|
|
4
|
-
|
|
5
|
-
export const unitsOf = (content = []) => {
|
|
6
|
-
const out = [];
|
|
7
|
-
for (const item of content) {
|
|
8
|
-
if ('text' in item && typeof item.text === 'string') {
|
|
9
|
-
const marks = (item.marks ?? undefined);
|
|
10
|
-
const tag = canonKey(marks ?? {});
|
|
11
|
-
for (const ch of item.text)
|
|
12
|
-
out.push({ key: `${ch}|${tag}`, text: ch, marks });
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
const atom = item;
|
|
16
|
-
out.push({
|
|
17
|
-
key: `@${atom.id ?? ''}|${atom.type}|${canonKey(atom.data ?? {})}`,
|
|
18
|
-
atom: atom
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return out;
|
|
23
|
-
};
|
|
24
|
-
/** Units back to JSON content (adjacent text of equal marks joined). */
|
|
25
|
-
export const contentOf = (units) => {
|
|
26
|
-
const out = [];
|
|
27
|
-
for (const u of units) {
|
|
28
|
-
if (u.atom !== undefined) {
|
|
29
|
-
out.push(u.atom);
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const last = out[out.length - 1];
|
|
33
|
-
if (last?.text !== undefined && canonKey(last.marks ?? {}) === canonKey(u.marks ?? {}))
|
|
34
|
-
last.text += u.text;
|
|
35
|
-
else
|
|
36
|
-
out.push({ text: u.text, ...(u.marks === undefined ? {} : { marks: u.marks }) });
|
|
37
|
-
}
|
|
38
|
-
return out;
|
|
39
|
-
};
|
|
40
|
-
/** The one changed stretch from `x` to `y`: `x[p, e)` became `mid`. */
|
|
41
|
-
export const hunk = (x, y) => {
|
|
42
|
-
let p = 0;
|
|
43
|
-
while (p < x.length && p < y.length && x[p].key === y[p].key)
|
|
44
|
-
p++;
|
|
45
|
-
let q = 0;
|
|
46
|
-
while (q < x.length - p &&
|
|
47
|
-
q < y.length - p &&
|
|
48
|
-
x[x.length - 1 - q].key === y[y.length - 1 - q].key)
|
|
49
|
-
q++;
|
|
50
|
-
return { p, e: x.length - q, mid: y.slice(p, y.length - q) };
|
|
51
|
-
};
|
|
5
|
+
// ── units and the three-way merge ─────────────────────────────────────
|
|
52
6
|
/**
|
|
53
7
|
* Merge the source's change (`base` → `src`) into the destination's
|
|
54
8
|
* (`base` → `dst`), each read as one stretch: disjoint stretches both
|
|
@@ -18,14 +18,8 @@ export declare const allowance: <K>(allowances: {
|
|
|
18
18
|
set(key: K, bucket: Bucket): unknown;
|
|
19
19
|
}, key: K, perSecond: number, now?: number) => boolean;
|
|
20
20
|
export declare class Admission {
|
|
21
|
+
#private;
|
|
21
22
|
private readonly room;
|
|
22
|
-
/** Each socket's update allowance. */
|
|
23
|
-
private readonly allowances;
|
|
24
|
-
/**
|
|
25
|
-
* Each socket's chunked frame in flight, released when it ends or its
|
|
26
|
-
* socket closes (memory: a wake loses it, and the socket is faulted).
|
|
27
|
-
*/
|
|
28
|
-
private readonly chunkReaders;
|
|
29
23
|
constructor(room: RoomContext);
|
|
30
24
|
/** Release `ws`'s chunk sequence in flight (it closed, or was closed). */
|
|
31
25
|
forget(ws: WebSocket): void;
|
|
@@ -33,17 +27,6 @@ export declare class Admission {
|
|
|
33
27
|
message(ws: WebSocket, message: string | ArrayBuffer): void;
|
|
34
28
|
/** One frame: whole as it came, or reassembled from its chunks. */
|
|
35
29
|
private onFrame;
|
|
36
|
-
/**
|
|
37
|
-
* One chunk of a frame too large to send whole (a provider's
|
|
38
|
-
* reconnect diff): buffered per socket into one buffer of the
|
|
39
|
-
* sequence's announced size, the whole frame handled once its sequence
|
|
40
|
-
* ends (`net.chunk.inbound`). A sequence announcing more than
|
|
41
|
-
* `maxInboundFrameBytes` is a frame quota refusal, before anything is
|
|
42
|
-
* buffered; its start is admitted by {@link admitChunks}. A part with no
|
|
43
|
-
* sequence started — the room woke between two chunks and lost the
|
|
44
|
-
* buffer — faults the socket (1011): its provider redials and resends.
|
|
45
|
-
*/
|
|
46
|
-
private onChunk;
|
|
47
30
|
/**
|
|
48
31
|
* Admit a chunk sequence's start (`net.chunk.inbound`), before its
|
|
49
32
|
* buffer is allocated: a read-only socket's is skipped, never buffered
|
|
@@ -57,57 +40,15 @@ export declare class Admission {
|
|
|
57
40
|
sequences: number;
|
|
58
41
|
bytes: number;
|
|
59
42
|
};
|
|
60
|
-
/**
|
|
61
|
-
* A quota refused the socket's frame: it is not applied, and the
|
|
62
|
-
* socket is closed `4413` (`quota: <name>`), a refusal its provider
|
|
63
|
-
* reports (`onSyncRefused`) and does not redial. Never a dropped frame
|
|
64
|
-
* on a live socket: the sender's later frames would build on it and
|
|
65
|
-
* wait in the room's memory for good, unstored and unacknowledged; and
|
|
66
|
-
* a redial would resend it and meet the same quota.
|
|
67
|
-
*/
|
|
68
|
-
private overQuota;
|
|
69
43
|
/**
|
|
70
44
|
* The update rate quota: a token bucket per socket, refilled at
|
|
71
45
|
* `maxUpdatesPerSecond` up to ten seconds' worth. `false`: over it.
|
|
72
46
|
* Presence messages draw from a bucket of their own (`RoomPresence`).
|
|
73
47
|
*/
|
|
74
48
|
private allow;
|
|
75
|
-
/**
|
|
76
|
-
* The document quota: would `incoming` bytes take the document
|
|
77
|
-
* past `maxDocumentBytes`? Its measure is what its records hold and what
|
|
78
|
-
* the engine holds waiting; update records count until compaction
|
|
79
|
-
* collapses them, so it compacts first when they would.
|
|
80
|
-
*/
|
|
81
|
-
private overDocument;
|
|
82
49
|
private onSync;
|
|
83
50
|
/** A client's Step2 or Update: admitted, applied, stored, relayed, validated, acknowledged. */
|
|
84
51
|
private onUpdate;
|
|
85
|
-
/**
|
|
86
|
-
* A delete of items the room does not hold (a relayer's delete of an
|
|
87
|
-
* author's edit a restore lost) waits in the engine for them: it is
|
|
88
|
-
* stored as it arrives, so it survives eviction and compaction and
|
|
89
|
-
* applies when the author's edit returns. Except the entries the frame's
|
|
90
|
-
* own still-waiting rewrites replace (`stay`): those deletes wait with
|
|
91
|
-
* the rewrites in memory, as the rewrites may never integrate. A frame
|
|
92
|
-
* that released a pending forged stamp discarded every waiting delete
|
|
93
|
-
* (`applyRemote`): the stored ones go too. The deletes the frame applied
|
|
94
|
-
* from the waiting ones go back to its sender, whom the relay of the
|
|
95
|
-
* update skips; they are returned. The cap holds here too: deletes of
|
|
96
|
-
* the frame's own structs that wait for an origin (stored, or kept in
|
|
97
|
-
* memory with its rewrites) pass the check before applying; when the
|
|
98
|
-
* frame's new waiting deletes take the room past
|
|
99
|
-
* {@link MAX_WAITING_DELETES}, they are all dropped (refusal `waiting`,
|
|
100
|
-
* the sender's), unstored and unacknowledged. A replaced entry is
|
|
101
|
-
* deleted by its rewrite anyway, should that integrate.
|
|
102
|
-
*/
|
|
103
|
-
private settleDeletes;
|
|
104
|
-
/**
|
|
105
|
-
* Of `deletes`, those the room stored — applied, or waiting in a
|
|
106
|
-
* `pending` record — and so acknowledges by id: never one it dropped
|
|
107
|
-
* (the waiting cap, a stripped rewrite's replaced entry) or keeps
|
|
108
|
-
* waiting in memory only.
|
|
109
|
-
*/
|
|
110
|
-
private storedDeletes;
|
|
111
52
|
/**
|
|
112
53
|
* A frame that would write during a storage outage (`room.storage.outage`):
|
|
113
54
|
* closed 1011 before it is applied, the live doc kept as stored. Its
|
|
@@ -59,18 +59,18 @@ class ChunksRefused extends Error {
|
|
|
59
59
|
export class Admission {
|
|
60
60
|
room;
|
|
61
61
|
/** Each socket's update allowance. */
|
|
62
|
-
allowances = new WeakMap();
|
|
62
|
+
#allowances = new WeakMap();
|
|
63
63
|
/**
|
|
64
64
|
* Each socket's chunked frame in flight, released when it ends or its
|
|
65
65
|
* socket closes (memory: a wake loses it, and the socket is faulted).
|
|
66
66
|
*/
|
|
67
|
-
chunkReaders = new Map();
|
|
67
|
+
#chunkReaders = new Map();
|
|
68
68
|
constructor(room) {
|
|
69
69
|
this.room = room;
|
|
70
70
|
}
|
|
71
71
|
/** Release `ws`'s chunk sequence in flight (it closed, or was closed). */
|
|
72
72
|
forget(ws) {
|
|
73
|
-
this
|
|
73
|
+
this.#chunkReaders.delete(ws);
|
|
74
74
|
}
|
|
75
75
|
/** One message of a document socket (`AttachedDocument.webSocketMessage`). */
|
|
76
76
|
message(ws, message) {
|
|
@@ -108,7 +108,7 @@ export class Admission {
|
|
|
108
108
|
const limit = room.limits.maxInboundFrameBytes;
|
|
109
109
|
// The frame quota: never decoded past it.
|
|
110
110
|
if (bytes.length > limit) {
|
|
111
|
-
return this
|
|
111
|
+
return this.#overQuota(ws, attachment.user, 'frame', { bytes: bytes.length, limit });
|
|
112
112
|
}
|
|
113
113
|
const decoder = E.createDecoder(bytes);
|
|
114
114
|
// 1 · Admission: the generation word, before anything is decoded.
|
|
@@ -118,7 +118,7 @@ export class Admission {
|
|
|
118
118
|
try {
|
|
119
119
|
const type = decode(() => E.readVarUint(decoder));
|
|
120
120
|
if (type === E.messageChunk)
|
|
121
|
-
return this
|
|
121
|
+
return this.#onChunk(ws, attachment, doc, decoder);
|
|
122
122
|
if (type === E.messageSync)
|
|
123
123
|
return this.onSync(ws, attachment, doc, decoder);
|
|
124
124
|
if (type === E.messageAwareness) {
|
|
@@ -155,28 +155,28 @@ export class Admission {
|
|
|
155
155
|
* sequence started — the room woke between two chunks and lost the
|
|
156
156
|
* buffer — faults the socket (1011): its provider redials and resends.
|
|
157
157
|
*/
|
|
158
|
-
onChunk(ws, attachment, doc, decoder) {
|
|
158
|
+
#onChunk(ws, attachment, doc, decoder) {
|
|
159
159
|
const room = this.room;
|
|
160
|
-
let read = this
|
|
160
|
+
let read = this.#chunkReaders.get(ws);
|
|
161
161
|
if (read === undefined) {
|
|
162
162
|
read = E.createChunkReader(room.limits.maxInboundFrameBytes, (total) => this.admitChunks(ws, total));
|
|
163
|
-
this
|
|
163
|
+
this.#chunkReaders.set(ws, read);
|
|
164
164
|
}
|
|
165
165
|
let whole;
|
|
166
166
|
try {
|
|
167
167
|
whole = read(decoder);
|
|
168
168
|
}
|
|
169
169
|
catch (error) {
|
|
170
|
-
this
|
|
170
|
+
this.#chunkReaders.delete(ws);
|
|
171
171
|
if (error instanceof ChunkLimitError) {
|
|
172
|
-
return this
|
|
172
|
+
return this.#overQuota(ws, attachment.user, 'frame', {
|
|
173
173
|
bytes: error.total,
|
|
174
174
|
limit: error.limit
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
if (error instanceof ChunksRefused) {
|
|
178
178
|
if (error.quota === 'rate') {
|
|
179
|
-
return this
|
|
179
|
+
return this.#overQuota(ws, attachment.user, 'rate', error.detail);
|
|
180
180
|
}
|
|
181
181
|
// The room's buffer is full, not the sender at fault: it redials.
|
|
182
182
|
room.note({
|
|
@@ -215,7 +215,7 @@ export class Admission {
|
|
|
215
215
|
if (!this.allow(ws))
|
|
216
216
|
throw new ChunksRefused('rate', { perSecond: room.limits.maxUpdatesPerSecond });
|
|
217
217
|
let buffered = 0;
|
|
218
|
-
for (const [other, read] of this
|
|
218
|
+
for (const [other, read] of this.#chunkReaders)
|
|
219
219
|
if (other !== ws)
|
|
220
220
|
buffered += read.buffered;
|
|
221
221
|
const limit = room.limits.maxBufferedBytes;
|
|
@@ -228,7 +228,7 @@ export class Admission {
|
|
|
228
228
|
buffered() {
|
|
229
229
|
let sequences = 0;
|
|
230
230
|
let bytes = 0;
|
|
231
|
-
for (const read of this
|
|
231
|
+
for (const read of this.#chunkReaders.values()) {
|
|
232
232
|
if (read.buffered === 0)
|
|
233
233
|
continue;
|
|
234
234
|
sequences++;
|
|
@@ -244,11 +244,11 @@ export class Admission {
|
|
|
244
244
|
* wait in the room's memory for good, unstored and unacknowledged; and
|
|
245
245
|
* a redial would resend it and meet the same quota.
|
|
246
246
|
*/
|
|
247
|
-
overQuota(ws, user, quota, detail) {
|
|
247
|
+
#overQuota(ws, user, quota, detail) {
|
|
248
248
|
const room = this.room;
|
|
249
249
|
room.note({ reason: 'quota', detail: { user, quota, ...detail } });
|
|
250
250
|
room.log({ edytor: 'quota', user, quota });
|
|
251
|
-
this
|
|
251
|
+
this.#chunkReaders.delete(ws);
|
|
252
252
|
room.presence.depart(ws);
|
|
253
253
|
room.close(ws, CLOSE.quota, `quota: ${quota}`);
|
|
254
254
|
}
|
|
@@ -258,7 +258,7 @@ export class Admission {
|
|
|
258
258
|
* Presence messages draw from a bucket of their own (`RoomPresence`).
|
|
259
259
|
*/
|
|
260
260
|
allow(ws) {
|
|
261
|
-
return allowance(this
|
|
261
|
+
return allowance(this.#allowances, ws, this.room.limits.maxUpdatesPerSecond);
|
|
262
262
|
}
|
|
263
263
|
/**
|
|
264
264
|
* The document quota: would `incoming` bytes take the document
|
|
@@ -266,7 +266,7 @@ export class Admission {
|
|
|
266
266
|
* the engine holds waiting; update records count until compaction
|
|
267
267
|
* collapses them, so it compacts first when they would.
|
|
268
268
|
*/
|
|
269
|
-
overDocument(incoming, freed) {
|
|
269
|
+
#overDocument(incoming, freed) {
|
|
270
270
|
const room = this.room;
|
|
271
271
|
const { storage } = room;
|
|
272
272
|
const limit = room.limits.maxDocumentBytes;
|
|
@@ -295,7 +295,7 @@ export class Admission {
|
|
|
295
295
|
const syncType = decode(() => E.readVarUint(decoder));
|
|
296
296
|
// The rate quota counts every sync message, a Step1 too (it costs a Step2).
|
|
297
297
|
if (!this.allow(ws)) {
|
|
298
|
-
return this
|
|
298
|
+
return this.#overQuota(ws, attachment.user, 'rate', {
|
|
299
299
|
perSecond: room.limits.maxUpdatesPerSecond
|
|
300
300
|
});
|
|
301
301
|
}
|
|
@@ -313,11 +313,7 @@ export class Admission {
|
|
|
313
313
|
if (syncType !== E.messageYjsSyncStep2 && syncType !== E.messageYjsUpdate) {
|
|
314
314
|
return room.refuse(ws, { reason: 'malformed', detail: `sync type ${syncType}` });
|
|
315
315
|
}
|
|
316
|
-
|
|
317
|
-
const update = decode(() => {
|
|
318
|
-
const payload = E.readVarUint8Array(decoder);
|
|
319
|
-
return syncType === E.messageYjsSyncStep2 ? sync.step2Update(payload) : payload;
|
|
320
|
-
});
|
|
316
|
+
const update = decode(() => E.readVarUint8Array(decoder));
|
|
321
317
|
const started = now();
|
|
322
318
|
try {
|
|
323
319
|
this.onUpdate(ws, attachment, doc, update);
|
|
@@ -345,8 +341,8 @@ export class Admission {
|
|
|
345
341
|
}
|
|
346
342
|
// The document quota, net of what the frame deletes.
|
|
347
343
|
if (decoded.structs.some((struct) => !(struct instanceof Y.Skip)) &&
|
|
348
|
-
this
|
|
349
|
-
return this
|
|
344
|
+
this.#overDocument(update.length, freedBy(doc, decoded.ds))) {
|
|
345
|
+
return this.#overQuota(ws, attachment.user, 'document', {
|
|
350
346
|
bytes: storage.documentBytes,
|
|
351
347
|
incoming: update.length,
|
|
352
348
|
limit: room.limits.maxDocumentBytes
|
|
@@ -445,7 +441,7 @@ export class Admission {
|
|
|
445
441
|
const stay = doc.store.pendingStructs === null
|
|
446
442
|
? Y.createIdSet()
|
|
447
443
|
: replacedEntries(doc, decoded.structs, ({ id }) => !stripped.has(id.client) && storedStruct(doc, id.client, id.clock) === null);
|
|
448
|
-
const released = room.handle(() => this
|
|
444
|
+
const released = room.handle(() => this.#settleDeletes(ws, attachment.user, doc, waiting, stay, discarded !== undefined));
|
|
449
445
|
if (room.unstored !== null)
|
|
450
446
|
return this.fault(ws, room.unstored);
|
|
451
447
|
if (discarded)
|
|
@@ -464,7 +460,7 @@ export class Admission {
|
|
|
464
460
|
return this.fault(ws, room.unstored);
|
|
465
461
|
}
|
|
466
462
|
// A dropped delete is not acknowledged: its sender stays unsaved.
|
|
467
|
-
room.send(ws, savedFrame(doc, addIds(this
|
|
463
|
+
room.send(ws, savedFrame(doc, addIds(this.#storedDeletes(doc, decoded.ds), released)));
|
|
468
464
|
// Waiting writes the frame released are other sockets' (a relayer's
|
|
469
465
|
// edit that built on an author's lost one): they are stored now, with
|
|
470
466
|
// the deletes that waited with them.
|
|
@@ -491,7 +487,7 @@ export class Admission {
|
|
|
491
487
|
* the sender's), unstored and unacknowledged. A replaced entry is
|
|
492
488
|
* deleted by its rewrite anyway, should that integrate.
|
|
493
489
|
*/
|
|
494
|
-
settleDeletes(ws, user, doc, waiting, stay, discarded) {
|
|
490
|
+
#settleDeletes(ws, user, doc, waiting, stay, discarded) {
|
|
495
491
|
const room = this.room;
|
|
496
492
|
const { storage } = room;
|
|
497
493
|
let now = pendingDeletes(doc);
|
|
@@ -535,7 +531,7 @@ export class Admission {
|
|
|
535
531
|
* (the waiting cap, a stripped rewrite's replaced entry) or keeps
|
|
536
532
|
* waiting in memory only.
|
|
537
533
|
*/
|
|
538
|
-
storedDeletes(doc, deletes) {
|
|
534
|
+
#storedDeletes(doc, deletes) {
|
|
539
535
|
const unheld = Y.diffIdSet(deletes, heldDeletes(doc, deletes));
|
|
540
536
|
return Y.diffIdSet(deletes, Y.diffIdSet(unheld, this.room.storage.storedWaiting));
|
|
541
537
|
}
|
|
@@ -13,6 +13,7 @@ import { type RoomContext } from './context.js';
|
|
|
13
13
|
/** The largest request body `routeDocumentComments` forwards, in bytes. */
|
|
14
14
|
export declare const MAX_COMMENT_REQUEST_BYTES: number;
|
|
15
15
|
export declare class RoomComments {
|
|
16
|
+
#private;
|
|
16
17
|
private readonly room;
|
|
17
18
|
private ready;
|
|
18
19
|
/** Each verified user's HTTP request allowance (memory: a wake refills it). */
|
|
@@ -22,7 +23,6 @@ export declare class RoomComments {
|
|
|
22
23
|
constructor(room: RoomContext);
|
|
23
24
|
/** Comments are on unless the room's `comments` option is `false`. */
|
|
24
25
|
get enabled(): boolean;
|
|
25
|
-
private ensure;
|
|
26
26
|
/**
|
|
27
27
|
* The comments' last sequence number (`0`: none yet): the one `meta`
|
|
28
28
|
* keeps, and never below a stored thread's `rev` (a generation cutover
|
|
@@ -52,8 +52,6 @@ export declare class RoomComments {
|
|
|
52
52
|
* anchor marks removed when it removed a thread; then `onComment`.
|
|
53
53
|
*/
|
|
54
54
|
apply(request: CommentRequest, actor: CommentActor): Promise<CommentOutcome>;
|
|
55
|
-
/** A removed thread's anchor: its marks leave the document, as one room transaction. */
|
|
56
|
-
private removeAnchors;
|
|
57
55
|
/** Send `change` to every socket that subscribed. */
|
|
58
56
|
private broadcast;
|
|
59
57
|
/**
|
|
@@ -50,7 +50,7 @@ export class RoomComments {
|
|
|
50
50
|
get enabled() {
|
|
51
51
|
return this.room.options.comments !== false;
|
|
52
52
|
}
|
|
53
|
-
ensure() {
|
|
53
|
+
#ensure() {
|
|
54
54
|
if (this.ready)
|
|
55
55
|
return;
|
|
56
56
|
const { sql, tables } = this.room;
|
|
@@ -134,7 +134,7 @@ export class RoomComments {
|
|
|
134
134
|
if (!this.enabled)
|
|
135
135
|
return { seq: 0, threads: [] };
|
|
136
136
|
return noTimers(() => {
|
|
137
|
-
this
|
|
137
|
+
this.#ensure();
|
|
138
138
|
const { sql, tables } = this.room;
|
|
139
139
|
const comments = new Map();
|
|
140
140
|
for (const row of sql
|
|
@@ -186,7 +186,7 @@ export class RoomComments {
|
|
|
186
186
|
if (!this.enabled)
|
|
187
187
|
return { status: 'refused', reason: 'missing', message: 'no comments' };
|
|
188
188
|
const outcome = noTimers(() => {
|
|
189
|
-
this
|
|
189
|
+
this.#ensure();
|
|
190
190
|
const { sql, tables } = room;
|
|
191
191
|
const thread = validCommentId(request.thread) ? this.read(request.thread) : null;
|
|
192
192
|
const threads = request.op === 'add'
|
|
@@ -212,7 +212,7 @@ export class RoomComments {
|
|
|
212
212
|
this.store(decided.change);
|
|
213
213
|
this.broadcast(decided.change);
|
|
214
214
|
if (decided.change.type === 'removed')
|
|
215
|
-
this
|
|
215
|
+
this.#removeAnchors(decided.change.thread.id);
|
|
216
216
|
room.log({
|
|
217
217
|
edytor: 'comment',
|
|
218
218
|
type: decided.change.type,
|
|
@@ -233,7 +233,7 @@ export class RoomComments {
|
|
|
233
233
|
return outcome;
|
|
234
234
|
}
|
|
235
235
|
/** A removed thread's anchor: its marks leave the document, as one room transaction. */
|
|
236
|
-
removeAnchors(id) {
|
|
236
|
+
#removeAnchors(id) {
|
|
237
237
|
const room = this.room;
|
|
238
238
|
if (room.live === null || room.busy)
|
|
239
239
|
return;
|
|
@@ -244,7 +244,7 @@ export class RoomComments {
|
|
|
244
244
|
const mark = `${COMMENT_MARK}:${id}`;
|
|
245
245
|
room.transact((facade) => {
|
|
246
246
|
for (const run of [...runs].reverse())
|
|
247
|
-
facade.
|
|
247
|
+
facade.formatRange(run.block, run.offset, run.length, { [mark]: null });
|
|
248
248
|
});
|
|
249
249
|
}
|
|
250
250
|
catch (error) {
|