From 422936db1d41b10cf06cf775d46a15574b493b75 Mon Sep 17 00:00:00 2001 From: Charles Lirsac Date: Mon, 27 Nov 2023 20:53:24 +0000 Subject: [PATCH] Add websocket provider I'd prefer WebRTC over websocket here (especially as the WS implementation isn't encrypted; however I've run into issues around cross browser collaboration - namely: https://github.com/yjs/y-webrtc/issues/56 https://github.com/yjs/y-webrtc/issues/53 https://github.com/yjs/y-webrtc/issues/19 For now having websocket allows iterating on the editor and the UX until I can look at those issues more in depth. --- bun.lockb | Bin 236357 -> 247158 bytes package.json | 4 +++- src/components/editor.tsx | 5 +++-- src/session.ts | 29 +++++++++++++++++++++-------- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/bun.lockb b/bun.lockb index d38e1cec7df9f80d4db4e205465048816d1c2993..7cc50ef66516f9990266d5a3755fdf7a02b1e2b8 100755 GIT binary patch delta 52014 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�_0+soi;jcT0XYg z$;h$qNqy_EbJa78guRzwjlhkt=Cm!W3Yxq5v2K14Rv4rI+ns>>=RV{thRlrd zoH99++`D35H}ujt9&jDE!;0Md@Vg9KL+lM{4z{k&3u&M>JmV3k{EM(UG!fRKzE@k(6&qO3R!k~)d;iIQ^sU+X!hpVOeSduW>&uT{sQBm={^zW1_1gQZ zTW5G5Vl}MaKJawFYSc6wC{@fF1NAOupa%4SYh&l*2G4Mfux|7e|0!CA?Sz!t65@FB*t}i>GKT|Lq8T;O%p?HigTAoUNP%@ z{lq|aaqDceaOeTVs}Td%PQ>HItuf8Rfv6JJm`35iH6^TkXeNaCQVHuU6dh?bY7q|J z7|Bx&Ysd9%{gGCFi*Vr8Nb4+AJY+R$84k1!S!19cC9V9H;m}G}cvIR4SrZ#3MPjsZ z8f=*u(qy&7im=qbmRPsgdFuOetbtg5YiEnZz%Qk(MhW4-RZ-TMgmADwlOJ#GXqg|L$wC1iOmy3G3?yoSjA)oZY^V-O~fCuw_W*ph9+3n=j&Tw z4Zs>-U>(9zP=4$DBT130^>o`%gnO{A$71NQim^c#dBuWDum&o^(C4JoW7^-J6v=A6 z$#V+zWy|&Rtl(y>VJZ@gs7O54j@E4>Nff$2hBd}^pLlyxBTnZhQqbch!DHtpcllVkiZxAfnJhthP>kS0_bc zbg&J!WGKjKt05!wrisB$SV?y1Gn8_4ygn%Kni!YlztU>dB^>B;r8TBYIJE6br#gFw zht6OrrV^UGP@OtX6veG(o01|i6a=SB=fu!ntnPOGtnFZ+E_rsR!lc|0cpxc4hQbLx zOv)b9z-M)>v)#ghnpatkx`zV;uCm5JORlo=yN5$BUgfmTvLa}Gkkw&DWGtj!^{g=| z;ou^~1nXQlIq+;f>ugFm^c{jT0gAX)eebkW4LMl-sKJ@Pm$2mNx3|5&f#XSAgOegL zZm@f^^O~dxjP};KCdr`>Nwu?O9Tc$*d1iuD+}e3{VrVp$c8AZJ$jSIlLo2^$I8>#P z&zFoy6AcoBeX%;)r;ydi8q+HrdKW=MNROzmLSrW$&Lj?=A&sp@y~BZ(jjb`ziN;ob z?{F}hv$wgmqe*h0`_)#XKH<=OgwA#h=Nl#lUcTDON30X)%}g^kQ5Kdv^DNVyan_i= z;ZT0OBSzTs`UzHZYQbWZ;+i;hI&(e|OT{DXY2JpVb?6+xKVoUi1?)>iho)Aee&OJ4 zP3g0h**7^9o;3!kqi#TjiXTY*KE;$WCx!n(#TS(2U5%l4m6N=L6f*TF+rPTgf&Il;E|x3b0z z3BkxWOo;g^~0?}A*$GV0(xkwF7415!|8Vw5v zI<&XO3=4Q|8W307fy zNt_^k3-T6W4J@!e!7415(8b#Z3};|Q7b|~6IP?r6^TOzGlM%Xz<&1|e=!wj^MwROm zyJ$8RG3pNEuB1o|6)Rycn#gVii)M3@43%=W#qC&fv~NCw2e6#2RF1QieI>6BiJ|wf z_|LWKatIY#r1kCfwc)s@p2>CBr)*C^;Vh5tY6)0|BX)4m@0DBdTCDqN|bo)s;gT?)4@E5Eewns@Oz+NZ8sidy6 zuTT3)v9qX~!3+G**E%~U9J-b>SPeQS(Y;viL59nlH(2>&!=V@^OvA^~#f0?7QcTp+ zFwwu-YM91J|C0E`LVN4VsHgkra}vpz0u0g3LiNOl#+LSx$CkK0yV#W!IL{n?W zSUb_uii=AQRb~RTVVw)?by!-1d^Wi`F|+_nYnF=_H!?3|SdDHAhc3CIb7k!`reN!^ z@ovL%itA*5!nN#;7y8<@SjjCDgLTI`i>GY_iT?I19VV5ed+bofan2s2AKWZ-A7|yy z3Wv5JYLhzG_m8m@TF`3ND=9M5Ias)8UXvKwjOCoa+G&yFy^wV4l7gj;N{{%Yxp2HS zCNCU1h3G8&W_`GK%<|5|iQJx##&T{lQyyQ^y#3G>w`cAaY&IyNJLexRx+~Zxs(#YAzO0ZS7J`|keUVEuhwwFfq zRjf`}&V6P~j#I633w;BYvs~8~q|T6XjP@!J&I^amOz~#A zS#DCqR1E7}{p8SCrSRq2a9vWQYcMOb6GOG8Irk2nR@}R#V`&xntY+znp;cJUx@pEq z@|G+svr%%W+;nfAn(@J5FqQ^@GW`-m%doht(KX71-oesj^I41|wB`(}(ZXg*KYkpBbA8K<2T58vwCt~lfLD3(0!YgOn+EN2O*+2*%7M;dn~)G`W7%{oDB zz>+7QBFOsyOW`^nBO1+g@|@L}?pn^h)@H1v0?!YyRF0b^KEcoO8rMgsp;%mSX<+BQ zc2-;4PoD?AB1=atbGtDqGS?YhF4%0cF<2_)bnY=X&k6YxEEU5d?;}=p2 z*%`bRbDXw$9KvZaVU9KC?r`V;qDIvDtWa&Pbr!MbTxYUM=n@_>SaNX=l-IF(+ZJI4 zYv1l|zd@uFK6fVU<7cs&V>ws&?+Yw-t?oSUrkzI0X2#H392dyGk9&uVZzvi(awNDN0kECcUw^v^!H8cyOV0)`Ual7jY$Win0er zEV4K1D#Q-9r~~>dEM3m*K80G}$t4GiH90UbI0vh*71ua9@a>&e{_1e3)e`55$~Y$` zhN6}_71?11hAg$ltOf|Wz|vx3+8NfX@AC54lA-Zf?rLH>9>Q|=jdtc2 z1(y2OVwn>o>yE{{18bn&f;@wFJFC!H%B`?8;Ev}!tnPN}^8BzT1_t;mwM#;fD zNOiZ*miI}y0rAnQs-L)T+m5(>HeqQIF-+|eLtkRuXj|$-yER2E3(F~|ybrN%a>~(q^1TH^ zk7Z%?wewiJq0h0L{!uR2c&&C_T)*Vd2vSbOnuHx#36yab?Wb5;EbJW)(yP`vXMr;& zsaVeFsW-c@Gz!jcy@aKu<%lEj=6dVw=5Vm#eH5@Kc_yjO6lDOJ zl!I96tW#~&2Ir%d6Tn!kfwreQ^gLEeYe$RZKwzVlzcn11veD-o+0r06)Z~6|GjZ_>sj;OXj{x>yxl0kx3R|5nJ7d?Yz|u6|iPe%8oV;iL&H4fB2D^0~ zBG+y67N6o=i{ik*4f9xfng6@jUEq&Ry9E^+kgWh@=S+$OA~%ua8|=r*z6PAh*`IJ6E?v&4mxaXOEcY{d;t z4qW}1HD-4>_~&C}Tba9)gEu^GFMLv~Nez=0D)xl8)U;o&!P3gLFR!6otX5d1>`%JS zU^TY~?>s36uTxw9F6(U5aB%c4duph6e?e;4Znv$_^Q4lgg{w15{txN4wKJR;?7W9% zsyG76_gG_|Db2*BbLwI8<_G&Abrxy<32Um9gD}|Jds^$r?i|tCDonM97oJq+*4Nm{x-R_ zeD+_|e15n#5MK%O5(hzj5C9EbZVZ!t(I zxe?^CD(w0?x_;K6 zYdp}fO#oMb*+9+C1InKdG<*wzUSjEsfXXd)c_~~DaMs%|vC3@(s*eNC=4~#siF0iS zww7HXJH~#A)c_mDW;Tia`fpeP?E*Exn?UR01Sk$Z0D2X2uG7GWj_&&_R)rq}1@wu_ zpSt`Rte05%pUdDSR=F>M0{9x}^*@;Q?N`wZRdfz$=)ME8&%5@IuwG*6Kgr-#l%@X+ z#J>Q&#Ii5Ad=XY)xqtAcmsk!1JhA z9a`Ym_&bUJl@-fEHz2VpSPX~Y6|e$c3u{emf^`r*2J7|r?C!t6clh5bD9qPXJ>fPe zR&tliyItNRk(XG>z4rJk;R^d;?aKpjDfo!I{vTOYyzJIflofF9D`cp_*Ifs3E$s8K zR_{fa|9rpd&1EHj<4tql!KB>`%cR7|zIEWNmEi>CCmr6pB4~OM2%C$$ssxZs7C%}4%)w9Vi&w#b+^I(n0Vpy;LhVAwL z-#B^|D!^qlpdmDFLt=Gc6)b6us~2Sje4p#L!Oe%A{Z~Y=d$Jh^71$1I7wmQmh^0T} z+F}LtjB6KV1@x?|i`kY z*A^@PHP;qvpUW4A;XhAupFzQKV~&r+Aw)nI8gT)QT$9$qEUW%<=}ZLxaX zz_rE7Z|K_piRIVG_GA4ip>&*EP%MXd*A}axrmo)1)y48_4ohm~+6gjviItz|+C^E5 zHd*;v|7~4||HKL)>{i&`^%qO;=<1zZy(mk%*42x$PQ;$*_Wn~sFR?1@4eN72DlEq_ zF#q{7_2#mAFcDil%y#v^Vr5O{P5#qe{~0ddT8#GPFpD?wY`wXx*kA<{NB}nfK|~?uqwI; z^Plf`-c59P?S|c6uKPBx%ov|`B%946=79e*|lR_j)nQp zSIgzPu*zKpYvdZi++FATl3bx3to?ostgBcrnE!k?@TLa(%lI2s#W#{K9^mpom-Xvf z>4RZ4d^5~{z7f2Y*ZQCA3e%VV2#vVm*>N3=uTL>XE`jt z6|i1n<*$*g{ilQ+?uFIUb;`JmmA~HA#TuyxT>s6kF4kP{faU+NtBd9TglmhHzYDha zzY=PA4;%%*0PDu%6=yM#*LfhVGMFrBT=${8Ydf=l|zfAio+ z=Sk5AJeanv1L~g#J^wuD`LCV`Y0>C`kZ#HTdC>FEgPy;7Af$ulp9ekvJm@Ltn11 zUqo3^U#0j%)}XHjSV><-S^Kd{S)s27Sf{ZvzfSQ-S*^bxV68eGWv%-@#b4GsgVps+ zl-1*h6#o_0>K_JJ7qBj2Rj|7KIKbL^Hp=RMCdFUL+IVJwHSnt_YsZf%{wmf*@*=;E zvWEVY;*YVm{WQSZixu^AiocpQ=;r}e`Z-$1s&0jT8DK?!L+ih!_-k7GunuEYzmVdu zZDm{-U`_ir$~uNs$BMZ)z-sValr{5WivKF>2-XR#xL;HJ^{wf@(!cXj)+wxpR>R-u z-}m(Ww-kS4>m=4`taiVr_~WdFztg`TqO5aRO{~_J=--d@_EL(!nRN#10#=VdQv5Bf z)ql{xpXe=CE34a|^zUc-_h*Vf(YlBg`AgJ_q5c$q>lNGl^zWA_6XnNDHiP`w=@+8R ze%b9zD1aS(G0J2Hu-lt`vJYcdFNWRGWE8`m_G^?mCi@x_6M@~}wu&x5aL~};M1qnSWBIKCW6%n?ULbxPhvguX{VPI*59hDHK znu`)5qY#ExMwo84RYuq=A*u?(t!7Xag!D29`z6dYp=gBYvIv>c2)SmTgu@c5#~{o$ z88Hac${`$+FxSLXMQCsZ!py1&^UM(mCnUsGL%73CuZFOoJi;jn3r)jVgro`xOJWi3 zG$$pTme8&`!VM@o2V42l55w=!FxFlhP z=~fG2U=@TNwGfQCC?PT$VQ6iH)n;35guN1?u0*)k47w5_JqBUFgmorV2O+wuzl<4Q z$KTz5pV=qja8*32*TrL_$*7Akts25H3HO_rs}LH*BFwxB;X!jm!U+j+^$@n0>Gcp6 zR7W@^VVh}KA0ep*!jk$3+s#P{rzNy&fUv_XY=E$;Cc-%hkC@gC5xUkwSl19?r#U0x zf`lH85FR(H8zF41jc`fAF4L{Ce}I3t*(lm$E{gV=K37Bg%r?=J#vcbgWd=bey)H%f z$5C{@3B@BsUxknvkMNAyC*iP!>P-+1nv5n0)9N7{lkmKWX^POGKElkV2#3rO2`41P zHA8sGOmBv;paH@u2}exB<_Jj*5tcMZIBHHxI4z-F3xs24VGH7W)qE^^&9rU_9XEH2 zUN>h%ZAWUn9a7@CdCMFr7L34ze$^MkU=RWgt zvj4`w7d~@kTlh<#nIS&yGjE8`_)MdA@L8XkBmT-~-V=ZAGtI;BIiFc1{>EoM5r6A5 zZQ8@%`OH1y^FDJ{{Jqa~>Hz=XGizY8HIWD|bs&PDe5QLxlz~YoJ36BL;xoTWiENEB zv=hojpULlpvR6vfH7LLN%;0NK(%YcymvYHxN_IwxPDaV>jPj??Jc;7>nJcbkK>a2| z6fg%x#Z1g~P=uK%3YsI3Inj=?aa|aw5@vcAgau)QQxZa^VONBt_6SS5B9t;GC7hPf zt{Xy>S=bF>RR>b%B$PF+yCZb%h_J3Z!WHHWg1@}!m;zNWt3?$Jw;u!il}xwmp~_~X zsEWBLiZ*?EKrv<;WcGHZqNtu!RLuT@hyXLAc5sk#IsnTwjFxW_n+Q1>F!%NoZ&q-hhzQ9bw50 z2#w821pn2hSwASwEQHJ|4aK>BWH&Lb`=d8CcZ-^tGot3EBoENn+-3Cx} zU{8wf7(mfPb5TNMFNC235n7vV0}=L0h#G{DYz7TNNbilXUqU+*8jKL#2O)DXLVL4M z!eI&3hahw`8AA}J^+h-);TjWj6GDR<5N6(laIHCl;J?n)9tw3a(?wm)>!NO^;V`JX znJr2&Cq>trW;a7U%tBF5^RcLxX?+XTb{#;q>u#aiKIV*s3le&yBHUnBry^_}h;T_l zf75L^!oWcYJBA|+Fc&364n`O{0%4HZHUeR3^CNjNN_`Y41{lQ9Zm+E9dJ5=NMq(FhHOA zm}x>25TZvTWKKZHHTxtSmQZ~n!fcZ<5n)<7!Z8VRO-wdIgA9b3*$DH@5eX+G#N{B| zVW#IGEEt1uO2R_Za1uh&ScD~$5biW5C7hPfZZg6Wvv4xPs&NSCB-~|MPeJIKiLh=8 z!rkVKgbNaSOhvHF>Zu4@$0J;lu)=hkhA=P-VaGHCV=hXFoPaQNI>KtRZ92kU2~jf; z?lpsEAf!)3*e_w73EheiosE!rE5dzdpM=8_s^5mN(PZ3)Ff9k+n1uUH%uIv^lMrUk zM0n5~k#Isn+$@AGX8J6I1(Oj@N!Vr@<{~6bL0FQDu-%-La9TpUJcJ!)VIIP&sR-vJ zJYrhUM(8>XVcl$mo#u>$3le(FL3rG(o`bM;I>IFhyG*ya2m@yz?3jzN$6S;Uc`L%u z+Y$DeZMP%ry_H*}GV{1adddu%hmd|79{cCvvEPK|BSgX#5^Co5iLW5j{nF|mOnIjTTNQhgA@RFIn5MeOv0xo#zJVY2w|qhHTQGBdD-GBd_qdxa+ELqX2x=q z1$UyHl5)mx8m&M{T8y$}1*cpmbe|vd*BK z_nWg)E=cLI3grjCS+fdd>s=_9r2OPJ-B+UwT!yk^HOeo3^Q)A|yHSR&LAmHR`D;-2 zN{PA`d@oA+Jt+I7T=JWeYf+*tl+3j#fBManQVvV0zK+50n~ZfDo#hC}Bos3- z>oqzn5N57N2$~}jPDqHm521vaejmbul?bOKgiON?2uTKE$p(Z{=A?wv654GYRkKru8O-uB#E&Z9=%hoRM%rLXZ0qDwx&xBWzuRa7jWX)9nF-f%hWpcmSb_ zxhNrWEyB0v;`r0JwoOdgqmibgu@c5Z$+qW zGPWX2yAR=*ggPc>8$yE(2s5`KTxE_(I3Xb}AECaPo{z9#Bf=>O4Nb%C2uYg|mTX68 zY)(ozEuq~*2ytfNLkO$xM>r>;iD|t9q3Z((>vkYCGiM}RkkI2{gcfG?!w6d+M7SiO zmFe~f!obZ4J03wuG#4dAZb2COC_-zq?NNli5~6k@B%47y5z@CJ?3d8agdRhP-iDC* z7(#oqPr_jd)gMRbXfhs0n3j)l>~X(kZKxL!wT?e>mFMeQkHArTn!V#M6_9S$?)66o z7nVdcA0PDJAZ_R(Z$RyPxvFaW!!PlU#;@ZarUnb^7Lm`{t@93 zY2$ppEpg_9gZ?+7ynmN_Su?)LuKI4Z+i3f|KQeG<3;Areh3^o8xAA*4yV3U2qGs{) zvuXsm8ji8cI?Yz)A9!eD<#mpgSIrR=;`?%WBgSRK>wiU{D7=4w9nC!YiU0JT-tYKN z`t3?Dc60vW&4NnrcPg!=O69jaD8D_oz3N{Z2=1H6_cGM`1 z!io6!6aF4{#HPqtjZyuk+($%GP@c%J`Kh1=bC%PYdi+}xO$=3Bu>11BC;nAgp>}GX zDB7C|0|IT$Yl8zpzLfLFpUz8J4e`*Qw)Cw%y=3cQz6!D)?AO&8vZWu?ir^KGpmH*o zxLOle)0cvlx>{3L)0gowr0GjR%@Fy|{^nkN)xxWV>!>fwU1ux&49V3LTvu0X<(5@& z`qG_V{2bN}M&FzN+^sLk)%3l}v#zG!LD;`O(Kr6|(;&UtxQ_bWQvgi?B)eK!()yK{ z0%+@M`jO3_uBP!-HTvf8Hqv^9U5$O_d)jTIy{lDF|Gl3cb#O)fO7dCPv7@V1Li4`y z-^tY~qj^6)xyIG1s4Qu{I=fml>4T(I$F;DgO}~LULb{5^zpE=&Mbys&R3HUb3~WB% z3$Av(tHrv0s-%ajRd@ZQ^>nowq+cYhdV9HAO;=MLy`^dBAJus9`mw9Y9~{`6t1nT$ z1>OewqNTo+xfkpMPlBhw(_lY10G0@?**K^B+*CPpwNIVAd0K|jzR+z1AO!Qdt^6xjG=badg_hzfFO! z2R%Sfz_0f88-M+y9{Q&j^gDX}4qX4DfUgdy3$6nCfu4Q^sIB@gH~|iU7XfFyPe07d z-GK52JxT~Xbh?X{e8YN$YP50b2ELDp$v9e za0Li~k{}9{0Q&avTKynWf3{i$Rs(%^S%1i@2kL_cpdnZY^zHx2@Dwl=OauB>cRXkY znu8XgC1?c_Kq9CC^zHI8pe!f}N`cYTmtKr7^=6RJ&(PigZ-TeL+u$AWE;s>Bns%vy zDrR76AU5|)?9<>3(CPLS_!^u8-+*s{4!E1a2rwF?gK;1ej0ag@0+LX=+yZI?eN#FP z#DgZFDQE_GV&~JBwci8pgAc%m;3J@4i#`lL0v-qYsnapgK|f*8PgC@JmPDKq1k$a5 ze$*2Ss)H(^Jg5L3$7d3(A9&0Mi@=>=F}MpX1NVUCU=6qztOe`9dawa(1e-wa7T&gk zZ6F_P2M>WA;9>9xcoaMbl8O8@te-O|@VDr}7N84OK9~gtfPp|)*94%eXI)SqR0X<_ z>5Gc`S?nCm|6CHc16|A>1e?JYuoY|r`CvPE2Fb+%r z*?_w`{nMMi$zTeY24;X;!EKuVR1(9%2rv>Pf!3foXaQP+Cul_9v)8x(^|Q1jZ2e}c z28af~g5SXFU>|r2bi!9xVO@1~mDN>MSJCT07odx0w_M(~gB?I$7`q2pU^!R;R)Rb* z8_WT7!R=rkm=Ep%3&29K2;x`3{r2iQx1 z{KPTWcQ1*xK%XeqgH>QP&~Ie_0J}kbD(FR_-k=ZY3v^TSG}sRg0Nv2&2Id)X7>vdz z9b|(WC_fDBAUz8hkO$`2S4;}(c1^cue}aFJp_`8Cpc{H|;0L;^DUS9GtRHzF0lGU1 z0^Jem2IzV4!e!|fu@3={Um`8k>c(4;dY`ySH!oM_YOCl5R9i=PyH^2i9UZ%MU~Qi= zK)<&h4m1VJfdw=rnwo`R8PIf91-h+U0`3Hhz&xNkF5N}x4y`hvzv`PwP76fkmcY<0 zwgN-+xp(;Xy^8D#;0jO2hs0$i`209P8h}t(C^fz6oCBWXy1-Xf*e$l3VY6SQq(#9~axWK(+C|d}u&CV`+Z*y8q%}2zKsJ~NCV(4278nQmgB!tU&<~6PX`26=NsI&| zKwqHC@Nkd{ZUMu9F3Y{a5HJwv^4$mY0zH9Oxys8=x*C_R#-z(%d7iHHK+V6R9t_m5 zGUY5yfhp}ZC`}bAFjc0Wj0G7W9gG2)U_6ko>ies}rl3y(lfhKl=c?rFfLq}iU?z}0 z9pr(zU?Erl=7T$2Xgg`Y%l7hONH2Eb<==%}G_ATkJ6DB^3bKCykAMfk1K=pQ9~=Sa z!FOOASO*NyD69l)z$&mB+zZx%tw8mt{3fsw+y_){z52PqHN3_)I~jJb)Y~m?{&rXm z<^u})9s-{Nl~aHUP8B~4b^x!@!=&Y_vMQ&JsST$rnRA>YE2)qYQf)n6fGjVL7X2;h^z6y?k z_rbrwDewXK5PS^OY0ZM-QhT2PRjUE{*0dfMsFwRB$uGd?;2WSZmaEtcNvq;}km_gi zgPVaqja&md0o^V)1PwraP#4qzSAyC=E3+0{6Vw2)K>vnKRo!`(B@qQmgGf*U1VIES z26WN?kqQ*I#!rE51nS$L;1}={&^Z1KE`Z;`Z{SyO5nKYECic>Q*gKjARDlY5y$_%% z?b(0TSkYiKVh4cybf=epmm!*W#qf7AOi zl=B+%8hVDZ<7Qm21zTM6cjR(u&?&d{RCDdSDM zW>Wp=jE~!gGInFvA*e&wnvN3!6>>G3-ff?FF!n&u6?Ad)^l?4~bO*Xgz8>@kJwad4 z2lN8H!404v7yy)iBNzm30z<%1;Kj>W=Gp;2Lp*&GX1L(OGzvNi$NZk0j2}3h-qLdm;yec zg2}K(XA;N&IUoy+2ctn67zsv!u^v(}8r^;t9FDWrK-84d|2Et)S?qv)R~p zf`woXmao%*fOH{OJzodz1*^dtuoh@EHi3=c zKCl670S|)BU>n#9$`HUqu!dKGXvmdb25SU0dfu8+{v$wvX!<0V5A@Ce{7CZsuqr6>UFL)BjZ;$3*f*^;d z!83090KDH#D^Kt=`5Xkw_X1F3(xtrsDuYtk{ zo!)##-pk-qa0+|^UITA~kAZroMn3}T`3K;A@GtNlI0;UGcfmX0E$|A+eTg?Osw1Qo zz+s@_QG<&1P1imKzX4tc$AJQP706d*1o?|qMrqZlATMu69YoJ9aB>CP)`+N(D)8p^ zKc(fbQSllVOH*JUy1MF-tx;0G1LogrOb%W_vDdKXStD@6S+P;WzkcW2v7{DVpXV0loqRD9aKddRZr!2xu(&Hp`PDhoh_At&Xy{m642;q zIzF-wEav|LMny7yhIO!%B|QSJ0G9_>fO0MuZA^`;^72$9R;AG{dvjgX-wRl$V=ep? zOm#gHtmYO{L~2-%ePY2j(hq=|q-y}(oy+G+(zStno51x!15gjBa_Q3UcG=S#qp7^^ zts0WnW5e8d-r|5BfK8=<8q!~GyA&z>C}}m+66lYxUWL=pRYq4ouTnk7QUE)F{y5tl z6b({-%2&YDHQJ6?(MU{ytK*<+{e3`xd2I`lf&Spy3A~T45$OOvBHbPigLXh4PCCNU zls7KpTCyfo>9?1tYv)D_-3@uml@^;qRn%2_W4c$A{;+W%@Ytp2dt zUk3cMTE#b4+uuf*rnd*02O>(Ck+%n)NQj8EAJyd@D*edhE7w1DlDb+tQAUxYI=((J zYtPQl=Da~pbLwcx-A%~!oEL~rSQK)4_~4_X-<%)#qLW>=srs>+oEXZsyyb(P-|qjY zE;%h2EZTo8WY$tP_9;9nd4cA!AK}4&c{^kJ52{eS*)`O` zaBG;(giMY3^x?;l={rAgec)2aY?x1-#hIUIO8hph<+;44zgSC&X7RMk>Md#BQi(Pt zP2?T$H6=~kI|9*xuS=PSm%$fGnF+EZN}I(?si`jaPZg=@mD({Ks=t`o)sEkuyQI?Q zfIK^vHp3R;nT=;Go;io+eEHZT-6QNa?Vc_zZT?t<=g!jRBRm5ymNp$0!0(kdgBJvz zC}`8mzp9++y|}REf^u$5fd|W(hg6T}@3B{J&GM$=BF3#T2am>n;%6N{diLJkrQL{F z9i7XYGIvpf(^3py=6>}~%!%dAqYBjP(mhmAi3$?B{Br-h7i&7hShPzCTkxog#|uf_ zde-oNq3LCCG|&ghsYXub*cs=iJU-xPVb1&IO_-rA2%oU?)VkBX=7Aw@G?#VDR9zgX zT2ROxqu9R>@v`Ct)q11kjk0IIQpwa>!aSa#$5jYCwauSh+P(Y1vBJQ;QS((cOe9Jl~v;3qAjRTw`0{SR2Qq_XYRfTxRJDg^v9yoA0P9;4YEazaP*4ZPdK( zT;6Rj=>OaNzbWU;#@}Sde!}L{j=eU!U(L+}ljj8djqGEVd!fR8c6b^4&)u=6;@yEc z33XX8I$1*(UOPSH*_g%wKWB{niYG@$(9+u`RM?wy<&yz_f}7L2ntA2!z?wkkYJAa= z3VT#DYwux12URn>u@gqSb#|#c=l43DyAukhlKq(v_OMM$e4j;Pm;-1-6eRSiz76JdEnq~sglzf%4Dnr!wtPC_N*_uTuo2ZG3 z{a?*|w34>UUuohEcC{-_S9+7M?n?V}WZuQ7D|c1uu;IIae+f!CN~YFvqB(f~gEJ?0 zUGj6l-^v}`Ep^PJhPtTx@)4nP_J}ZI)y(WwffRM})m7}M>*_fH?JJf!GOp@J4cI8U z(l}R(z-p>%RNwSo%@yY_Jl%umF?yskZ7_)r|N4 zhURPR*kcWy60d!^@8AbrX2jatvqgNfroNJmOszGPaM|=-6KE-;%vy@=r-N*m!e`Jm%w}6R+jA=w&}o9r9SA$GUj4VFx3{f;hYmuGqx_7MA4WC%IU58R-lkEAjZ-o+=Gi~M92j(B|_Tzn@bKjwR9`^H|re@Z9>hR+C z;yv8dydwQnQ}f*u@R_D7@1x1znwsPHVa{u2ddl{SdELIMh3T+~e9zCDGItJ4>;|T6 zP)k$pew^sfvs>x$XyVYu-u(OHFTFW&=}dR(7*(&DKr0h}0MG8M=O{ea#!g?^E&A(A zg=6Cd;*GmI-cH=nfdQ?|LuztVD>Gpu?74g0{i&5XAl+@q3$36ZzsH#}+sJqO_g@6! zjffjiY?vcbp}*>{zjk-TEN-lH=cN^te$i!+bES?KY*n-lYB#T_p^_Q#yUoW<>&eb(Zh5i<_1+rWy*MbYrBf^`S@ zRdQ)-5SvR*hE#q6YX!Vfmu_yY_`^S&}@tM2&gUwp-tzi?pnGV+to8Fu0u=ma4 ztW~d-oweY4Q_deBb`G8Yd4oPoW5G?Dw_@CR{kuiW*m$1q%zH;b?EM{_yR+|Z`aY@l zsYmG)r<%P2E?;%-l$s4&n61l}Ucu7!s`r+MyPN)fs=dt1T8O=_qw^6V>$|C)D=+F- z%pEM|+*?jwv(8SBHXXJRi`CKG#5RasM{!-$qEG)3pK{ma7b%|T+-Pp^XqMrTa0n0G zjqUpU^uSO5*#1WZC#8MM@B5e>-3Qlt;k#ldnqAwcFz45f<^z?j)X5pBIc0v>dg_xm zo-FieLJn8Wybs&-Oz3z1nykW{o}J9q`9wAjkJ@-N>36F2>;LN1vCv~lCvyuP2|L_6 zZr!x5`?LWki+H?3PIbzDdd<>>hhFWmqOk0lPUhi!Zb5c;ah6H{TfYAD*JY_(V7VeP zi+m>UYJOMyIbEHRi5S?t-?8HPhwyM0(4nrTDOZHpa5v{HF1haG_iiuoDK`Yv!D(E0 z+IchU9SqEDho=KE=IHi7jJF)jAKL>}6aHcz5}Z$of3>IWMtmK*o1PCb4n4a&k(OW6 zJL}0iHx4F_W?Y$Bz&DYjD^Q)|vmOnmOsl7HNQ&33L{4|Jma?%6@X#(i{@Jpt2i2+k zQ=!M&?&i2^f6VphIBZX9UH`gg3q4+Ra~gLT+}eMnHvjy9S366s#tsfy?*Q~xv}YGt z#JUc~KGD;ejYpQ(?b@$a{z!Wy8B0D<^)la3Q^Js5&ZpV*S>JSyuC(}Hh1ZLTKYflu7pe|tA_dy@xy-dmXSOD}UkWlQyT+8-o78-xP3{XM=f$H&~DAoQy;m# z&QCm_@M>+*+mwEU$hzR6(I5Iq9noTV;4Ev4Sm~gT=emoYi=pbd84;^UvYeghj#MS zmF|gqqRf^X3Oz!7Ou0v?y;dKm{r9(2{xoIs_zwy_lE_in`@Wj+&d+t9K3tg7r;iz? zvZLLyr85s+xW3w%)5knS+1TB9Xa#>&!~bTVzAx-4 z^f=bXd?b$_T#xG8dvAF4w~W1o9^S#{9pm2W^Nv#QQu_Y$9EgMZnn!ms;OTu$)4hS_ z=J%cK$~HGRACGeOES((=)DE*Q6P+DCmmHm&-G+@mJ@@{Im+cj6UtaFM!Ce1X;QEA8 z{Tz=wjtu<0PMx;gAF?ZLkH0Ky-$_&U)yEjIzxVjd9IsuKH7y@^dei&yg5E^O{(VQh zLGfues_MOXfA_U!xEf?Lmm`@+5h%}u-MxqI_eQ1`HbCVw||vnW0gdjWa9 z@UE6#EdLLS=lcHn^WGA7C;jrWFYKqR8(QqW!<`G?!ScyJ-F*E$dYacXzB&ID?6%8_dnJv1XkFfP z;W|^8p6`E{FWc?F2$T0rp?mD55zamPb@_j8i{06&tR0kn%MluBUd1z^!bs<8aK2m5 zq4}lT&(#uX5#O3=YD|u6iGzBw4^8JLw}!p|Xcm@j^glcx0;^Q`#t$@12T zw_Lpw$UAumXW8?VbJvPyoWBE&Gv#04v0SNf=HV9td4UDvOw&Wex_q2-FPh%!=FLs6 zKDUB7bN?Q(ew>+wN1%G9c}$-1na;*fUbN}`=Cv;##M8Z@Psv>QA`{eMymQg}dHl*b z6-#ceU*&HoP{`@MB@`Gk5CmwhBqzT}6K?C&Y( z4Vi3~9$}$QpX@C1j~D!F($1bQN7}vNmY;8okW-E&oHpys)a*eYZy|@V)zEC3Y~H7A z>_d3ygl^Y!!u0C%o@GamKM~ZTXQ(5}i*Cb*7k#M+2h*2~*5%N2%=EDQ4wSCZhio^RoDs zDdrDx#uU^16?oDVGfF&XidiGxGR3_53gsT3Vm>-gOHb2MS;DPUZs$`o?i#;}mh?%V zi90&Q#2&-rZ9GciQT@t~>pUB}k~`&LI`$ci52u*k@<^TPcntQh{nvHB+&2La_tV&? zQ%$W`Ig{5O3sj9ghntR$y&dj*HO2SzPj*xKi%m!O;A?E?Ub*JI z*U+88t7O_84^$5f&NVk34~&X^I?t&tvtfgRq_-T~UT-HBIrk8~cDz3I+`BQY3gcr8HoV0cymhCu zfx?T;;xp8E{bEz@JllmXj96?U-=?x#7n`$*y?&PT_@a}##JU* zH{CG(o5Hf6FE*v$2{a0PyVxYX6Q~vVeX$vgU9!>==i%S7CFY~g=+x>Zro*Rj{t|QG z6L{AW^XLiqxh1CQhjf-racqex_by?)N72dzS||6qhCh5=O9y&0=i2xkIaiSLXsP!y zr_I~_COPhm`j?tvlnpq|RjSD(@4`6>=dT}Wx3S``{tfJEbTi}YvD7>y=TDZJc*XGT zQuC2)Hx^U&1gqT3^wh zs(q7}Jk`Mszz$8FuM{K}oR?}`{`W$&mzlhi49{zKI}K<5vHjO~K3RN~U9Ekp{C$I$ z%|h(o52V}5e+d5ddra^53L>s#a^GXL-0@Gi*K+#Y`OxpJ+aH~{sIbqElcUSTcX>y9 zH>!7Wjhn*|ylR<;KcGT)?t)yOKeJ4&f6>>UDWt>t+{n+){Jh}S>)pOG$id~#NAY1j zKf2*ep9UT6oMt*Xosq0mlbU03(n=~DvHp{ro5wm!-aY}EFEg10r2JS93(G5G1FL^CDi{EEMk6Lb? zeV;zxw%mMh7M{1FIik7GT5igmVtw^k>TK6*r*~TO)WK_`oDS-tpf>^QsDtw& z_HXtJgOtDAETgW3r`$+yy}wuY)Q4Z;$%cI+#7caboJvHx_4{de3|w8CCmQ7N;EZb> zk*Vx2c<6+VuJ>i_50|AZ>9DV}}di3U@Hv7ea75~J-aU(J|I4KT@})QqV~ z5|3!XND`38=2A{Aw3wbt+Fy9i&ZXnE2IW&3ER7=> zBW$B~P!9B`%eC-DBOy751)po)d7Sy)8{p(nobx104+Zl*+=3qE$(Ts2dfItVKZ{(p zY&z_f_}Z>6V$NesWH(~@`tK`OoA^qZm`6TWF`!~~5Pq&Bk?jlL>I-++22I!+>QFi3 zV9VqS7lbCmaFcm0Rj_s*)~J1mC&2nU=kxWVeB!=irR#!1g<9ytU@-@!3h&TjP`4XU zq%}2oe>XP|;jN7PxRaT+G)SmCCL^Ah>ocE2f)tWkc%fwai^?X zN+5%F^p*{xjh(dFx%>$C-nS#}9El2Jhjx#2xChhI&d{t6FJ*o)U4^r2g#hXfpj}Fy z@7-%t>=Iqs5$tA5Vlh2_8xn66a~kw?neuYPqUr!h;JyHh696&%Hg+ry6%%rPv(`Sl z)aNej&o@TQY%im8Bb359co2KK@1&$gm?y^G_8br%>o zuz~$U&;lc#sN~q_xD;fm;pu6`ZUxP5CaElTueL%3Z962{%q;(NSkaQNPG7}PuxkTD zeI2Y;s)U4rAt&0*CJpOjrB#31Fqlc-ER)?;lu|t_lsjyELyyAmDTDog-Njwt5}qss z^b4)~;-vwDnKz1U!4{M-QXf?HS<+97Ew3o1>$}K$PYKXwrt)kdXVsnw1uZUl`t5B* z;c%=na&AG76=f9Mg85*bOdqr$1U68M2c9rpg)c%AWJuo%CBmdaH@sG$l6V&jYg> z#``2kC8b8;S3_H>f-k+3>BfEv!PJ>F#XS7R{gKlml2d(SlH=pPavi;*YUU@|7TlI# zf&DD!QQm8EPw!*pDaol0RcWphs%rXre1~$j8xa*yn6P@KV`QI52;k#TvY@WE(}}&u z9ug4ctb@S;W9H9TwSKI92dvB&z0A#zKIFCk{T;^yfS{eht)?rnpX=r5pgJ++&X&dJ z-fdex%O(Jb{%@R(tPZnIZ!5scQN-GJua z&#Esrm##6XbtY;UqxPbYRQ3C=NhuND$}YPP9#g{%6yspEqA$x;5pD1E=$hhFZaCX{yTrbd { diff --git a/src/session.ts b/src/session.ts index 90d3497..4694fd4 100644 --- a/src/session.ts +++ b/src/session.ts @@ -1,4 +1,5 @@ import { WebrtcProvider } from "y-webrtc"; +import { WebsocketProvider } from "y-websocket"; import * as Y from "yjs"; import { randomIshId } from "./utils"; @@ -36,18 +37,23 @@ export function getSessionFromURL(): Session { return new Session(room, password); } -export function getSignalingServerURL(): string { +// TODO: Make this configurable. +export function getServerURL(): string { const url = new URL(window.location.href); url.port = "4444"; return `ws://${url.host}`; } +const MODE: "rtc" | "ws" = "ws"; + +export type Provider = WebsocketProvider | WebrtcProvider; + export class Session { room: string; password: string; doc: Y.Doc; text: Y.Text; - provider: WebrtcProvider; + provider: Provider; constructor(room: string, password: string) { this.room = room; @@ -55,12 +61,19 @@ export class Session { this.doc = new Y.Doc(); this.text = this.doc.getText(); - this.provider = new WebrtcProvider(room, this.doc, { - // TODO: Make configurable - signaling: [getSignalingServerURL()], - filterBcConns: false, - password: password, - }); + if (MODE == "ws") { + this.provider = new WebsocketProvider( + getServerURL(), + this.room, + this.doc, + ); + } else { + this.provider = new WebrtcProvider(room, this.doc, { + signaling: [getServerURL()], + filterBcConns: false, + password: password, + }); + } } contents(): string {