From 794b18bd6dd236dba92ac20775f0880ce886e17f Mon Sep 17 00:00:00 2001 From: April Hall Date: Sat, 4 Jan 2025 16:20:36 -0500 Subject: [PATCH] fix: Make webhooks functional in production mode, remove duplicate functions --- bun.lockb | Bin 150302 -> 187457 bytes package.json | 7 +++++-- prodServer.ts | 35 +++++++++++++++++++++++++++-------- src/lib/hooks.server.ts | 17 +---------------- src/lib/websocketConfig.ts | 20 ++++++++++++++++++++ svelte.config.js | 2 +- vite.config.ts | 23 ++++------------------- 7 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 src/lib/websocketConfig.ts diff --git a/bun.lockb b/bun.lockb index 84d43ba57ae60e79b984948e8ac252daecac469d..e3f4784a5fc4231b5b1e8131188ff090d959e8a4 100755 GIT binary patch delta 51198 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

vA4ulf;fc$=| zkDeINlp|P9#A=FwP%@r!X-U!0VOKwpwV_}40STn}pz|+|xr6JEsV_qqI41!GLFlWd zY2l8KC;cuX$Sa+-Qturo+^(&?S<};!K$zz zs@Ey=m-9wFE6cdi6a4{^gVwA%AN*4GJB>NS$Lk0n)Z;lh&05{;75hLIf=s4eS|$F` zd&IeSve+t)@R@lmWN5Y1VC~ZK@Ht-;%i185Wpdi5+Aulvp5O5GA)i(PF|Y}Tkp#@L zafK0Q&ABZ`ol<4$w(WWcDNgt8uD|@Me&BpA!qCAfFwJTHb~@Jp+z<}!3=$LFJL`&I?fT$T`} zXPXO!4~#v+B)Owa*F5&z*?&G6By>f3rhk28WcuCAi*s9i6Q&}A!`Ln+v@wnb2W7+H zmJ!Wog^wx^5|W<45*+^~0io#2we0%fsR0A;sj}H&?03j&r-Oq=>AlIx%R*oKtW4#2 zJ&eV?0qqPN6x{EYmkjh@HE^8Du?0vVkSU|P)r+WjbrIDYgNK$F&A~7>lVs0=gObgF z0fQFI2=dF4IA{$~1%w`03nq?V+~Cd12yQc(tob2~l|xorKV0G{{>2vKcQ!a%t+!ox z;VLMP1w$LC7#yHkHoWuRmt^Ho@iY+32Lr51S?7 zY|;gxWj!c}i#TLmEr`PKV)?;yY4q5IolBm;iTC~3NPZMGp23wmYvwz-&a?3!8t|Bl zbbwhva|H->R_nrU`PFa#@wM9E;3 zCfI_KKkwda6ns8H??4DKsNsS>BE`@zIIvV z@Yk~fa2UIwg~Typ^|#;l*?9SZ$}tc~D3Bgq-i|l?Ryj~bGW4v1Waokd1GM0m39Dwt ztv&yz%CQ3o24ukt=Uy7nf5^*-QN^2=^h~=E|1N?$;%-$s2{P_1;au zVu=-%3N4c=@R4#}Mxx{ZXKBigU19*1?6kj1>*7~{Py)F<_l9e4@_B!bU}sjZS(nJ} zLalZ$IA|ERt^Zu7c9B!CU4kuE+Lh6~o5(_o(1?rRpcK=p-kA2u?dO~m1@w9k;()+i&^i%~59%ommY+TeZ&|ec zv)){m?@%D%N+Byo_GCNX!uH#@MM9jI*pqcCMidT^#TFIqOZnsFODPbe%{3S^1_(7| z&8kkvo>{*2Cm`{X6U;qX=q@PQR4gQG^T0;4K-;rR8&`C&iWue9NcT&3;TgkPSSJhB}(hVNtC?8yRQyY`M; zTg$+`N2e{eNy{@BjBiYPvKE_AORrvRAgay!;fqx)lvNFi0{cIr?OA+w-Te!aMDKEtZEqg)Om@uz24*SB!rd>EU6pfYwCCPn()Us9_lKI$LGt>gCZ z1VT&kZ<>U*Z9F@I*8Jo}v`ijM;@08p4CzvI!Fz zV`Bc>Xu(1J-9W@5k6Oz}HUmlNFXCEGTSniRhiu7(c1q|=51l$?3DeIN1#A!VjI(Sc zdq62~??^UjFN})WDYWp&cOgo?dj)xqvRcN+z4xW);y(`*E<@EG|+$~r^VF@epQdlWuDKmYv3!OJN zg*DoZYefo6+6|opo|QuWi66`Mo)7Gv1xf6MQ!@*s`*D#M$Sit4;%ve=mW)Eib6)zWW@n_$6h6|cvGk_Z_sG{j z+STFtA&pdf>b=0eJs@;#l>CB}KkkobVI}a?m6ADuYqQ%J~LadP+@Q^7&C zy&5>)YJEjm3l4-AMOZeFKp<^fw6Km254bAJQZAjqj$!C%6EOvn?C_b^(yG1tX$gSE z1LdUXiR@m9(6!T{iBbl?j4NfY?@zy+v-Vm!-v*-fM2zOONvzL7q0R6Wlcd_VM&d5?bqyGO?(4 zV4(x|G)U6NoI1HaU}HT|cmXA})-EuyD%7i8hkNp=zR?fgbR8JvCkn5lgq{Wt3}S(Y z&>uePmuHMo;H2rZec0{rvW8)YVVOKRhNiL!BwGguB4|shgV>RMPi4+tedn2Et}JBs1aAY0m=~8zZ>PljmFyxS6XO3ZBfYbhY3~qhiDUG1tTZt*#Qcv5|T>`6<#Tj<9F^m!jGSE+*75X@w>@^DZo1goGGT(aA(#DL zhE>V%Dbn;YGj3PID`~T7?xt_Q`NYDkC(wj6nPXGl<4;A8t_}c)oLZ(#VH?3=oCl5| z*irmr@s@61|8bw|h@`gru}AtjE;sZs=%9esWA&FeinqZXPRv3`>lo?XTD zQ`pxh5&!b?UBn{2^C?Vt9;^rjQg+u)(;wE;T4S6oJ)at%ZRFePdtPH2|FaT!CJb0feId zl|M_?|JJ6Z4G1M7Xn$!si+T?p^|f`S$Ae~!&#fy7!PeCb$oky6k~pw+wTHC(+PacB zd~IDx2)3>skgTt*D~ZF`)|G@{>uTs3SmtZ%O5(uQRRK7BZe2+nzP7F;1Y1`XB(TCrYcAtI7IbyK6M_Hh2i^y1E z{%1w1_WqG9=^SKz_92(G%CcvFE(n>iDP_4TTM)?>KvwIs54kM*u#B|(>_g6R0@_=_ zGV7$`KR;S}7z;YZXV)TGv-6Nue${V(<5IxPxkDL7Bp#^fTf=$tq}&p_EN$9}bsO;* z|1wHwnN~QDjfbqZ2=@WFf7uWfa`Mqf!uU9s<}f}5x1n{yTjvGC@P~Dk&X;tZ!H zipUiU`N8ah!AnbS+`K&J-=g3~NlSW?4X%gf&yj`fENL>@+3y#G{^F^HtY5ics28vZ z+lQQsEiV_MJDq|QeT9I@flq2Hi{ET*Dt+YjK%wDcX%fXrvM@&c2Ae zI%_ejr2A!ynO}v_Ra~=}#Z(AwIxWSzgR-geCnzHQEP+ooyq^~+ltN=5korrQwL&li zmo1UjAv2bq7~7yMbe$;dLkTSx+3JfzFuPKLU)uh*Oj7qq;{Lt8CKui$XVFqtuW7Md z8aDGIY->jEN&g0jyn>AYLK9EVcSDL6#U|4hAx;TVHg?#p*4!MN{I=d06tKDPQXp~I zv_z`Mo+=N4cI6S9ptB#=5KF3J>x6UlN#r>^zCJL}H$P7soxh2H`~_QoFUxN?uU z`8R&7g+F;8fnRB5*Z-qatNwMo&2C;1UlP9q8A9Hw|DSfD`k%8{-Vq_hZJ@2y+SUaL zC%{b3+!8HWmoz~vz51O$J>tvLOW_I$Iq6QmZNGJN0uTx&ENy)(E@=t{@^C%wH=%|$ zt9`bW&+ZQk{iO``kmiGxQd?90VQMz{;Ql$X*+6QU-LS@PmRKri-48E7X-|`aw629` z?Ek5~RWQuAU-^Pe(6A1d1a0HM{+LAYud=_$23!()v$>aq7_lmW9l0cQ5I-KvK9R5Y zaeZpjIB5-VBW3!g=XQj)-Hm%%MbB!T((KQmxSL0DABg++5+;u7Jtgs)W`Lx9`wi*Z zs8?=$QmCE`HZ}dvKU+=?=Svm$;=< z);gTFG%6JpX&6mO({{Wsj0knkux?SCa;fdQnX@$$*r0xHw1>OvNe33 zg^I0SoKnR(Icdf?t66EeROqlc)26686{ER0yK_?rVD3+a2Cck>vMo7IQpK8I5!$gy zv0{T5xoZ>zed$|7hk--Ky4i?Ng+cYCk9}js&QUtAsy*br%4@_W8Lu{Y$at0el#!kB zkc?bjOUBEq9x`6#wPd`y$3w=e+)JjL&a<06L_CXYB;deEw&62D>*2+&ayRgR@=zf8 zgO}FGlLr-k-rW!J^HMMV$eLa<#(A(SU1W@_gFDvXgFDtxi(4I49^7hSEpEm4UY4kZ zwYU|pdvU9UUfi8^HCe&KkeaeuypnI>D-Yh9vRb?~`N)H}rp$}ClTOKH9;`}HEl#O6 zua+rAJ~_R5L*n%43)4qJ2s?IFXmn`bW#LyGFOq(wLS{&xbXaH7bVYgDmWC9LQ{Xuc zdtScIl%DROgM&JLj1p(m(@Z!&p5@B6X1QEBInQXwv{Ha{o|5B9;NVx4_uovl0UM_Dxq_0hkBFvpEFAz{VD!=lLO2`#2WD0p z9Vqu0D>c2|vSxS@gEG`u0XBu2%jbHzMt=63`m}Q({VoJ$NQ2HS9*yL6w($?4Sv~&S z5gs1ww<|&;w(Nlr7C;Bz!A}=dYvkP#KtENX8gW5kJQHHYj;)oG(EyZ>0AqQ0wyrUb z#1up2W`9cp0`{BsSl9O?gExRun~!3M2IrPX!HW|yoF>8EBajM*w!O+khq#h zSj;10L|2b|1lZ#a8t7*v)c+P}o}y#TKM_LWrO#IUfkCjVH*hA>UL0{JJrPPf;fBy& zp|Lcw9Xy3mzCEbm?IOQh%}tdjXpmPm&a(XUHG zlC>2Ei0y6at(hXz^A;6TmVpe+lhb+XWOJHJXR$eRaP?xgTAbbm*`^#XhN))Li)_|^ zgbqU=Dh6xqx``Xb)brBplV-A7aZo+imY!)Q3tSFZVM(J^sWz;pO=hdkhcXoL_+VvW zVuSXw^{CPA)f{TC6yk2LD!}M<4?Y8aW(B`UHsN7FXUfU3=IgS|)*Lf_Ddog8gUHA9 z<-m%@;mSveT$jmZ&vs_y+R|vc(czD3^5*bq3x|Gn&iw3DyEVX>O%t2i$XWG8ZG?9j zb!@E?Y5?zcHZ4SK%dT}1+p(h|V!!sPW|H!_tC46-rdbmbjC4oo1;S&*$o(#KVs>zX# zF`YwesVHXZCbn-Y-%O^Ss`(595_o2ATO$Ox<}=2-fp>g!`PY2_uw3vy;)9}=zpkQs2JHbjUL&d%9L)( zaiO#6R>yxQ$3vixw2Km*W6jOPb9b6OJKJuX?5tHh8Ee2=MO+UiExUD!nH7C1Xj$dA zLIby~#}h^6K1y}c1{j5*w`M*c^r5`zjF$CVoVsj#dal)sounSvYnw4cIt+v>Z6L+a z62X}m4R*G0fY`ic4L_=``OG`C@H!@NSt~&K6MDvg*r18`(zk;D(~`N|kQ(EqX^OsT zj%d<^TBsV3`-W(T&u=+~w&hc8e(&13EXVhB6lL~O@{+JjTt(+W0!*w4`k{fnMdh2l}{ z!P5EqxuJmri$o7c0rMBDd_~kz&43~C-RpwdqazaK77rsV{2H?Hx3qnK4 z&s6;bNCWi3g5r`I)o;Lt+xV9UHxdLl*f)Ws`~+2AaZvOhRk;(=74hpJT_CwC zr>U|)m4j5-U6qllY@y1Akd2Z40aZ#6$}4_V0u?`~ayKNo`U6!iQRQo@EK_AsL2hno zp&+z$2VgI#@)TO*2Ynl)FXUoKZ^%iIEg*-e(j?1rcpd>SL`bSU4>yqhHDq(hwW^#A zNn@l)mHky257`X74`fqFJ4g@6M{pPFT5%RVM`PnKB=t;AajrGLL=aL?JNt4F8xWwu zl$$d?A2z}&ihy3F%Ege>#UpZZ3PY^LLIQO3QbnZ7FGcf7ms%<5ZbOHcD_SF-hLi+} zs0wRw$f(?c;X;YOVt3C6{--fz9hF~Dlp_e&K#)Gtnm-~0zFpT^(U+;RFeJAi+fssB za7UiHKpTdv^N#7u)NZLboy<-`QV#`%DaBjH$ki1-flfWS43e@hEwYA;!F(<( z%`eL?7?Cp>#n2G7s>P>3(ugrZQhtvk6sg9SR|KmGd?Bf4ogv9#Nl{8W#}tQ@S@LoP zOVOx8OHpx7B6wytz*QWBB!i`~%H+8iqfCzJ&@qoHc0i|$|2)LJ$XSFm8uC=CMzD*5@=&MA1$B?m?5!%RkTV~ zde$D2R;5{x#NSC#h6c8hg52>r!nri1$B#f#1@}Qxk714!Ou$@g))Nh()#>MsN(Q?? zkin18N$!TEIa&ot6_5uoT==mXKdQHqaUuB|S6}EfnN}m7TD(ZL8)Gf8Qv8TqW%9iW zo+^|*x?pU%b%dp8R$rySGmz9*MLCucBdkS*mi)3jO9^)LqEVDyn1F=T1v?QY7Z;Du z$t}TR(zL%)paUfFPcsy|TacvZ6c~FOOL~lYE-Qz z+?2tNH|SqJe2CH@Axp_eTb#5-EM1L{ha^Y+D~AQB@gq=X6WC=!l7kvs6vvmV@(d)c zI!VLj>XcWQ5Fo>x;^C#%+!4ZGyOm>X{%J4&zuwA=(IV=B*DwI6=juTx`5!fi#^(Ry z!^yvGP!{#YzdD>?GRZ9~8>cL1`H<9A!y&1~Nvhmar1UwCZkAljh@4H(4TxV}#3~)U z%HJqa=2k8wHtmX*$d;mMpQ1TO%T`g&MBy}a8llD3B7_8?q@cu-Yb`FxE23kjAS{@m z#AhPb33lBeX-JO98E?rg%@MK-3dUMtryV*m>S-uCRZwO$1**T9=P}{J@*}K=zAx2BA8e*Qr?EOvpr;;F~q6~@kZe^5`>#<6IlQgFutM)hPj?@!`IJUoK zycA@^l3SZ}r8Yzu{NtrVHmtg}Nou5H_5mh+Z=E27Arn!~WU7u;2AFi4K*q3Hq4Cmn zSOuCSqb*B@D7Iyl5FgsIYKV)r%)X6D3a-zRA@b_8N{DyrvucR5^_hK;NpiPi_VFfZ ziJm1xJkztvc$0oGJdW*9DN?@-8g}i9daNqcsQ(cfw!jJ-b}-Z^HE+Nw6HIywMgUf6 zBsdsk)USj_CaCem7&|CRYNtS>-Uma33?)jf&xWSN9rQ9vD;hF;lS%&!B=$fu2{%fe z46M>*(sjnpna*aJ;&oLBrOKgGHK9OEErlzs3GGHGS+;9{anVB#^{ojlt_l586AHqx zSL}*wLfdLW^)RZG*c61iDRrp{9jOU5chO?A5$Yn_y;l>uS`%vPs>K#-A?YhuR@ud* z>w$BCmCfoBuiID?YU&{fqu8wO2{s7iu(TvOV3Do5Hx-1Ta_HTfkPbVf!i_*^h#b4S zCgkO*aW5h?NRB;R6AEuG2$?chSrhuDCY0bM2xewL1rW%P%`PF-R}RJF6cf+Vg5&k$ z5lTTf+Oet-qdw7F84@~H6=0O6d$Z(Zla%4hDw9q69lr3a+~K{0jXGO=!U<#h+r&%J zek?h~q%Q)IfM|JaNgMoFb&5&4WX|3X=^(|R7q8qkS zk_t51bUmPTVTQ1H{p$#IKr$QV^&!O+s7A$O!%3k?fbdc0IW zm{s>R>EnVGZ=#y;+B9gicA%QbXgjoCN>Vhz5F!W>vWD)`w}(d6tk0<5Ux$WSgV4ayr{$cfMkAq-!USBMvK~3jjj@9Zm67I@YLv!>G5Y}~{dXV-%O#?NbZx@X9vYqc7Z8e4@@Zq#Z-7Q+ zV5N^RO23A)r3}9=(2UR=%mjAbgbwjVzUoWSSa>F`jOeF2=KD3nnP~lG-NsiGCzBI0!9uf*)5w!#|8Y^5YEz z$?+KcG|>{3boFH~ltQC)s08|X4Kx}(I(aj`n8=c|O}bbxU6~;(URQ}w2Q~}K-!X)! zen{qT)VF9a2>3^}#qh{#&nicl^i^QsR9d{+Vqb+uWPyG)N zqG*f(IQ9bZa(*;!{NR>kS;LUjPlkqpj%C3q$f&ynt)D!K61plK4EH0=9B7n-JSwIA zU0J2oq;HEFqmyVwL0^u6MnemYZG}|`8dj97cgjBY0&TG#ujs;`QqgBHv;D1R5n%Dyz;n zNvl$seSt}LH-W52 zQH@4fu7ySg=;YQNg+>c4HeKvBff+PSsgEiU!eU5#p;6xoPNRCuUX-%?Gy4f9{W~CO z7gic`9U2V>Wf=)EE87uTk#5uvg%&L*r&I8o(88dhrdVRWghs89CxuQw0PU6c(5?fR zeVIu&8$>tRlRqLv$&h7Bqs}H1t)K-(ipXU4FPQYhL6C3IX>jzSS`A%z2wE26aNL1* zb&%#9rx!4h2P^BWyh7^VhDNzGVh8&gr6Yq`^@}FygCWd*l1XZq#gZqP^r^^+8d{&B zOQhGcST)F9Akot(p=zX2?=(~yKp0M#QbSb@o=L@t1e&_|w!?}%l-WDNTpJ6sFE{Du_=ul0l*(gEiF6TGACbXs|^m|RnIGVPNSrrL3a)2tZyC!67rAXpZ5b8i5 z6!nV{qLHYq3cskDJWHggF|2yJNtZi@{IGv|ylxvpX>!PJtQN|s39YCJ{f1DAY!{bH zt)jHkYC_-Egk1Bq*sPk+do`ioYeKR4n%zqXb(izoR}*q9&^U8VXemP2K3`3+kponL zfI^}ulvfk_NDE2z$Fb_yP5K$*l$8@}F*cF!pqbb#9R3^P3BxRt)VGLL&ob$c7Ab>G zl&4|4Vr^1j9gy;hS>an;Aa}G_%Li3&ywe2i674@=bH4F#w)9VTs^(l1Z@b@DmD-rO>$*TSpkh^qnwNG zIJ7AFqrJmKX8(pspE6Nf@(#vfS%H?WQ~(+M0*#g&ta4anJj#?k0YzfrOoK*SuAZpo*JtxcmOvnjw#F8(PQ~}I&`65YrdqtHc=^a%4dD#ryAb=V+6rc)O0J>@= z%BKjd4njQuGg!X<6WI`!7+LZ~(hZoYsQ|$K-a&MBD=n@MLDJV z5uj9u0lG*Me?*l>Re21OE|L^~9H4Y30lG*Me~J`bbxDdpEyv2TTpqgTRDvWK{H*FE zsetnU@fQHPNRs|5Ktunss$YSm>v>6bS7la_l;3rL_#5~NPQGra#BZwnU7-b%Gzo93 z`ty=9xTEs_PEvvQRJ-RTrN6Juq5DwufJm$=DJZErNy^AZ)k#v2elJ1S^O7iA+{iO} zHU4=?`7}`ZathFD;08(SpBE%mq%|ZN213$Bl7eki8KlZ!NE*`NkYpbTNf${9Myax$ zDx-s6>^2UQ+t@;At*(Rb`55N3scc3nVpkw9Lc* zNLf{D3`uk5ZIyps62B5WMXgffYo$6FY6)1?X($NfxA)bI)~gwjq~HeJs3IS#{PU7} zelvIn$S>7+k`(-kom<*WuESn6rY=cQ`*5QYzJVnDTe_)|g8NneJC!Ht1pbVwlce#I_) z$_7N@Y9Oh7Km^SeA2s4HljZ*d1yYNB)qF@&uqAGE%86I`eYME>{A_NxD% zKU!14f0?fJ|MLa@m1q0%|IUYp|ADi8w|_d*lk4e>PxJKevpsp^@3Z~iXZyd;_Ou@0 zqBB2j4}YKS>5TvP*@Ks|fK}n%kX^>zz&h?WiwEAu`^~dfQ6qmi-Bw=?rqpP+=E!`IkOnds&Efs zmvIke9e*~9ZP`NH!`MyS!&%ZVW-)>-$32ogz&(ofK5rJ=u{F3yGx361G_p+GW7tOA zW10R}vlz!LxW}`txF;~Di)JyAS#dY9-MF`B9+%8w2R07(j%*+9otV#Mv)GxH;ogNE z#JwvEykZu+v8lLsXUA~w!NRYa#UwTp_hfbs_Y@X;%`B#}D%{i9W!%$Q$LnUXCtHYn zFLo36-Yn^cS?t4>A`W5JTj&vJ`=JeG9)F-menOA@ks?~yK4>wA(IdB0#B5e} z8$AN;6to-`cn3Xl1U+&mMI6PBLF;kUz!LAKh*mc9u9@A3b{*PS7JJXkRv$C4CHGRq zJa!q{fa3<1c0WZdU<>b?ncWEkdjf47OL|~tTcE9fkRled2hc{JG_WBLQ^ZoX<{{d5 z3hjH8B2HkLkI+77+o6>){bRK6G}`w#MSPKMg%)rI?R%0UPG;68Xdkrw(8`&|Q?&0a z+V?a?oXYk+HH$AXpJ!%q8Y{#7Wp)tvSKbU1&EoVor{ezVo5ygU!NWy}nS3URN`8*S zYdlthc%4^~n8h!Xn9V!ZgP6k?l9@FaR#wJTm74X zFENNI(t3ekA!5Mq2A<{s;sb#%asXj>)4-n)u~Fd3jX-PxvAz+Aj|Kjah|#wUe2626 zO#)x*2*Ujj12;H<*evjYP9XMz*iOV&f!jNSn0VX3^PE9!6Zoe@1l%$3=8ZvY7x z1jN?@KTbrC2L_(#24WxF;RfP9i0edr1An-KSp5+Ga0js;{vcw&BlyDu#P{%r2MD{z z@COkG;g6;uwt!gQ6vPkk2N9#6z#q*(`~-hA1L6J@{_q5G1pe>@u@}U4B96fy%|T3j z27fdMaRUAT@n(Pse|Uj71%G&fI0|Av5oh3!7Gi%sLj*Iq1(70%Elzi0ecccx)($0Zs@l2?f!JUnauN8AMuJ5KeqyTM%1_ctS*Do)iXR zbYl?f!$7$52Sm8LfEW@E!i}#92eFq3Lj(v9o*4mRqAQ5)L^R|2NDu){K;%V&XwJ71 zag>PWQ6O4yYZQnXZXos(;ln-JfrxPjF}WQGKfaHMOGJc3gJ{LeqCqV10C9?l);!P% zqDNB@vy31D`7t8y6OkALB8bn70kOIni0edz@Yq-o13W=2i3QP?Unat?If%445aE1b z9EdGMJRu^IC&gpEisH*jwBrv*MDyMW5JtX+L<|=bA!2zZi8#KIL_F7jyb#LlQ{3ZK~-#A<&K*NI5uv0Y%8&Z|iDFbzbHFc7oSKv?-PBJLBBm=0nr zpP3F~bvTIYMC9?_@rAuWY$4(a5yd>IH;B;oc6!kUk(L@HKrv>?Oj`7epD)>Gj)yvX(aKm-^;JzdxX#ZpQX%N0=raV{5bY`gXAEB}#9XEsCCd&L6^*`XQ zjY1V_^I9gC`+5N?_jP-eB3GDSD-d@{d0jSdC=@$M()2W{;dip-TgBo$>4QE*d@2*a zmmsM}hFaKIxiFqP9^?u9@J6mdeVMc$0jJ}eu!@nx`0NQ{rOt>i>Kaf@?kS0$Yy4r+ zkOpf!fUme$h+L>v?WwpX+J7s{&b5Zpe^{nx`+JIb)+F&G!`)J)>B4w&7m}oio5RY* zsYwkwOjbJn{c@2X>?}3rPmha%`X9BBD_*$WiF)lIddpA%eC zx$clu5sWe+O^r{6qzYq{3B6RiR5gyi%owbO6?=R^Kwp)P0w_^BBB=%Rg>D;wt{iYw z2zdp=Oupz_e*B~V#wY|Ulwegk`f9eR%8gMu@}4affJ^&DKx2fnwaKXcJirBH56T%= zo|>4xu%O2fixPQn~UOsv*@_ z9UwJ74xk^7O;HW$2LhCszCD|UFlGF@nzlK@6$q0(Jw(Jm`4@9jRc^M*9aUTFqW&7e zKB1I<{wwz5lc&YO<@ALgeMx8r1^}7BAYd>s1jqu00>c0cK;J|r11Uf{K+kCsfJDFq zv9RUfb2iO2BQM*;ZJHWdDjl|V7Ue+K$BXFI-^UsS-GBzUoG4Khn3HS%F8Q21B z1wI9~0iOZefgQk3U>C3(*aLhHd;!pR^5=mIeEC_?t(<-|@F}nj_zc(%>;QHFyMaBx z7XUqo+z5OG&`(ZiAk!G_3DDr~3-kjrfc}6P7zhjkh5$o>VE}y%^)|2!z_)(of)xQQ zP4p9K`NxU@kbwXVdK%<3sHux-SkUhh=-XN=K;Pbu1TKK@4A}+f3S>ji0qBeIR)9ay z8VCRafi^%85DbLS&jLabXbXe^;Xnis2}A+yfM~!7!~n5C9H0Ye7TKagPf*xXfCk$= zh`Rv&zUmh62XGa*2K)+K1TFzT1HS-gP`>=LvmYUU0uBN6#n@NC*T7z2AMg!8KZ>{s za9{yIzt)%w><3l>?*eOpU?2o&3q%0R01ML7FJl-m4;T()1LY%dqjhB@Fbe1j&|*eY z-vej}7yu{WHDvNSFbkLs%mL;CRlpkn1Lgs50`mb5EC3b)i-5(zTfh=v7!XVSABR9Z zkN|`M;eZi{0sMe&a5Mc%!w!&8iF$wt+(z6D;5u*xxC|TzP5_621HeImmVrp%eZUCB z04o9d8BiX5El&$sAutXo0%%30)iM!@O@JN++XFV>euI7zI0Dcw!01O@aRB{>XaX=1 z7!Q;Hw7MRJT|3BlfPNQ63*d_YEqb)ZP3eu>YryLOt&}r?G+;15TS04pR!KedN04`b z#|Ym5eg|#=?*XfUP++mhP3Od>V-HQ)V&RUAFnRN@e-&NJDFH3))Qfq*2!JNT z03-;4^aff0%>ggK6KDX~12oahK!1RoP7Q7bGzIJdn8lUKgI7d9rw$0V2Wa@yG)Umf zFNw{{+aX8;A`*xIXsXhbrGXL(&;X(3ItZZUI|B#+`T>1`K0t4v7tj+(2hxC4AO%PU zl7JpScc2^473czVrg7T|fvedfNWqiK>6hZc|ZYB2#f=Yfl{CZ7*92%`AlD zUIAtRuLG69YrrgEHt+^OEvy3O0t{FPEC8s|PG6aFM$of7l78C)V-Ac13-&gPd%g=P~_(Tx$R?M zBS0Bz3201^cSxu3N5BYR7w{Rd4fquJ1o#KA3D^v50k#5^?`~i_unX7$?4!g&?ZKe9}7@{w8Y$pph`Uho&tV=5AYE1rvASN z+y!m}H-LS>W#AHU5I6vQ3w#4q1K$G@g52~Np#CIx))$rI8TGXd!sOBbK!-5(H-R{+ zL{o5d*dcejLDHsRMz{$iRWt*bLd%sa2p6C+;0(~I$Ps7+H~@4~q7##rh~yN2x`+yL zM;ukY86*$CB6cXJy@)_Xeh!O?fDb?$Vr#%3Xa)EH9S+86g!BDL@F21kkA>0-)1mI1mQ(0J;O+fUZCn zpfk`3=m>NG+5_~lJrPI%=m zipT}V0#;xQK=G7l96%K;ge(B4!}9^^zSiK$n-ouB;_`qgz+_+&Km&#jfLhuVIx*6a zqmv<>9E$-;q-9u&Fr6mp^hmZ70Lp;QI8<1`Tm*2%eJ}Fve~2kg+8c4~#H`5Bu+T7J z^U6QOZ$)28Hp7i(S_2G@IsVHh&0O01Q%TGU3yp*=Uw23BDGd?%jr(|#7WY7O(?w9h zd>M3UrpQ0NFGi^Gnw0IDN+%`W|A810eGR2JBkw6oUwfzR`P?m%I3*%9JTx5jt|y

1!K)_o28*s~7*`k=Rs{bo}fi z6yRs8RHZGx0?hixa$BurWRwtM%UvFe5#iqTm8V_$f`qTG^j@?L7SW**Y{x&;OYYIb?BxGzQt{%oQTt~&U-flSj9_O)4Ea8^(e+mk zpFhuCL{nmTBw80%V#l9S+6q`0U{Pw_@I&{m-EP&UorM@IKN{VY3~tfJO9Iupr-#?-#6V_1!D8$s#N?1`Rum80xt} zAKDGbvA&#({s|A2eR|1`e@AH_!@?C76+;KlslW0-E4l7+?oN6o#xZRuzu9MLd~MDA z_1v=oY8DR*ccj&gN*;TrLC`r$8!4yltLMGQVk|5?U{SeqtK*52zr0dw@v@%3+(3$m z*4`&tJhR8sPu^)c3B8UUr%QVUX|pxuXEt2igxxg@qlK=^dVURQrM~vuyP@PRIX2*N z4W(4+CzRR>dcOvnS2UC)(euy!>LUKoP(EK*{MwN3GNAdlpi{@V%?~a+wf@PK+D2+G z2t9pz=aO|1+hc9Su+WI`&~`X&8MuQ3(rRz*x;Ve&*7Ejux7Au`FCE=|p=xzwx9<09 zV|E+(V5IfbUQ-&@Y0=QlwvD7(i(d_VF6FMi*|cJY&HJN=I>k+_wb0&|X6IxI+9J;T zwl=1P13yh^wYR0ZKYSS8r#d>P)}lMcnhV;yN4U}5|FYDfHfE3m4{n5-X>VX{;~Wqv zzV-{gRM*-)&4CYtMYQ(LRu+HFZ_KPkGioigx4Q1VThU_Dsti^ev(tfZptRbn*7}$Z z1bH@hdau?(dsD2zt;^-58^(WK8zVI0kEv$byJd5St$230YHP<@i{M5)%n=>`$dxBM zVqn-c;ZvYT`!tb1>Q%gy^7h!PYwS~PM65Znw4`WnTixc;#Cgb^g)h~{^l!qyMOsho z{j7&0wmqA53%~oRNjtmAd?#eCz0h?=(c;#pW+WME4ZcRP&Ee$cFZ2{IO!}#!Hs*X2 zo=#~cH~EuWMZeQKm%n;@YSUT^Z#CxEj;-wObnfy+ZH&o{zlF4(+M8!TZe=qh?9wZZ zYb_?Z@dK2*_O4oE>-8}aj}COJwb0&X``Vl*Z*BH-x>6f+%8h$DBP~tnmZ<`5zIXH zR_RZ@^5Hs|MPfrm{Z9JuF0RP%nh(BVhP>y)-zO>g^0TfeptY}3K>mZ+`)OnPG(*a$ zQ0!tjX!-K6=5S?#FAr@3nc~ZPG(pNLUp|TCVqg9t@vD4!HR&6C`BT!Bcz4fL$k`rs zikTlW&*yXJeb^ntuvMVyn#EF#3#xVI&KtV7PG1i|**FA*VlTSgl2^E)cG|0h_syE* z;3oYvQNr3Gp9b)C)s7{yUL}Lb!cXxJ=)co0>v* zY0C$YezGlpo%EnE{x0oOEUgX-7}|EH!wGxR8!oQs%G!ni{-G@{O7Cs*xp z1RvZ?`b0{M;?ABZRqN=aC_W6j=SXZxG^E%03|R5-m1ixHcevux;&yz4C%Q$%h{Z-+ zakZhhM}wDIMZki5h&n0b*j;)Y%^yFXH%9B+c9JU}+FWwAyNe!fhU9#%tK{l~fr^h= zF-neKWQN_dfBheG zXdBDZy=s>VPi?9A^Wx$t`p5DOUXr&oJ(eHvLdt*6!ChJ!%Rlt1%}FQc#5a0L&H2kM zq$tTdj#spVdm=IN$vrKkpR;=3xKW74V9}zZsn(c3mB8b?CFhzoOr6ND)%;D| z5iYNzK2#kHD?xjo@~ia&m!_@!h?ZKK^09afVd7c7sLwyUCPLC&ruF-uI-$mES~~0i zldvPG-TuFIT8;gLj{K<~>ilX)p4t-Ss+~s*<)W5YCaO9rojB3cdf?oQtXrt5x}+)| zbJbzUF6ziVaX|E34P#n`DvQQ!ACi3eE7@3{5XuoU!t-NT(6KzM;QNJDZj;+l!`q?d zVK|oZrN|?CH!K>%qUVFpH+^O^d=V_@qYpaqM>TEcI=?H1SH^#a7_87V-G1)K4+LRa ziT;vNGI!!1hG9EFiu_KzpFbKkp%b6skH*aCq%0R#dS}1b>$QL>$N>Y0+}^V@|J@%g zkpCh8O7AoC@CL5|$@XgL7-R!G^OmipHuft!D?5dnf)}=yno1kG@Yh@a+abTX3*QBc z=sjJOG3w#$oZHW@(T^yA{E0?rFSlOX@bJ@Toqvi#jJn=nH*^Re*_yWEY>g+;XXn(8OH;)jL4U5>+oybg;6-Ie;> zfB53)Jp<;wBZ*VN;ILG&x;qbRBe{?H8aj2^h|JITEN!$*Cy5_{q0ctjTd^~KxYqK8 z0>@0bT)8c`U_onVxc$wmZMwPGNaATQv{Gv?#!hd$XN5=g=PpP?-HY~@cIU$aQCIDq z+|7N@`R&sCZiR)qm1%G39w@$bqT9W8 zKM0v??+$<9lr#2e)c%EX7TENn1nn*1E60p4EqgksIbx7C>L?sZA})> zp4WVo3BPpuw$7`cIJ}F)jXJJo_2q>ju*A|(8G-`O^yNFCN7uQ&%I&W+M&2&eC$^PFO1CojS?HeHo5_cc@|=8e!qN|rLLEX5{rS@N zQWKl-@TUEFXxM*HzI@t6k53ANZF*gQs&j^%n7=$P7u=wso@`NQG`|;Cd z`2i1hxR61-7c8RFV1dVh6?4xDZDinP){2JtNs zQkFDfFn5oX`bhypczz`EtYeFyH53O6?Pcz(CI)qH+wW8(bdkDtqz~brA+4wOTKE-z ztavy0%9Dq%z!;+gA;$Xeu#l8qahKE`lqW<<&eHfHyjK(=tA_9~QBqu8A4rUt##m5= zEWV2@wWHo|QIabqw{0hRd;T8}%6wouOvrzG^2PyDo{*>8NuPMuvnb2AwRv*%$44J^ zlEyVX3CfwcCGNCSt)fh0EPq3+})VQ0{d-vQcu^{#4J>W?`THa5;NmZQ36lxK}LF*7e9nNlTv- z@erh9T{r8HqV}!ds!iLZ5zj?hPwlS^99-_${EL9gJ!>sqv+`xJQWyK6G0KUq%)oC@ zX?1oX9_B=#3zg1&{y`j`7$D{Y15b!UX?1p?Y=JH;ghh0nT_{`B^&n2ky`cl&L22vk zLpg0-58{-x-5q$tc+{-UK9tj<4?Dmjy3Rh7E$Vs@r{uoQfzPJ2b@rj0wyp`t(nIC|hX1AT3z%eWNKeQn@^tBO>vHL;KSOk#A(buzSg} z$cPC0{Vf83z^t}OndYfzD#CXya6Xn+1-aztp0J&o)6%F{YLlupjrV&6wqXv6<1 z0UyEt_w45tDcLWFq=Vhnc#CCUL^^#0$J5+UW2CUDh=(R35B$WnM=cmZi)QEwu+>xO(#wtoOWFj&0t*V<7HDF>ik9tKTnydTP_bZNuko>5{{QS zN9ZoXw54pyKQKvci9d@scG{mSRkq0wY`D}OJ9@YAd`$bAOj4!H@%$R;W5#pu4)|nS zJf5d^klfV+hQ)*f#=P;$LVJ2VpV2{zaMAu|!=$R+1MBbdULuK=6Zm%>q&W9(u%r(# z>;Aa6BJ8K%_R9XoshH>`DghkGka z_RBHtz7;1rJT0+Ub0^@BK6M{-$p1#r#@3-7mF1W}jqH^BVT$uNNJ$^NlJD=!)%~`z z-=E{PKfm*jFAEziPIE1Kfb?X4BICtX=5^j4HuzXXTf|hi42NefQO!;}f^Y=!W$e(t z?Z?L*nRq~{>-1!Pyo=P$#!^~Ru(@SdsiDZ{^pxy3yY`eG*lun-O0v=M&fTOq-Yr+! zS?@r^Ugf!MtlC#aLL0kvNS)t#9ELaG8|3g2WLp0+&)|C x$h|+5>^5&&F9o!5qjK7Yw6%<|6qe)^g^(J8!OqW3!gIShZ%Fm|+!NBq{{_xBz@Y#D diff --git a/package.json b/package.json index 722365c..a498d6d 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "start": "PORT=3005 tsm ./prodServer.ts", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "format": "prettier --write .", @@ -16,7 +17,7 @@ }, "devDependencies": { "@eslint/compat": "^1.2.3", - "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-node": "^5.2.11", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", "autoprefixer": "^10.4.20", @@ -38,8 +39,10 @@ "dependencies": { "daisyui": "^4.12.23", "drizzle-orm": "^0.33.0", + "express": "^4.21.2", "postgres": "^3.4.4", "socket.io": "^4.8.1", - "socket.io-client": "^4.8.1" + "socket.io-client": "^4.8.1", + "tsm": "^2.3.0" } } diff --git a/prodServer.ts b/prodServer.ts index ae4d583..a83368c 100644 --- a/prodServer.ts +++ b/prodServer.ts @@ -1,11 +1,30 @@ -import * as path from 'path'; -import * as url from 'url'; -import { createWSSGlobalInstance, onHttpServerUpgrade } from './src/lib/server/webSocketUtils'; +import { handler } from './build/handler.js'; +import express from 'express'; +import { createServer } from 'http'; +import { Server } from 'socket.io'; -const __filename = url.fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const app = express(); +const server = createServer(app); +const io = new Server(server); -createWSSGlobalInstance(); +io.on('connection', (socket) => { + console.log(`[ws:kit] client connected (${socket.id})`); + io!.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); -const { server } = await import(path.resolve(__dirname, './build/index.js')); -server.server.on('upgrade', onHttpServerUpgrade); + socket.on('disconnect', () => { + io!.emit('message', `[ws:kit] client disconnected (${socket.id})`) + console.log(`client disconnected (${socket.id})`); + }); +}); + +app.use((req, res, next) => { + if (req.path.startsWith('/socket.io/')) { + next(); + } else { + handler(req, res); + } +}); + +server.listen(3005, () => { + console.log('Listening on http://0.0.0.0:3005'); +}); \ No newline at end of file diff --git a/src/lib/hooks.server.ts b/src/lib/hooks.server.ts index 55490b0..58c1b02 100644 --- a/src/lib/hooks.server.ts +++ b/src/lib/hooks.server.ts @@ -1,24 +1,9 @@ import { building } from '$app/environment'; import type { Handle } from '@sveltejs/kit'; import { Server as SocketIOServer } from 'socket.io'; -import type { HttpServer } from 'vite'; +import { startupSocketIOServer } from '$lib/websocketConfig'; let io: SocketIOServer | undefined; - -const startupSocketIOServer = (httpServer: HttpServer | null) => { - if (io) return; - console.log('[ws:kit] setup'); - io = new SocketIOServer(httpServer); - io.on('connection', (socket) => { - console.log(`[ws:kit] client connected (${socket.id})`); - socket.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); - - socket.on('disconnect', () => { - console.log(`[ws:kit] client disconnected (${socket.id})`); - }); - }); -}; - export const handle = (async ({ event, resolve }) => { if (!building) { startupSocketIOServer(event.locals.httpServer); diff --git a/src/lib/websocketConfig.ts b/src/lib/websocketConfig.ts new file mode 100644 index 0000000..04c6e4b --- /dev/null +++ b/src/lib/websocketConfig.ts @@ -0,0 +1,20 @@ +import { Server as SocketIOServer } from 'socket.io'; +import type { HttpServer } from 'vite'; + +let io: SocketIOServer | undefined; + + +export function startupSocketIOServer(httpServer: HttpServer | null) { + if (io) return; + console.log('[ws:kit] setup'); + io = new SocketIOServer(httpServer); + io.on('connection', (socket) => { + console.log(`[ws:kit] client connected (${socket.id})`); + io!.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); + + socket.on('disconnect', () => { + io!.emit('message', `[ws:kit] client disconnected (${socket.id})`) + console.log(`client disconnected (${socket.id})`); + }); + }); +} \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js index 1295460..e0a641e 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ diff --git a/vite.config.ts b/vite.config.ts index 6af1429..2a9d30b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,21 +1,6 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig, type HttpServer } from 'vite'; -import { Server as SocketIOServer } from 'socket.io'; - -function setupSocketIOServer(httpServer: HttpServer | null) { - if (!httpServer) { - throw new Error('HTTP server is not available'); - } - const io = new SocketIOServer(httpServer); - io.on('connection', (socket) => { - console.log(`[ws] client connected (${socket.id})`); - io.emit('message', `Hello from SvelteKit ${new Date().toLocaleString()} (${socket.id})`); - - socket.on('disconnect', () => { - io.emit(`[ws] client disconnected (${socket.id})`); - }); - }); -} +import { defineConfig } from 'vite'; +import { startupSocketIOServer } from './src/lib/websocketConfig'; export default defineConfig({ plugins: [ @@ -23,10 +8,10 @@ export default defineConfig({ { name: 'integratedSocketIOServer', configureServer(server) { - setupSocketIOServer(server.httpServer); + startupSocketIOServer(server.httpServer); }, configurePreviewServer(server) { - setupSocketIOServer(server.httpServer); + startupSocketIOServer(server.httpServer); } }, ]