kritzel-stencil 0.1.82 → 0.1.83
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/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-active-users_42.cjs.entry.js +28 -3
- package/dist/cjs/{workspace.migrations-4HATwIMK.js → workspace.migrations-K5oVASsb.js} +49 -9
- package/dist/collection/classes/handlers/move.handler.js +2 -0
- package/dist/collection/classes/objects/selection-group.class.js +47 -9
- package/dist/collection/classes/structures/object-map.structure.js +26 -1
- package/dist/collection/constants/version.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/kritzel-controls.js +1 -1
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/kritzel-settings.js +1 -1
- package/dist/components/kritzel-tool-config.js +1 -1
- package/dist/components/{p-CgtykATT.js → p-CKfjz1gj.js} +2 -2
- package/dist/components/{p-C35iuSnC.js → p-CLo-TjD_.js} +1 -1
- package/dist/components/{p-DsfD4pGR.js → p-CYl_JKvH.js} +1 -1
- package/dist/components/{p-DK_d3fKa.js → p-DwemlMvt.js} +1 -1
- package/dist/components/{p-BPQOTise.js → p-zM6hQ55n.js} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/kritzel-active-users_42.entry.js +28 -3
- package/dist/esm/{workspace.migrations-Be65cOkQ.js → workspace.migrations-D5iSPf3E.js} +49 -9
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/{p-Be65cOkQ.js → p-D5iSPf3E.js} +1 -1
- package/dist/stencil/p-c28b30ab.entry.js +9 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/dist/types/classes/objects/selection-group.class.d.ts +15 -1
- package/dist/types/classes/structures/object-map.structure.d.ts +17 -0
- package/dist/types/constants/version.d.ts +1 -1
- package/package.json +1 -1
- package/dist/stencil/p-f318b7d5.entry.js +0 -9
package/dist/esm/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as APP_STATE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, v as CURRENT_WORKSPACE_SCHEMA_VERSION, D as DEFAULT_BRUSH_CONFIG, r as DEFAULT_LINE_TOOL_CONFIG, q as DEFAULT_TEXT_CONFIG, H as HocuspocusSyncProvider, I as IndexedDBSyncProvider, u as KritzelAlignment, o as KritzelAnchorManager, f as KritzelBrushTool, l as KritzelCursorHelper, h as KritzelEraserTool, d as KritzelGroup, b as KritzelImage, i as KritzelImageTool, c as KritzelLine, g as KritzelLineTool, a as KritzelPath, m as KritzelSelectionTool, e as KritzelShape, k as KritzelShapeTool, K as KritzelText, j as KritzelTextTool, p as KritzelThemeManager, n as KritzelWorkspace, S as ShapeType, W as WORKSPACE_EXPORT_VERSION, x as WORKSPACE_MIGRATIONS, t as darkTheme, s as lightTheme, w as runMigrations } from './workspace.migrations-
|
|
1
|
+
export { A as APP_STATE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, v as CURRENT_WORKSPACE_SCHEMA_VERSION, D as DEFAULT_BRUSH_CONFIG, r as DEFAULT_LINE_TOOL_CONFIG, q as DEFAULT_TEXT_CONFIG, H as HocuspocusSyncProvider, I as IndexedDBSyncProvider, u as KritzelAlignment, o as KritzelAnchorManager, f as KritzelBrushTool, l as KritzelCursorHelper, h as KritzelEraserTool, d as KritzelGroup, b as KritzelImage, i as KritzelImageTool, c as KritzelLine, g as KritzelLineTool, a as KritzelPath, m as KritzelSelectionTool, e as KritzelShape, k as KritzelShapeTool, K as KritzelText, j as KritzelTextTool, p as KritzelThemeManager, n as KritzelWorkspace, S as ShapeType, W as WORKSPACE_EXPORT_VERSION, x as WORKSPACE_MIGRATIONS, t as darkTheme, s as lightTheme, w as runMigrations } from './workspace.migrations-D5iSPf3E.js';
|
|
2
2
|
import * as Y from 'yjs';
|
|
3
3
|
import { WebsocketProvider } from 'y-websocket';
|
|
4
4
|
import 'y-indexeddb';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './index-D9HaikfQ.js';
|
|
2
|
-
import { a as KritzelPath, c as KritzelLine, y as KritzelColorHelper, m as KritzelSelectionTool, f as KritzelBrushTool, g as KritzelLineTool, k as KritzelShapeTool, j as KritzelTextTool, z as KritzelDevicesHelper, B as KritzelMouseButton, E as DEFAULT_COLOR_PALETTE, S as ShapeType, D as DEFAULT_BRUSH_CONFIG, h as KritzelEraserTool, r as DEFAULT_LINE_TOOL_CONFIG, q as DEFAULT_TEXT_CONFIG, i as KritzelImageTool, u as KritzelAlignment, H as HocuspocusSyncProvider, I as IndexedDBSyncProvider, F as KritzelSelectionGroup, G as KritzelSelectionBox, J as KritzelIconRegistry, L as KritzelKeyboardHelper, M as KritzelBaseHandler, N as KritzelToolRegistry, O as KritzelBaseObject, n as KritzelWorkspace, d as KritzelGroup, b as KritzelImage, e as KritzelShape, K as KritzelText, w as runMigrations, v as CURRENT_WORKSPACE_SCHEMA_VERSION, x as WORKSPACE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, A as APP_STATE_MIGRATIONS, P as ObjectHelper, l as KritzelCursorHelper, o as KritzelAnchorManager, p as KritzelThemeManager, Q as KritzelClassHelper, R as KritzelEventHelper, T as KritzelBaseTool, W as WORKSPACE_EXPORT_VERSION } from './workspace.migrations-
|
|
2
|
+
import { a as KritzelPath, c as KritzelLine, y as KritzelColorHelper, m as KritzelSelectionTool, f as KritzelBrushTool, g as KritzelLineTool, k as KritzelShapeTool, j as KritzelTextTool, z as KritzelDevicesHelper, B as KritzelMouseButton, E as DEFAULT_COLOR_PALETTE, S as ShapeType, D as DEFAULT_BRUSH_CONFIG, h as KritzelEraserTool, r as DEFAULT_LINE_TOOL_CONFIG, q as DEFAULT_TEXT_CONFIG, i as KritzelImageTool, u as KritzelAlignment, H as HocuspocusSyncProvider, I as IndexedDBSyncProvider, F as KritzelSelectionGroup, G as KritzelSelectionBox, J as KritzelIconRegistry, L as KritzelKeyboardHelper, M as KritzelBaseHandler, N as KritzelToolRegistry, O as KritzelBaseObject, n as KritzelWorkspace, d as KritzelGroup, b as KritzelImage, e as KritzelShape, K as KritzelText, w as runMigrations, v as CURRENT_WORKSPACE_SCHEMA_VERSION, x as WORKSPACE_MIGRATIONS, C as CURRENT_APP_STATE_SCHEMA_VERSION, A as APP_STATE_MIGRATIONS, P as ObjectHelper, l as KritzelCursorHelper, o as KritzelAnchorManager, p as KritzelThemeManager, Q as KritzelClassHelper, R as KritzelEventHelper, T as KritzelBaseTool, W as WORKSPACE_EXPORT_VERSION } from './workspace.migrations-D5iSPf3E.js';
|
|
3
3
|
import * as Y from 'yjs';
|
|
4
4
|
import 'y-websocket';
|
|
5
5
|
import 'y-indexeddb';
|
|
@@ -21332,6 +21332,12 @@ class KritzelObjectMap {
|
|
|
21332
21332
|
_lastAwarenessEmitTime = 0;
|
|
21333
21333
|
_awarenessEmitTimeout = null;
|
|
21334
21334
|
AWARENESS_THROTTLE_INTERVAL = 100; // milliseconds
|
|
21335
|
+
/**
|
|
21336
|
+
* When true, update() only modifies local state (quadtree + idMap)
|
|
21337
|
+
* without writing to Yjs. Used during drag operations to avoid
|
|
21338
|
+
* redundant full serializations of every child object per frame.
|
|
21339
|
+
*/
|
|
21340
|
+
_localOnlyMode = false;
|
|
21335
21341
|
/**
|
|
21336
21342
|
* Indicates whether the object map has been initialized and is ready for use.
|
|
21337
21343
|
* @returns `true` if providers are connected and the map is operational
|
|
@@ -21885,6 +21891,25 @@ class KritzelObjectMap {
|
|
|
21885
21891
|
this._ydoc.transact(callback, 'local');
|
|
21886
21892
|
}
|
|
21887
21893
|
}
|
|
21894
|
+
/**
|
|
21895
|
+
* Executes a callback where all update() calls only modify local state
|
|
21896
|
+
* (quadtree + idMap) without writing to Yjs. This avoids expensive full
|
|
21897
|
+
* serializations during continuous operations like dragging many objects.
|
|
21898
|
+
*
|
|
21899
|
+
* Objects updated inside this callback must be persisted later
|
|
21900
|
+
* (e.g., via a normal update() call at drag end).
|
|
21901
|
+
*
|
|
21902
|
+
* @param callback - The function containing operations to execute locally
|
|
21903
|
+
*/
|
|
21904
|
+
withLocalUpdatesOnly(callback) {
|
|
21905
|
+
this._localOnlyMode = true;
|
|
21906
|
+
try {
|
|
21907
|
+
callback();
|
|
21908
|
+
}
|
|
21909
|
+
finally {
|
|
21910
|
+
this._localOnlyMode = false;
|
|
21911
|
+
}
|
|
21912
|
+
}
|
|
21888
21913
|
/**
|
|
21889
21914
|
* Loads all objects from the Yjs objects map into the local quadtree.
|
|
21890
21915
|
* Clears the existing quadtree and repopulates it by deserializing each
|
|
@@ -21976,7 +22001,7 @@ class KritzelObjectMap {
|
|
|
21976
22001
|
}
|
|
21977
22002
|
this.quadtree.update(object);
|
|
21978
22003
|
this._idMap.set(object.id, object);
|
|
21979
|
-
if (this._objectsMap && this.isPersistable(object)) {
|
|
22004
|
+
if (!this._localOnlyMode && this._objectsMap && this.isPersistable(object)) {
|
|
21980
22005
|
const serialized = object.serialize();
|
|
21981
22006
|
const origin = options.temporary ? 'temporary' : 'local';
|
|
21982
22007
|
this._ydoc?.transact(() => {
|
|
@@ -28686,7 +28711,7 @@ const KritzelPortal = class {
|
|
|
28686
28711
|
* This file is auto-generated by the version bump scripts.
|
|
28687
28712
|
* Do not modify manually.
|
|
28688
28713
|
*/
|
|
28689
|
-
const KRITZEL_VERSION = '0.1.
|
|
28714
|
+
const KRITZEL_VERSION = '0.1.83';
|
|
28690
28715
|
|
|
28691
28716
|
const kritzelSettingsCss = () => `:host{display:contents}kritzel-dialog{--kritzel-dialog-body-padding:0;--kritzel-dialog-width-large:800px;--kritzel-dialog-height-large:500px}.footer-button{padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px}.cancel-button{border:1px solid #ebebeb;background:#fff;color:inherit}.cancel-button:hover{background:#f5f5f5}.settings-content{padding:0}.settings-content h3{margin:0 0 16px 0;font-size:18px;font-weight:600;color:var(--kritzel-settings-content-heading-color, #333333)}.settings-content p{margin:0;font-size:14px;color:var(--kritzel-settings-content-text-color, #666666);line-height:1.5}.settings-group{display:flex;flex-direction:column;gap:24px}.settings-item{display:flex;flex-direction:column;gap:8px}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:16px}.settings-label{font-size:14px;font-weight:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.settings-description{font-size:12px;color:var(--kritzel-settings-description-color, #888888);margin:0;line-height:1.4}.shortcuts-list{display:flex;flex-direction:column;gap:24px}.shortcuts-category{display:flex;flex-direction:column;gap:8px}.shortcuts-category-title{font-size:14px;font-weight:600;color:var(--kritzel-settings-label-color, #333333);margin:0 0 4px 0}.shortcuts-group{display:flex;flex-direction:column;gap:4px}.shortcut-item{display:flex;justify-content:space-between;align-items:center;padding:6px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-item-bg, rgba(0, 0, 0, 0.02))}.shortcut-label{font-size:14px;color:var(--kritzel-settings-content-text-color, #666666)}.shortcut-key{font-family:monospace;font-size:12px;padding:2px 8px;border-radius:4px;background:var(--kritzel-settings-shortcut-key-bg, #f0f0f0);color:var(--kritzel-settings-shortcut-key-color, #333333);border:1px solid var(--kritzel-settings-shortcut-key-border, #ddd)}`;
|
|
28692
28717
|
|
|
@@ -18521,6 +18521,10 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
18521
18521
|
handleColor;
|
|
18522
18522
|
handleStrokeColor;
|
|
18523
18523
|
handleSize = 6;
|
|
18524
|
+
/** Timestamp of the last Yjs persist for children during a drag */
|
|
18525
|
+
_lastChildPersistTime = 0;
|
|
18526
|
+
/** Minimum interval (ms) between child Yjs persists during drag */
|
|
18527
|
+
static CHILD_PERSIST_THROTTLE_MS = 100;
|
|
18524
18528
|
/**
|
|
18525
18529
|
* Gets the array of object IDs contained in this selection group.
|
|
18526
18530
|
* @returns Array of string IDs for the selected objects
|
|
@@ -18806,7 +18810,11 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
18806
18810
|
/**
|
|
18807
18811
|
* Moves the selection group and all its contained objects by calculating the delta from drag coordinates.
|
|
18808
18812
|
* Updates anchor points for any lines connected to the moved objects.
|
|
18809
|
-
*
|
|
18813
|
+
*
|
|
18814
|
+
* Child objects are moved locally without writing to Yjs during the drag to avoid
|
|
18815
|
+
* N+1 full serializations per frame, which can overwhelm the WebSocket server.
|
|
18816
|
+
* Children must be persisted at drag end via {@link persistChildren}.
|
|
18817
|
+
*
|
|
18810
18818
|
* @param startX - The starting x-coordinate of the drag operation (in screen space)
|
|
18811
18819
|
* @param startY - The starting y-coordinate of the drag operation (in screen space)
|
|
18812
18820
|
* @param endX - The ending x-coordinate of the drag operation (in screen space)
|
|
@@ -18817,21 +18825,51 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
18817
18825
|
const deltaY = (startY - endY) / this._core.store.state.scale;
|
|
18818
18826
|
this.translateX += deltaX;
|
|
18819
18827
|
this.translateY += deltaY;
|
|
18820
|
-
|
|
18828
|
+
const now = Date.now();
|
|
18829
|
+
const shouldPersistChildren = now - this._lastChildPersistTime >= KritzelSelectionGroup.CHILD_PERSIST_THROTTLE_MS;
|
|
18830
|
+
if (shouldPersistChildren) {
|
|
18831
|
+
// Periodically persist children to Yjs so remote peers see movement in real-time
|
|
18832
|
+
this._core.store.objects.transaction(() => {
|
|
18833
|
+
this._core.store.objects.update(this);
|
|
18834
|
+
const children = this.objects;
|
|
18835
|
+
for (const obj of children) {
|
|
18836
|
+
obj.move(startX, startY, endX, endY);
|
|
18837
|
+
this._core.anchorManager.updateAnchorsForObject(obj.id);
|
|
18838
|
+
}
|
|
18839
|
+
});
|
|
18840
|
+
this._lastChildPersistTime = now;
|
|
18841
|
+
}
|
|
18842
|
+
else {
|
|
18843
|
+
// Between throttle intervals, only persist the selection group itself.
|
|
18844
|
+
// Children are moved locally for smooth local rendering.
|
|
18821
18845
|
this._core.store.objects.update(this);
|
|
18822
|
-
|
|
18823
|
-
|
|
18824
|
-
|
|
18825
|
-
|
|
18826
|
-
|
|
18827
|
-
|
|
18828
|
-
|
|
18846
|
+
this._core.store.objects.withLocalUpdatesOnly(() => {
|
|
18847
|
+
const children = this.objects;
|
|
18848
|
+
for (const obj of children) {
|
|
18849
|
+
obj.move(startX, startY, endX, endY);
|
|
18850
|
+
this._core.anchorManager.updateAnchorsForObject(obj.id);
|
|
18851
|
+
}
|
|
18852
|
+
});
|
|
18853
|
+
}
|
|
18829
18854
|
// Update snapshots
|
|
18830
18855
|
this.unchangedObjectSnapshots.forEach(snapshot => {
|
|
18831
18856
|
snapshot.translateX += deltaX;
|
|
18832
18857
|
snapshot.translateY += deltaY;
|
|
18833
18858
|
});
|
|
18834
18859
|
}
|
|
18860
|
+
/**
|
|
18861
|
+
* Persists all child objects to Yjs in a single transaction.
|
|
18862
|
+
* Must be called after a drag operation completes to sync the final
|
|
18863
|
+
* positions of children that were only updated locally during the drag.
|
|
18864
|
+
*/
|
|
18865
|
+
persistChildren() {
|
|
18866
|
+
this._core.store.objects.transaction(() => {
|
|
18867
|
+
const children = this.objects;
|
|
18868
|
+
for (const obj of children) {
|
|
18869
|
+
this._core.store.objects.update(obj);
|
|
18870
|
+
}
|
|
18871
|
+
});
|
|
18872
|
+
}
|
|
18835
18873
|
/**
|
|
18836
18874
|
* Resizes the selection group and scales all contained objects proportionally.
|
|
18837
18875
|
* Uses snapshot values to avoid compounding errors during continuous drag operations.
|
|
@@ -20345,6 +20383,7 @@ class KritzelMoveHandler extends KritzelBaseHandler {
|
|
|
20345
20383
|
if (this._core.store.state.isDragging) {
|
|
20346
20384
|
this._core.store.state.isDragging = false;
|
|
20347
20385
|
if (this.hasMoved) {
|
|
20386
|
+
this._core.store.selectionGroup.persistChildren();
|
|
20348
20387
|
this._core.store.selectionGroup.update();
|
|
20349
20388
|
this._core.engine.emitObjectsChange();
|
|
20350
20389
|
this._core.store.state.hasObjectsChanged = true;
|
|
@@ -20355,6 +20394,7 @@ class KritzelMoveHandler extends KritzelBaseHandler {
|
|
|
20355
20394
|
if (this._core.store.state.isDragging) {
|
|
20356
20395
|
this._core.store.state.isDragging = false;
|
|
20357
20396
|
if (this.hasMoved) {
|
|
20397
|
+
this._core.store.selectionGroup.persistChildren();
|
|
20358
20398
|
this._core.store.selectionGroup.update();
|
|
20359
20399
|
this._core.engine.emitObjectsChange();
|
|
20360
20400
|
this._core.store.state.hasObjectsChanged = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{A as APP_STATE_MIGRATIONS,C as CURRENT_APP_STATE_SCHEMA_VERSION,v as CURRENT_WORKSPACE_SCHEMA_VERSION,D as DEFAULT_BRUSH_CONFIG,r as DEFAULT_LINE_TOOL_CONFIG,q as DEFAULT_TEXT_CONFIG,H as HocuspocusSyncProvider,I as IndexedDBSyncProvider,u as KritzelAlignment,o as KritzelAnchorManager,f as KritzelBrushTool,l as KritzelCursorHelper,h as KritzelEraserTool,d as KritzelGroup,b as KritzelImage,i as KritzelImageTool,c as KritzelLine,g as KritzelLineTool,a as KritzelPath,m as KritzelSelectionTool,e as KritzelShape,k as KritzelShapeTool,K as KritzelText,j as KritzelTextTool,p as KritzelThemeManager,n as KritzelWorkspace,S as ShapeType,W as WORKSPACE_EXPORT_VERSION,x as WORKSPACE_MIGRATIONS,t as darkTheme,s as lightTheme,w as runMigrations}from"./p-
|
|
1
|
+
export{A as APP_STATE_MIGRATIONS,C as CURRENT_APP_STATE_SCHEMA_VERSION,v as CURRENT_WORKSPACE_SCHEMA_VERSION,D as DEFAULT_BRUSH_CONFIG,r as DEFAULT_LINE_TOOL_CONFIG,q as DEFAULT_TEXT_CONFIG,H as HocuspocusSyncProvider,I as IndexedDBSyncProvider,u as KritzelAlignment,o as KritzelAnchorManager,f as KritzelBrushTool,l as KritzelCursorHelper,h as KritzelEraserTool,d as KritzelGroup,b as KritzelImage,i as KritzelImageTool,c as KritzelLine,g as KritzelLineTool,a as KritzelPath,m as KritzelSelectionTool,e as KritzelShape,k as KritzelShapeTool,K as KritzelText,j as KritzelTextTool,p as KritzelThemeManager,n as KritzelWorkspace,S as ShapeType,W as WORKSPACE_EXPORT_VERSION,x as WORKSPACE_MIGRATIONS,t as darkTheme,s as lightTheme,w as runMigrations}from"./p-D5iSPf3E.js";import*as T from"yjs";import{WebsocketProvider as y}from"y-websocket";import"y-indexeddb";const E=Math.floor,_=127,z=Number.MAX_SAFE_INTEGER;class P{constructor(){this.cpos=0,this.cbuf=new Uint8Array(100),this.bufs=[]}}const R=()=>new P,U=t=>{const s=new Uint8Array((t=>{let s=t.cpos;for(let e=0;e<t.bufs.length;e++)s+=t.bufs[e].length;return s})(t));let e=0;for(let i=0;i<t.bufs.length;i++){const n=t.bufs[i];s.set(n,e),e+=n.length}return s.set(new Uint8Array(t.cbuf.buffer,0,t.cpos),e),s},O=(t,s)=>{const e=t.cbuf.length;t.cpos===e&&(t.bufs.push(t.cbuf),t.cbuf=new Uint8Array(2*e),t.cpos=0),t.cbuf[t.cpos++]=s},N=(t,s)=>{for(;s>_;)O(t,128|_&s),s=E(s/128);O(t,_&s)},M=(t,s)=>{N(t,s.byteLength),((t,s)=>{const e=t.cbuf.length,i=t.cpos,n=((t,s)=>t<s?t:s)(e-i,s.length),r=s.length-n;t.cbuf.set(s.subarray(0,n),i),t.cpos+=n,r>0&&(t.bufs.push(t.cbuf),t.cbuf=new Uint8Array(((t,s)=>t>s?t:s)(2*e,r)),t.cbuf.set(s.subarray(n)),t.cpos=r)})(t,s)},L=t=>new Error(t),B=L("Unexpected end of array"),F=L("Integer out of Range");class G{constructor(t){this.arr=t,this.pos=0}}const V=t=>((t,s)=>{const e=new Uint8Array(t.arr.buffer,t.pos+t.arr.byteOffset,s);return t.pos+=s,e})(t,$(t)),$=t=>{let s=0,e=1;const i=t.arr.length;for(;t.pos<i;){const i=t.arr[t.pos++];if(s+=(i&_)*e,e*=128,i<128)return s;if(s>z)throw F}throw B};class X{type="local";doc;channel;_synced=!1;constructor(t,s,e){this.doc=s,this.channel=new BroadcastChannel(t),this.channel.onmessage=t=>{this.handleMessage(t.data)},this.doc.on("update",this.handleDocUpdate),this.broadcastSync(),setTimeout((()=>{this._synced=!0}),100),e?.quiet||console.info(`BroadcastChannel Provider initialized: ${t}`)}handleDocUpdate=(t,s)=>{if(s!==this){const s=R();N(s,0),M(s,t),this.channel.postMessage(U(s))}};handleMessage(t){const s=(e=new Uint8Array(t),new G(e));var e;switch($(s)){case 0:const t=V(s);T.applyUpdate(this.doc,t,this);break;case 1:this.broadcastSync();break;case 2:const e=V(s),i=T.encodeStateAsUpdate(this.doc,e);if(i.length>0){const t=R();N(t,0),M(t,i),this.channel.postMessage(U(t))}}}broadcastSync(){const t=R();N(t,2),M(t,T.encodeStateVector(this.doc)),this.channel.postMessage(U(t))}async connect(){if(!this._synced)return new Promise((t=>{const s=()=>{this._synced?t():setTimeout(s,50)};s()}))}disconnect(){}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.doc.off("update",this.handleDocUpdate),this.channel.close()}}class J{type="network";provider;isConnected=!1;_quiet=!1;get awareness(){return this.provider.awareness}constructor(t,s,e){const i=e?.url||"ws://localhost:1234",n=e?.roomName||t;this.provider=new y(i,n,s,{params:e?.params,protocols:e?.protocols,WebSocketPolyfill:e?.WebSocketPolyfill,awareness:e?.awareness,maxBackoffTime:e?.maxBackoffTime,disableBc:!0}),this._quiet=e?.quiet??!1,this.setupEventListeners(),this._quiet||console.info(`WebSocket Provider initialized: ${i}/${n}`)}static with(t){return{create:(s,e,i)=>{const n=i?{...t,...i}:t;return new J(s,e,n)}}}setupEventListeners(){this.provider.on("status",(({status:t})=>{"connected"===t?(this.isConnected=!0,this._quiet||console.info("WebSocket connected")):"disconnected"===t&&(this.isConnected=!1,this._quiet||console.info("WebSocket disconnected"))})),this.provider.on("sync",(t=>{t&&!this._quiet&&console.info("WebSocket synced")}))}async connect(){if(!this.isConnected)return new Promise(((t,s)=>{const e=setTimeout((()=>{s(new Error("WebSocket connection timeout"))}),1e4),i=({status:s})=>{"connected"===s&&(clearTimeout(e),this.provider.off("status",i),this.isConnected=!0,t())};this.provider.on("status",i),this.provider.wsconnected&&(clearTimeout(e),this.provider.off("status",i),this.isConnected=!0,t())}))}disconnect(){this.provider&&this.provider.disconnect(),this.isConnected=!1}async reconnect(){return this.disconnect(),this.connect()}destroy(){this.provider&&this.provider.destroy(),this.isConnected=!1}}export{X as BroadcastSyncProvider,J as WebSocketSyncProvider}
|