diff --git a/artifacts/artifacts.json b/artifacts/artifacts.json index 93477d79..e6e58f3e 100644 --- a/artifacts/artifacts.json +++ b/artifacts/artifacts.json @@ -4,9 +4,9 @@ "createdAt": "2025-02-17T11:00:00.000Z", "version": "3.5.0" }, - "bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm": { - "cid": "bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm", - "createdAt": "2026-07-30T16:31:03.008Z", + "bafybeiflbf2sboxsrmod2yyvddfvsaodf6sa77fhmeya52cgk4v3ny2g5m": { + "cid": "bafybeiflbf2sboxsrmod2yyvddfvsaodf6sa77fhmeya52cgk4v3ny2g5m", + "createdAt": "2026-08-02T20:33:35.975Z", "version": "4.x-nightly" } } \ No newline at end of file diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/catalogue/index.html.br b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/catalogue/index.html.br deleted file mode 100644 index fe23738dc76b5aaf01586bb4a4efc97756d2da74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7590 zcma!+b3E8_Wr-X^?}dlO_onNv{#O%cnX|&5#c9X7%ck>ouHF`V_3s-Gh1@G*lfpD} zHedg*t6j>~aic*pAU(x_$9KZB<&&(>RBg7|T>kxDOu&iV;!FN$mz+O$?-W<&)VWCw zCN3Hrt9MD~SgxOVMu&0P@r-T%v|L?WI$P`a_122!g|Gd7@$bA9CX=5`6lmJ~{B%U! z!!vKL?thmVsM)rsNnlb*hxdUg*7u$~`E;A-L7&2DhUz`9-FSt6J@dVHeYY{kBa=x% zCskFvnu_MRw3R&#x%5he+gxO=_yP7;-#_QQ3W{}nx%%m`CDO;(Cp6}6GOJ@yVUKvI z-WKu6`DtTRr{W1d<{gS}H>N*2bmL{a$D$vKa}0cSqI*6qE9`7p{Viy}ovgP{#@{lf zANn>k&!#0so$gI^Jdxgi!o)Wq>*BHxOq%ScH#u=Xm@N8^^`psQ>j`DS-}tWWkagLl zdt=(4E4-Up);#*Y_=np1^H(?8g;$FDMeN=AvpU>@lmFc2(tUGr~X75Wl}9Y)c?N{S36X-6hp4*LK6dnrRh^PKp!m`(M* z|Nd+3|1)FLsqQzAf8TxFc%wh0&qZc=O!U{bV8u*Nh7ZmY#U?1C#zpxTy1mm%hG!H%iD|GKg+%KOl{pGX8kl@{O}bgDRaf&Gfh2LmHqZM za=KR^AhpQ<y`iQ zwc7raufNN8PiSCda{r_H`~H@VB~xr%9+ypDu+D8`YpeR^)l0ud=L^;dUa;tz5PHI1 z|HVneuN?1%AEXH_(BE10JN`=qi?*+L%g(gY{aYjSs=pln>mRh>fm7y+*{zILYyCqt z!=C$z?qhyXm2@ad=K1kglZ38hrcGP7^k8}J$=`47FRfI+rTH=ZPF%R~<=nE^k9F17 zKR(o*)jD`9PxNr3)-EOa_d-dVblD>|96h;Up&OU@>Ql2q-(7tbZLrhd@zaD{o#1W9 z)=!q{dHsLm&lxR_uO?}>Jj{Niv2BTw(l++6-&c1jR;62c>+i{nH9AV6OPS&Gm+go zu5$7d^^gy*ZI_z7_O;Ugv#gD~OmZRQ z+{)KSEA(^s*xpu3oHXORT!GATiCU~yC7>%F&I7K9dNZhP)#k}&1}r^QwCBbF%&oxISI zHuKR0PKjP)-}h-;my)l1mtDla*M7$y&aBS5f2EqULr<<@5Pmf4O_fXV<7)xVE~z!v z76wk+CZ-CSG;DdE)Dh}<_}I(4kJ{NHrW$=SI-4Kv$-Z#zSBCOki=&sm5BYAltgtw~ z*rn^$FWtPNEoS>`H%zO28(tK;d+N&vHgDpty!Pf(ddjCbX>Qf2os}9hmYFZQAEWDi z-%;jmMcwb)^Q$*>oZYN`BVxt%*&@5`CYb0twya}g-5?&!F8AB3PP*u$$DVC5_P>N) z{Rx{Q%{kk}>1zYmguA?&^5-A_m3mZj=EV<61@e zrm|7ihr=A=1vcI`WQjHWQR~M!-_G`iuI0W1yFXo4j}V^xeba@d|E5cNRm_?4 z-Rp|8frQeQ?M*lR-+yOWc%3WhwECNvNp6g`&X>9VY|djo_;+LNzLW7f=K{k%|BSPK z{Oh2qrNE=QMo%k4*JL(7z13b<{MFYn?b}p!W>(O)ZR_lAN;*$}|7hk42mZD7|K*}$ z5{{o@?qoiAY2q|_fjg&PtzwN{W|v<4q<=vSoA~#TQaDDR<&>6L;uv9$#`SAnnCLk44#%DzhzPergx? zd^Ko$S@3${`{2LN8Y)t>5ALeH#SpNI>B^^|p7q;2ZG?-?#@h*PNj$?oy>{_4MV`Jp zp{_f&B{E2IxFuL0DJ#4#`s0*)X>9kVwK8mZh2}4QmPB8);n*uwW%{X~dvBGM!k1T^ zpI#jP+i+p^)*AIWJWKss!)(I#3ES3OI%K^w%lK$+YgnR}llHH99BU((|J^oa=3IN@ z@s0~#NBmmDUWa5H6~A`#fb`W;Jb zBspd~&ox>bEWIPkqq^_+3)VMH>{*k0*YWOe|9>LKSTJhsV*M@gs#|VV7+if*?31x| zp6ZvNjH51Js*_aWI%YnoYITlD)Hsv1r24<}eJQysOtw?9K0G*lDR;)Xf3eQr6;G+1 z2)40s@_Ddc^S;)=y_6=^!q?3ET54&8JH^J!Sqj zdG(X>dq0bg{Q36pdsr{8#EDtWe(f>K+kE`EKcrdAP}(IqPfB-oUGuy%k;hxYv{%g9 zA|12%&WYsUg;%*&?E1Iom`&6FjY6mY@_)FO{i;{o`O=OV0W4KFSm!5P-pVdtet~;y zP?Otsu8MVqeMh(X2F}>)VjtmoPi&i%V#e>E!6uzMb~IaYKUMm9vMTVCNyvwQrlqM5 zA6+xl{qThAhU)8O&L6G>A5(F-_Wxtxd!?kgTZCU+JOAF9DdO3MC1++`VPn^3naj0S zFIxMXwZfJt=@%>eFG=^eT0#ZL@QfvO8%Td{C96V`ky)M@go(uf_hUTlBiuh8ie6 z`6#j7_1>$GVRk!?Eh??4_ zueHfLohCB7yUG+k({*QO?3^vXb=A^Fh5kFMqP!=&gey!F(eCZlwrkXt(kc>5YB1UK ztYA`+mFL4fd5e{eGnF^5PSQJWf9l$BljS$o=B)}#U0Hqf&0;BQ-ybtm7z%98 zJ~Wa2beTo|fIG+DM@jOV6y`UuYou{~F>$@LO{dZ4-m&IZ&l;^QQ5UzoC|G>aZ?VIx z7olB##y;Xehs4&W)Xy5q8-B=C*oi^Dsr`~#D0rmj7)vXV#0ncXPquyAR^ zn^$j~gi|z3`sN=MuvFcj*Ka847js~9#w}T`+3Vh$3RZ7spP{noI`1zBt{mab?YDJr_-|aybjDGb?aXGO zr@dSqmzjK1yEI=hcIfXczOwXAfCazD1BR8Jix|ZflOzt@R%vATD17<>qoQTZ66d;! zd*-O!XmpouWE0-DLcrlppPri9$BU=mJj(Nk4V!)9UC*0M9xVR1Sa0$fO3!s&!f%<$ zez)am%KO7hKF$t(cHC~yA@46I%kMe8$;v6&b<~~XK*Q}HUQ)^v>^^G>-O5S&HQC5R zrgVqF#>f4!7daaOUxye~D0qvN=1frzUVZnpzu74b|H{KW2M=uikai)euA-Jxv0v>hPH~x~Fw}^kOy_uQz1QuZfP3Pzp2dDS`kG^_e|6?on$#?LCPyk%>RspE z4L5drTPaw%%zbpTl>Or0=~n&v+v{E}Wjp?1cYe>l5Q&BB4^+4s9KK}vfw4TIYtio~ z{WC(=Jo5~!uaj>#KO`ulx5|9K+Hq?&P7jxb+^ZkCaC?TSsyDdZb;vu+z9DsCu-vUw z{T|y)#&u0~Ql~`Lu_&5HDAzP9A6ds1b8z3CW%+R**&1#%-YlJY!!_m)bAz|Zg_jJI zzV~1J-Ouc#6e4uqr!{P~W0=6jz5E6XZFxWQ>?`BVkN;Owdr$p!XhqT==_)VPeTjiW zH#XD>J8X0_F{o+q7V|x|?BWa?AK?v(oMv|nUb|$tu69e^6ko5tDI(te_)U|&>RT-n z>#lGuOSO9V_|EUsm#coA(exEa5Veap6I9T6(y}eKfh}TQh(e>bjbKVgV^15uz{#YE zpQ2Rw*S9Kh{+k|d$F$b0MRd!KlP6tXc`-Mh?h$kTuq~TWxOTRb8(x5Skz^&8+iJ|#?-=Tn=HK(c|;pT!~(Z1G>BLpDYi^*wP^=K(0^fVzr(vG*7Kdz zKFQ-WxiD2?8CNRfxA*(m6Io8y|J!x2U-=wwmJDOwhDRK0q+2?g9oqOmoOooDT0AeN zMwCI4Kk4p~iPMZP*mHe6pq5dsp?F*~d5^=PYjFo{OEpezw>)H?HD7LDmUKzkpNNk( zbqlr~w~Y&k6gt4O>Jdx9V%{PNy8y-R?kQ(oKNb2j7zrqvg(~{|lUrha#@6K1%j=B~ zUT!aA2%hDXETG&m>*St&{!2u7-(H+HDX~*Fyvz5d-^Ck~X4`hP-SpsmUviu2pNrqq zv>wigKc=b=p8u4%xT9X#<8KJl%qwp$f3(QF2Q2mWz3~Rc<9pn zoJ`5-K7V*b!~^-<^Dph2F6PX-Mrl*E*0Lbu_$ZD0(rdo&)-2$R=MZmD=@Rl^wy2r& zvb@6zxeu}}9gp|x%{ftCsXzDM-OyUi`uWy#dBhG(YxS#q@g(WlhxdmJ3SZQC#Y<~f z&F5MhcB0b%&asE$-YNn6W?hWt+t~AFrNEQU>E8V9uXC$j@95awRc7HKU%$I*Z_DwY ztr<$9Hs5r&Ua0&e(y^m~|7dab?ynb@B(@xX#>=$z)6R;OIU(|M_uUMg{^^>diFpJ= zikR=I#h%+TIPQ1+eYTsmr9AB&XZXLEMu+b)ubNwyDBhBZ*%!5Nv&-(r1d9`~i*#po zmd!YO%9V=n^iYmSpD+L(Q~_&O#gZ5 zcmiWVq>htZcY^ri4@Ws-W#Tb1+Q{s5{x_{VzI_f0na@P7MbDG&JGS7*@2g>}n!mT^lMn>Q|+vdC-IuDP3B z0!h6_y+>1(q)xcESm8}~%5vizE-no}n|IQk}J z(X#0!TBf~x+;;@6t{cBK*!nu`*hO>K&nCMy*7YRVh9(PbaeSCLrM>Y)Q{_k7J%7Uv zS^fAmYhJW}9P8}W+#VA9js==CC>#l0A#tv3#es{4xi>diZ0BFNl(S@0_Q|ClUY{Q& z20AG~V?Q(c@7<^3k}OjuEA>glsZ67x_~JJg@sx~4oj5k= zCvzk*t(e z#yd~edPQ&1kSo~x*Th=mL6BIwV*ln-X%3o-9!5uGd%RsHb%ke(U3q!O(oFZp$!8K_ zS*z@{l41_;&JDVG>*UVL?FOn1k1j{e6~2A8-m=Kg_<6_sw5>Hqt^3Q%Kh>_%Id@pm zo#Ux?7K6;hEdcuvou)A~4zn{0JZ>z;~A?Atio~D(aTbRpr>a5|ytN9z;Up{L+ zdZ~Eog;il^Q$m_nyv&-OIU`s#^UGSBJB62dc3r+${BCWyB6t7$%@udI30-TpzcWd^ z`=y^__r&L!eWs>7WeDGGP1#u41(UYgHy!*3tdqcxB-{-uGs&_~h^Y<8JG>gtONRY^U->j8>*jj7d z*=xtw)G9W&zO!sS-`BjUek;Rixw%D4=0tthS^Irb;C~gVLzVKJYKB}#~_tV3B z-AeJN&T9X^Gh3y(wwAT#WiBUmdF=(aE2w#E z&TaRLz2j9OA|?Cpu(WJMprxXoyqf1l&KzEqsOR@`wg}B*IQlv|{6-|-i+LYb*W8yq zd%@1--hBDQrEE;AiyGFSPz<=J#lI!gB7M1YxX=)-{3GzV;Oga0{Nc}J?mz83*6=vT z*_$e1xKxr z-8H$G^U+owy!TukZXa>9;+b_tw|3%$m($#DR~O7V(IecN=lR^=>w~%TvQh+gz1;f5 zO?rn3Cj(EAn@bNxG*vJpisG!mf0yLQSwghgJ{jucK)*YM_oN!9ymB;D(3OK+>41aI~r89De}wK zRNq+sCwCvMpVut@{6n$)V}-8?#}(tR#V1?+NR#PftVqAJfGMxGq0#RBq8$fx3}k{+ zP8`&D)4izjo<&B+V_W{V#Xr|)<{YlfJn&`S?8A;+;?dXCmQ_!-E_-3Xnlkx!8Q0Py z>;@Y-ckA&#f88`yNaU~A%{dI0zA#vo?)$SLTYmA4Y@hkRC9Jop@dm$kTX_Ag!4k2> zp6{K1zWuwb(Iw|wV8n`o5HYQmPijo%TGJ1%IM?$aYvI+Sm7={f4&FPYcFJ{2@LWE= ztJ{mhR~tWWEKycA?zrf5*>>jN7T*q!*4o9nZ_XH9DG1Nbs**hBa>n^Ck8)@2v3Yi< zo63@uZ>goX?Y{T@oa&vFM-AmHosw71yyvq@Ft@M|e9-B( zN(paoJ7y?taPaZb1i9iO4F&n9+%{Vck32o+JY|!++zDYH>FbSaE+$4+Obq*3bZN$8 zk@as5=wd^o#*)BN5WhM$TrUn>Qqg&ExD?DX5^`d_^xt0=2D*_Vt+SDXVLGq^)0*`wx7r-K4>t{ywR$1 zqThAahVGZ0a;b*>p|6zY)oax$eJWn!$hdg(1x0aLCT=-K<4FaJJ!i?3totCL)#dP7 zsn5+*q>bv!fS?c9R0V?Uesl(sOfX*~W$^v}vde!W$5emk4ja(vf` zm)cx=L3Dn;UB*JTFM5>$hbC19d{h56Lt2$rUSaA{r6=1s7N(y4y`bsRC1>Fslgj-X zwv>NZ$R56IOT(8Vb8j5XT|WEzROLO}HoZQTA6K1nZ=-TNW0KQK_A6|Ej%Q~*+PU>r z{aUTnm6>Nht}2&19{pVF*{nHrKmVMPpA(;2(D3{3hl{RzSSC#3IR0GrgjU{_P4TZ6 p|9xOn_>1EQ^W8P=(Qox%?*D7et7ia;d_Zp$5+b4*8Z;Cu=TI*1(kxYPvn1F zn=ik=@7^V!1i9D0KE8W>?cqWH%7ydyr~Js9!mkxrvNJY#9cP4ZRcYB_3APx|NF6@0 z6SM4Qn&j*=WC-_!%uBKZ-4V_g>tpp z(OFOagjhWNx#3UvlNP&^X1mX6+*CTZL-4wxinh&e4KSH>Oh;}1g^rOA_K7~<^-*u2Y)mkT=hsqxzAkcB*&}+{SkSm z*5=H$T*IugbrZv{JmDF3m%>glH!^gJOu4~k;_zjvm9VKZCWV?`TJ-JtrBlZWuV))2WY`{9 zay@JLpIB91kH8bZ-k;yL^V22mG~IfJ1-vTrKSqhaiYc3);9+~(^KnZ%?}5GREw=Wa z^iX+M74Pi%TT8a?Po1x0F0WC4&9gq|V?_R|nJVq?MfI(BD}SCPn#8M_ zIHB>t6fI}PC0%@Hx2Z!quhFNO9i zhBjTX&KL5|7%}i1pUQF~Ifk!!gR3HEpi1SPCE_+Bd;$+AXg!{?Db0f|t@p7^{l*Kq ziY*hi99*!rf6ca+k7`1^{^-6j?J`@WAyY7`VAke&54QjKay@oNn&Lx+Q!71sI{#P%PX} z*RO#iChDj8vp16tXxe|75OpS}O3d@%s{;|O&WC(&IWsT% z?&o~j2`w@{zXcsGDV_gRz5Gdw>XZY=tlQFLoV%q96p#L?(tqNWCI7}?$+ORw{;zqy zYeD663A-Bw*G;=LH!k~;uvOrY%S5XQC$@0gGr~SvX>v>Nnxu0# zId#UpX4Eq-VNadB&Bt*%ce_5zY@Ykm1Gl8GS+APp8@x*-+{b#^!ppb4vRscY3`v^$ zYF+9~wfvo*#S&6$ebu=`9j;mF&$BuE>9}2%=$sStX8sBOVCf&%vHQgN3sOvWJ8q}w z?%AiOCZ1`Ka{AZ({h4=|mQ?>TSW&!E+)DabiNep&8U4vCjvKx?Zn(x!FYHBGK;49> z`;OV?xBH2huG*rn`B1t0%_=dk&ktU1k(2uTJANA1iZh!&a8J5d(_31)QSpI>nW_Bs z+NTb)-k-VVJ!R&p2SHbBvI4m6SUB%&*_+3FzoL4P(G88Rxa9NsX~Fa5ls0V>*&4d` z6RXPEiA&9v`P=WXdROXw=hogm=FPh&MW5X1_;*pjwuXOJhtgdnT^F7@P-ghT`{Q@{ z)>Q&R4JWj6yju636$?0^#5VDPmyKXpqV|2&sY@7>wZw(DGq3&-H}N4?oRaAJxsxRO zUKMapysOp~v9Xt@;!c?Kx4%p&xBkC0{?8{|`}d<{X6nxe-#iP~8`#fJH@16!PiON? z)@iA84zASD(mH-In*Yw%D39AIeZM&!gZz_JZKEBZ9bA^=r5@zFH{^Dsw_fJQ#3OUe Nl#8r1b(ei%1_0?p3pD@$ diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-B34KYOJA.js.br b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-B34KYOJA.js.br deleted file mode 100644 index 90e2efc06164b9a4dee20a289fe9d5a61eb9ba58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14644 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 diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-GGTURPMJ.js.map b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-GGTURPMJ.js.map deleted file mode 100644 index 284410e0..00000000 --- a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-GGTURPMJ.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["/components/transformer/output/raw/atproto-sync/element.js"],"sourcesContent":["import { ifDefined } from \"lit-html/directives/if-defined.js\";\n\nimport \"~/components/output/polymorphic/indexed-db/element.js\";\n\nimport { computed, signal } from \"~/common/signal.js\";\nimport { OutputTransformer } from \"../../base.js\";\nimport { defineElement } from \"~/common/element.js\";\nimport * as Output from \"~/common/output.js\";\n\n/**\n * @import { RenderArg } from \"~/common/element.d.ts\"\n * @import { OutputElement } from \"@specs/components/output/types.d.ts\"\n * @import { ATProtoOutputElement } from \"@specs/components/output/raw/atproto/types.d.ts\"\n */\n\nconst COLLECTIONS = /** @type {const} */ ([\n \"facets\",\n \"playlistItems\",\n \"settings\",\n \"tracks\",\n]);\n\n/** @type {Record} */\nconst NSID_TO_COLLECTION = {\n \"sh.diffuse.output.facet\": \"facets\",\n \"sh.diffuse.output.playlistItemBundle\": \"playlistItems\",\n \"sh.diffuse.output.setting\": \"settings\",\n \"sh.diffuse.output.trackBundle\": \"tracks\",\n};\n\nconst STORAGE_PREFIX = \"diffuse/transformer/output/atproto-sync\";\n\n/**\n * Wraps an AT Protocol output with a local IndexedDB cache.\n *\n * Uses the repo `rev` (revision) from the AT Protocol to skip\n * unnecessary fetches when nothing changed remotely.\n *\n * When both local and remote have diverged, performs a union merge\n * by record `id`: records from both sides are combined, with\n * `updatedAt` used as a tiebreaker for conflicts on the same id\n * (falling back to local wins).\n *\n * Maintains a per-collection tombstone set of deleted record ids\n * so that records deleted on one side are not re-introduced by\n * the other during merge.\n *\n * @extends {OutputTransformer}\n */\nclass ATProtoOutputSyncTransformer extends OutputTransformer {\n static NAME = \"diffuse/transformer/output/raw/atproto-sync\";\n\n constructor() {\n super();\n\n const remote = this.base();\n const local = this.#localOutput.get;\n\n for (const name of COLLECTIONS) {\n /** @ts-ignore */\n this[name] = {\n collection: computed(() => {\n const l = local();\n if (!l) return { state: \"loading\" };\n const c = l[name].collection();\n if (c.state === \"loading\") return c;\n if (c.state === \"error\") return c;\n return { state: \"loaded\", data: c.data ?? [] };\n }),\n reload: async () => {\n await this.#sync();\n },\n save: async (/** @type {any} */ newData) => {\n const l = local();\n if (!l) return;\n\n const newIds = new Set(newData.map((/** @type {any} */ r) => r.id));\n\n // Update tombstones in one pass: add for records deleted from local,\n // remove for records being (re-)added — so that fixed-ID records can\n // be recreated after deletion without the tombstone blocking them.\n const tombstones = this.#getTombstones(name);\n let tombstonesChanged = false;\n\n const existing = l[name].collection();\n const existingArr =\n existing.state === \"loaded\" && Array.isArray(existing.data)\n ? existing.data\n : [];\n\n for (const record of existingArr) {\n if (!newIds.has(record.id) && !tombstones.has(record.id)) {\n tombstones.add(record.id);\n tombstonesChanged = true;\n }\n }\n\n for (const record of newData) {\n if (tombstones.has(record.id)) {\n tombstones.delete(record.id);\n tombstonesChanged = true;\n }\n }\n\n if (tombstonesChanged) {\n localStorage.setItem(\n `${STORAGE_PREFIX}/tombstones/${name}`,\n JSON.stringify([...tombstones]),\n );\n }\n\n this.#markDirty();\n await l[name].save(newData);\n\n if (remote.ready()) {\n // Merge with any records added remotely since the last sync so we\n // don't accidentally overwrite them with our local-only view.\n const remoteCol = remote[name].collection();\n const dataForRemote =\n remoteCol.state === \"loaded\" && Array.isArray(remoteCol.data)\n ? this.#mergeRecords(name, newData, /** @type {typeof newData} */ (remoteCol.data))\n : newData;\n\n remote[name].save(dataForRemote).then(() => {\n const rev = this.#atproto()?.rev();\n if (rev) this.#storeRev(rev);\n this.#clearDirty();\n }).catch((err) => {\n console.error(err);\n });\n }\n },\n };\n }\n\n this.ready = () => true;\n\n // Sync when remote becomes ready\n this.effect(() => {\n const l = local();\n if (!l) return;\n\n this.effect(async () => {\n if (!remote.ready()) return;\n if (!(await this.isLeader())) return;\n this.#sync();\n });\n\n // Re-sync when firehose detects a remote change\n this.effect(async () => {\n const atproto = this.#atproto();\n if (!atproto) return;\n const firehose = atproto.firehoseRev();\n if (!firehose) return;\n if (!remote.ready()) return;\n if (!(await this.isLeader())) return;\n const touched = /** @type {string[]} */ (\n [...firehose.collections]\n .map((nsid) => NSID_TO_COLLECTION[nsid])\n .filter((name) => name !== undefined)\n );\n if (touched.length > 0) this.#sync(touched, firehose.rev);\n });\n });\n }\n\n // SIGNALS\n\n #localOutput = signal(\n /** @type {OutputElement | undefined} */ (undefined),\n );\n\n #syncing = false;\n\n /**\n * @returns {ATProtoOutputElement | undefined}\n */\n #atproto() {\n return /** @type {any} */ (this.output.signal());\n }\n\n // SYNC\n\n /**\n * @param {readonly string[]} collections\n * @param {string | null} [knownRev]\n */\n async #sync(collections = COLLECTIONS, knownRev = null) {\n if (this.#syncing) return;\n this.#syncing = true;\n\n try {\n const l = this.#localOutput.get();\n const remote = this.base();\n const atproto = this.#atproto();\n\n if (!l || !atproto || !remote.ready()) return;\n\n const isFull = collections === COLLECTIONS;\n /** @type {Record} */\n const lAny = l;\n /** @type {Record} */\n const remoteAny = remote;\n\n const remoteRev = knownRev ?? await atproto.getLatestCommit();\n if (!remoteRev) return;\n\n if (isFull) {\n const localRev = this.#getStoredRev();\n const dirty = this.#isDirty();\n if (localRev === remoteRev && !dirty) return;\n }\n\n // Fetch remote data for the affected collections only\n for (const name of collections) {\n await remoteAny[name].reload();\n }\n\n const localCollections = await Promise.all(\n collections.map((name) => Output.data(lAny[name])),\n );\n\n const localHasData = localCollections.some(\n (data) => Array.isArray(data) && data.length > 0,\n );\n\n if (!localHasData && !this.#isDirty()) {\n // Local is empty and clean — just pull remote\n for (const name of collections) {\n const remoteCol = remoteAny[name].collection();\n if (\n remoteCol.state === \"loaded\" && Array.isArray(remoteCol.data) &&\n remoteCol.data.length > 0\n ) {\n this.#trackIds(name, remoteCol.data);\n await lAny[name].save(remoteCol.data);\n }\n }\n } else {\n // Union merge\n for (const name of collections) {\n const localCol = lAny[name].collection();\n const remoteCol = remoteAny[name].collection();\n const localArr =\n localCol.state === \"loaded\" && Array.isArray(localCol.data)\n ? localCol.data\n : [];\n const remoteArr =\n remoteCol.state === \"loaded\" && Array.isArray(remoteCol.data)\n ? remoteCol.data\n : [];\n\n const merged = this.#mergeRecords(name, localArr, remoteArr);\n\n await lAny[name].save(merged);\n\n if (this.#differFromRemote(merged, remoteArr)) {\n await remoteAny[name].save(merged);\n }\n this.#trackIds(name, merged);\n }\n }\n\n this.#storeRev(atproto.rev() ?? remoteRev);\n if (isFull) this.#clearDirty();\n } catch (err) {\n console.warn(\"Sync failed:\", err);\n } finally {\n this.#syncing = false;\n }\n }\n\n /**\n * Union merge two record arrays by `id`.\n *\n * - Records only in local → keep (unless tombstoned)\n * - Records only in remote → keep (unless tombstoned)\n * - Records in both → pick the one with the later `updatedAt`,\n * falling back to local wins\n * - Records whose id is in the tombstone set are excluded\n *\n * @template {Record & { id: string }} T\n * @param {string} collection\n * @param {T[]} localArr\n * @param {T[]} remoteArr\n * @returns {T[]}\n */\n #mergeRecords(collection, localArr, remoteArr) {\n const tombstones = this.#getTombstones(collection);\n const knownIds = this.#getKnownIds(collection);\n const remoteIds = new Set(remoteArr.map((r) => r.id));\n\n /** @type {Map} */\n const merged = new Map();\n\n // Start with local records\n for (const record of localArr) {\n if (tombstones.has(record.id)) continue;\n // If previously synced but now absent from remote, it was deleted remotely.\n if (knownIds.has(record.id) && !remoteIds.has(record.id)) continue;\n merged.set(record.id, record);\n }\n\n // Merge remote records\n for (const record of remoteArr) {\n if (tombstones.has(record.id)) continue;\n\n // If this id was previously known but is absent from local,\n // it was deleted locally — skip it. Only apply this heuristic when\n // localArr is non-empty; an empty localArr could mean the local cache\n // was cleared rather than the user deleting everything.\n if (\n localArr.length > 0 &&\n knownIds.has(record.id) &&\n !merged.has(record.id)\n ) continue;\n\n const existing = merged.get(record.id);\n\n if (!existing) {\n merged.set(record.id, record);\n } else {\n // Both sides have this record — pick by updatedAt\n const lt = existing.updatedAt;\n const rt = record.updatedAt;\n if (lt && rt && rt > lt) {\n merged.set(record.id, record);\n }\n }\n }\n\n return [...merged.values()];\n }\n\n /**\n * @param {Array<{ id: string, updatedAt?: string }>} merged\n * @param {Array<{ id: string, updatedAt?: string }>} remote\n * @returns {boolean}\n */\n #differFromRemote(merged, remote) {\n if (merged.length !== remote.length) return true;\n const remoteMap = new Map(remote.map((r) => [r.id, r.updatedAt]));\n return merged.some((r) => remoteMap.get(r.id) !== r.updatedAt);\n }\n\n // TOMBSTONES & KNOWN IDS\n\n /**\n * @param {string} collection\n * @returns {Set}\n */\n #getTombstones(collection) {\n const raw = localStorage.getItem(\n `${STORAGE_PREFIX}/tombstones/${collection}`,\n );\n return raw ? new Set(JSON.parse(raw)) : new Set();\n }\n\n /**\n * @param {string} collection\n * @returns {Set}\n */\n #getKnownIds(collection) {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}/known/${collection}`);\n return raw ? new Set(JSON.parse(raw)) : new Set();\n }\n\n /**\n * Record all ids from a data array as known.\n *\n * @param {string} collection\n * @param {Array<{ id: string }>} data\n */\n #trackIds(collection, data) {\n const known = this.#getKnownIds(collection);\n for (const record of data) {\n known.add(record.id);\n }\n localStorage.setItem(\n `${STORAGE_PREFIX}/known/${collection}`,\n JSON.stringify([...known]),\n );\n }\n\n // REV & DIRTY FLAG\n\n /** @returns {string | null} */\n #getStoredRev() {\n return localStorage.getItem(`${STORAGE_PREFIX}/rev`);\n }\n\n /** @param {string | null} rev */\n #storeRev(rev) {\n if (rev) {\n localStorage.setItem(`${STORAGE_PREFIX}/rev`, rev);\n }\n }\n\n #markDirty() {\n localStorage.setItem(`${STORAGE_PREFIX}/dirty`, \"1\");\n }\n\n #clearDirty() {\n localStorage.removeItem(`${STORAGE_PREFIX}/dirty`);\n }\n\n /** @returns {boolean} */\n #isDirty() {\n return localStorage.getItem(`${STORAGE_PREFIX}/dirty`) === \"1\";\n }\n\n // LIFECYCLE\n\n /** @override */\n connectedCallback() {\n // Broadcast if needed\n if (this.hasAttribute(\"group\")) {\n this.broadcast(this.identifier, {});\n }\n\n super.connectedCallback();\n\n /** @type {OutputElement | null} */\n const local = this.root().querySelector(\"dop-indexed-db\");\n if (!local) throw new Error(\"Can't find local output\");\n\n customElements.whenDefined(local.localName).then(() => {\n this.#localOutput.value = local;\n });\n }\n\n // RENDER\n\n /**\n * @param {RenderArg} _\n */\n render({ html }) {\n return html`\n \n `;\n }\n}\n\nexport default ATProtoOutputSyncTransformer;\n\n////////////////////////////////////////////\n// REGISTER\n////////////////////////////////////////////\n\nexport const CLASS = ATProtoOutputSyncTransformer;\nexport const NAME = \"dtor-atproto-sync\";\n\ndefineElement(NAME, CLASS);\n"],"mappings":"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","names":["element_exports","__export","CLASS","NAME","element_default","COLLECTIONS","NSID_TO_COLLECTION","STORAGE_PREFIX","ATProtoOutputSyncTransformer","OutputTransformer","__name","remote","local","#localOutput","name","computed","l","c","#sync","newData","newIds","r","tombstones","#getTombstones","tombstonesChanged","existing","existingArr","record","#markDirty","remoteCol","dataForRemote","#mergeRecords","rev","#atproto","#storeRev","#clearDirty","err","atproto","firehose","touched","nsid","signal","#syncing","collections","knownRev","isFull","lAny","remoteAny","remoteRev","localRev","#getStoredRev","dirty","#isDirty","data","#trackIds","localCol","localArr","remoteArr","merged","#differFromRemote","collection","knownIds","#getKnownIds","remoteIds","lt","rt","remoteMap","raw","known","html","o","element_default","CLASS","NAME","defineElement"],"sourceRoot":"file:///var/home/toko/Code/tokono.ma/diffuse-artifacts/diffuse","file":"/chunk-GGTURPMJ.js.map"} \ No newline at end of file diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KCNS6M72.js.br b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KCNS6M72.js.br deleted file mode 100644 index 72980c55647a92ba6d20d01c0bd3941b40217c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 816 zcmb2X!N%|;YSrKOpC|3yX1)E`(!~dhvdVW}>Nv>xj#~%^)%c&jq= zU6C>x(5jp0k zJEgWu$ok-c-a9kpjk=9`cqez1{(Mw6T(;M;N0NHH}MfPlYD?V=u;o4%7vgvBa#6`)eiOj#7#aW-< z`OIpw)3tJUWcM7sM>>L2q~v@Uj!bV~uu9ap>89;e*Gp~_o+$0$$ZL|aSQb6W=)K{r zR7aM&#}fN4PJA71Jfm>_lnb^s_3V;$!Ap5Fv_b_vZ91+gnG|07*uf+|_250pKY5G` zYzo6`e>mkHJn@gYeCD15AMWTH{tm6#Wt``+=0w&;{x(H@EzxhhJ&N}am6omE()G~W zqUh|qtiURjTdv%@uO0euGD}nSwiR>IrZwg))h`cfoAQ1;X%Mw~s$kpx2Q7;C88sjF zou4xGwAf!4o7^>itEO0Mv%C`g-w|JL;I<_CeqL+S_x(A%YT0#rGXl?_YC9sLaAlQ3 zf{NMq@V1HDyua?+VmF6n^QS|fQ<-*NDtuUZc2a-imWaa>g6CI?&Qs6wIoiDO%F-Tgn-O3j*H zu;E*95#NN_JC$?r1;^6=f5$;$mW-sTPaK`Y?SrVOh3i@-@T13;>5{om>C_ diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js deleted file mode 100644 index a0414cd9..00000000 --- a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js +++ /dev/null @@ -1,29 +0,0 @@ -import{a as k}from"./chunk-VMYVLAL2.js";import{c as T,e as L}from"./chunk-R5QZUWYI.js";import{e as v}from"./chunk-73KFLR6T.js";import{j as S,o as f,p as b}from"./chunk-5HEUN32V.js";import{a as g,d as N}from"./chunk-TZW2CJI6.js";var V={};N(V,{AudioEngineItem:()=>w,CLASS:()=>D,NAME:()=>I,NAME_ITEM:()=>M,default:()=>U});var O="data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjM2LjEwMAAAAAAAAAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV6urq6urq6urq6urq6urq6urq6urq6urq6v////////////////////////////////8AAAAATGF2YzU2LjQxAAAAAAAAAAAAAAAAJAAAAAAAAAAAASDs90hvAAAAAAAAAAAAAAAAAAAA//MUZAAAAAGkAAAAAAAAA0gAAAAATEFN//MUZAMAAAGkAAAAAAAAA0gAAAAARTMu//MUZAYAAAGkAAAAAAAAA0gAAAAAOTku//MUZAkAAAGkAAAAAAAAA0gAAAAANVVV",E=class extends T{static{g(this,"AudioEngine")}static NAME="diffuse/engine/audio";constructor(){super(),this.state=this.state.bind(this)}#n=/iPhone|iPad|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;#e=new Map;#s=new Map;#i=f([]);#a=f(.75);items=this.#i.get;volume=this.#a.get;isPlaying=S(()=>{let t=this.items()?.[0];if(!t)return!1;let e=this.state(t.id);return e?e.isPlaying()||e.hasEnded()||e.duration()>0&&e.currentTime()===e.duration():!1});connectedCallback(){if(this.hasAttribute("group")){let i=this.broadcast(this.identifier,{adjustVolume:{strategy:"replicate",fn:this.adjustVolume},pause:{strategy:"leaderOnly",fn:this.pause},play:{strategy:"leaderOnly",fn:this.play},seek:{strategy:"leaderOnly",fn:this.seek},supply:{strategy:"replicate",fn:this.supply},items:{strategy:"leaderOnly",fn:this.items}});if(!i)return;this.adjustVolume=i.adjustVolume,this.pause=i.pause,this.play=i.play,this.seek=i.seek,this.supply=i.supply,this.broadcastingStatus().then(async a=>{a.leader||(this.#i.value=await i.items())})}super.connectedCallback();let t=`${this.constructor.prototype.constructor.NAME}/${this.group}/volume`,e=localStorage.getItem(t);e!=null&&this.#a.set(parseFloat(e)),this.effect(()=>{Array.from(this.querySelectorAll("de-audio-item")).forEach(i=>{let a=i;if(a.hasAttribute("preload"))return;let n=a.querySelector("audio");n&&(n.volume=this.#a.value)}),localStorage.setItem(t,this.#a.value.toString())}),this.broadcasted&&this.effect(async()=>{let i=await this.broadcastingStatus();b(()=>{i.leader&&i.initialLeader===!1&&(console.log("\u{1F9D9} Leadership acquired"),this.items().forEach(a=>{let n=this.#r(a.id);if(!n||(n.removeAttribute("initial-progress"),!n.audio))return;let d=n.$state.currentTime.value,r=g(()=>{this.seek({audioId:a.id,currentTime:d}),n.$state.isPlaying.value&&this.play({audioId:a.id})},"canPlay");n.audio.addEventListener("canplay",r,{once:!0}),n.audio.readyState===0?n.audio.load():r()}))})})}adjustVolume(t){t.audioId?this.#t(t.audioId,e=>{e.volume=t.volume}):this.#a.value=t.volume}pause({audioId:t}){this.#t(t,(e,i)=>{e.pause(),i.$state.isPlaying.set(!1)})}play({audioId:t,volume:e}){this.#t(t,(i,a)=>{if(i.volume=e??this.volume(),i.muted=!1,!i.isConnected)return;let n=i.play()||Promise.resolve();a.$state.isPlaying.set(!0),n.catch(d=>{if(!i.isConnected)return;console.error("Couldn't play audio automatically. Please resume playback manually.",d),a.$state.isPlaying.set(!1)})})}reload(t){this.#t(t.audioId,(e,i)=>{(e.readyState===0||e.error?.code===2)&&(e.load(),t.progress!==void 0&&i.setAttribute("initial-progress",JSON.stringify(t.progress)),t.play&&this.play({audioId:t.audioId,volume:e.volume}))})}seek({audioId:t,currentTime:e,percentage:i}){this.#t(t,a=>{e!=null?a.currentTime=e:i!=null&&!isNaN(a.duration)&&a.duration!==1/0&&(a.currentTime=i*a.duration)})}supply(t){let e=new Map(this.#i.value.map(s=>[s.id,s]));for(let s of t.audio)"stream"in s&&!e.has(s.id)&&!this.#s.has(s.id)&&(this.#s.set(s.id,s.stream),this.#o(s.id,s.stream,s.mimeType??"",s.seek,s.duration));let i=new Set(t.audio.map(s=>s.id));for(let[s,o]of this.#e)i.has(s)||(URL.revokeObjectURL(o),this.#e.delete(s));for(let s of this.#s.keys())i.has(s)||this.#s.delete(s);let a=t.audio.map(s=>{let o="stream"in s?this.#e.get(s.id):s.url;if(!o)throw new Error("Stream did not produce a media source url");return{id:s.id,isPreload:s.isPreload,mimeType:s.mimeType,progress:s.progress,track:s.track,url:o}}),n=a.some(s=>!e.has(s.id)),d=a.some(s=>e.get(s.id)?.isPreload!==s.isPreload),r=a.some(s=>e.get(s.id)?.url!==s.url),u=this.#i.value.find(s=>!s.isPreload),l=a.find(s=>!s.isPreload),p=this.#n&&u&&l&&(u.id!==l.id||u.url!==l.url);if((n||d||r)&&(p&&this.#r(u.id)?.resetState(),this.#i.value=a),r&&!n)for(let s of a)e.has(s.id)&&e.get(s.id)?.url!==s.url&&this.#t(s.id,o=>{(o.readyState===0||o.error)&&o.load()});if(p){let s=new Set(t.audio.filter(o=>"stream"in o).map(o=>o.id));for(let o of a)o.isPreload||s.has(o.id)||this.#t(o.id,$=>$.load())}t.play&&this.play(t.play)}async#o(t,e,i,a,n){let d=new MediaSource,r=URL.createObjectURL(d);if(this.#e.set(t,r),this.#s.delete(t),await Promise.resolve(),!this.#e.has(t)){URL.revokeObjectURL(r);return}let u=this.#r(t);if(!u){URL.revokeObjectURL(r),this.#e.delete(t);return}u.audio.src=r,await new Promise(c=>{d.addEventListener("sourceopen",c,{once:!0})}),n!==void 0&&(d.duration=n);let l=d.addSourceBuffer(i),p=e.getReader(),s=!1,o=0,$=g(()=>{if(!a)return;let c=u.audio,y=c.currentTime;for(let A=0;A{})},"onSeeking");u.audio.addEventListener("seeking",$);try{for(;;){if(!this.#e.has(t)){await p.cancel();break}let c,y;try{({done:c,value:y}=await p.read())}catch{c=!0}if(!this.#e.has(t))break;if(s){if(s=!1,l.updating&&await new Promise(A=>l.addEventListener("updateend",A,{once:!0})),await new Promise(A=>{l.addEventListener("updateend",A,{once:!0}),l.remove(0,1/0)}),!a)throw new Error("seekFn is undefined");p=(await a(o)).getReader();continue}if(c){d.readyState==="open"&&d.endOfStream();break}l.updating&&await new Promise(A=>l.addEventListener("updateend",A,{once:!0})),l.appendBuffer(y),await new Promise(A=>l.addEventListener("updateend",A,{once:!0}))}}catch(c){console.error("[audio engine] Stream error:",c),d.readyState==="open"&&d.endOfStream("decode")}finally{u.audio.removeEventListener("seeking",$)}}render({html:t}){let e=this.items(),i=this.#n?e.filter(r=>!r.isPreload):e,a=e.map(r=>r.id);this.querySelectorAll("de-audio-item").forEach(r=>{if(a.includes(r.id))return;let u=r.querySelector("source");u&&(u.src=O)});let n=this.group,d=i.map(r=>{let u=r.progress===void 0?"0":JSON.stringify(r.progress);return k(this.#n?"active":r.id,t` - - - - `)});return t` -
- ${d} -
- `}_state(t){return S(()=>{let e=this.#i.value,i=this.#r(t)?.state;return i?{...i}:void 0})}state(t){return this._state(t)()}#r(t){let e=this.querySelector(`de-audio-item[id="${t}"]:not([preload])`)??this.querySelector(`de-audio-item[id="${t}"]`);if(e)return e}#t(t,e){let i=this.#r(t);i&&e(i.audio,i)}},U=E,w=class extends T{static{g(this,"AudioEngineItem")}static NAME="diffuse/engine/audio/item";static observedAttributes=["preload"];constructor(){super(),this.$state={currentTime:f(0),duration:f(0),hasEnded:f(!1),isPlaying:f(!1),isPreload:f(this.hasAttribute("preload")),loadingState:f("initialisation"),progress:S(()=>{let t=this.$state.currentTime.value,e=this.$state.duration.value;return!e||isNaN(e)||e===1/0?0:t/e})}}attributeChangedCallback(t,e,i){super.attributeChangedCallback(t,e,i),t==="preload"&&this.$state.isPreload.set(i!==null)}async connectedCallback(){let t=this.audio;if(t.addEventListener("canplay",this.canplayEvent),t.addEventListener("durationchange",this.durationchangeEvent),t.addEventListener("ended",this.endedEvent),t.addEventListener("error",this.errorEvent),t.addEventListener("pause",this.pauseEvent),t.addEventListener("play",this.playEvent),t.addEventListener("playing",this.playingEvent),t.addEventListener("suspend",this.suspendEvent),t.addEventListener("timeupdate",this.timeupdateEvent),t.addEventListener("waiting",this.waitingEvent),this.hasAttribute("preload")||this.$state.loadingState.set("loading"),this.hasAttribute("group")){let e=this.broadcast(this.identifier,{getCurrentTime:{strategy:"leaderOnly",fn:this.$state.currentTime.get},getDuration:{strategy:"leaderOnly",fn:this.$state.duration.get},getHasEnded:{strategy:"leaderOnly",fn:this.$state.hasEnded.get},getIsPlaying:{strategy:"leaderOnly",fn:this.$state.isPlaying.get},getIsPreload:{strategy:"leaderOnly",fn:this.$state.isPreload.get},getLoadingState:{strategy:"leaderOnly",fn:this.$state.loadingState.get},setCurrentTime:{strategy:"replicate",fn:this.$state.currentTime.set},setDuration:{strategy:"replicate",fn:this.$state.duration.set},setHasEnded:{strategy:"replicate",fn:this.$state.hasEnded.set},setIsPlaying:{strategy:"replicate",fn:this.$state.isPlaying.set},setIsPreload:{strategy:"replicate",fn:this.$state.isPreload.set},setLoadingState:{strategy:"replicate",fn:this.$state.loadingState.set}},{assumeLeadership:(await this.engine?.broadcastingStatus())?.leader});e&&(this.$state.currentTime.set=e.setCurrentTime,this.$state.duration.set=e.setDuration,this.$state.hasEnded.set=e.setHasEnded,this.$state.isPlaying.set=e.setIsPlaying,this.$state.isPreload.set=e.setIsPreload,this.$state.loadingState.set=e.setLoadingState,b(async()=>{this.$state.currentTime.value=await e.getCurrentTime(),this.$state.duration.value=await e.getDuration(),this.$state.hasEnded.value=await e.getHasEnded(),this.$state.isPlaying.value=await e.getIsPlaying(),this.$state.isPreload.value=await e.getIsPreload(),this.$state.loadingState.value=await e.getLoadingState()}))}super.connectedCallback()}get state(){return{id:this.id,mimeType:this.getAttribute("mime-type")??void 0,url:this.getAttribute("url")??"",currentTime:this.$state.currentTime.get,duration:this.$state.duration.get,hasEnded:this.$state.hasEnded.get,isPlaying:this.$state.isPlaying.get,isPreload:this.$state.isPreload.get,loadingState:this.$state.loadingState.get,progress:this.$state.progress}}resetState(){this.$state.currentTime.set(0),this.$state.duration.set(0),this.$state.hasEnded.set(!1),this.$state.isPlaying.set(!1),this.$state.loadingState.set("loading")}get audio(){let t=this.querySelector("audio");if(t)return t;throw new Error("Cannot find child audio element")}get engine(){let t=this.closest("de-audio");return t||null}canplayEvent(t){let e=t.target,i=h(e);if(i?.hasAttribute("initial-progress")&&e.duration&&!isNaN(e.duration)){let a=JSON.parse(i.getAttribute("initial-progress")??"0");a!==0&&!isNaN(e.duration)&&e.duration!==1/0&&(e.currentTime=e.duration*a),i.removeAttribute("initial-progress")}P(t)}durationchangeEvent(t){let e=t.target;isNaN(e.duration)||h(e)?.$state.duration.set(e.duration)}endedEvent(t){let e=t.target;e.currentTime=0,h(e)?.$state.hasEnded.set(!0)}errorEvent(t){let e=t.target,i=e.error?.code||0;h(e)?.$state.loadingState.set({error:{code:i}})}pauseEvent(t){let e=t.target;h(e)?.$state.isPlaying.set(!1)}playEvent(t){let e=t.target,i=h(e);i?.$state.hasEnded.set(!1),i?.$state.isPlaying.set(!0),e.readyState>=2&&P(t)}playingEvent(t){P(t)}suspendEvent(t){P(t)}timeupdateEvent(t){let e=t.target;isNaN(e.duration)||e.duration===0||h(e)?.$state.currentTime.set(e.currentTime)}waitingEvent(t){C(t);let e=t.target;if(e.seeking||e.networkState!==HTMLMediaElement.NETWORK_IDLE)return;let i=h(e);if(!i||i.hasAttribute("preload"))return;let a=!isNaN(e.duration)&&e.duration>0&&e.duration!==1/0?e.currentTime/e.duration:0;a>0&&i.setAttribute("initial-progress",JSON.stringify(a)),!(e.buffered.length>0)&&(e.load(),e.addEventListener("canplay",()=>{i.$state.isPlaying.get()&&i.engine?.play({audioId:i.id})},{once:!0}))}};function h(m){let t=m.closest("de-audio-item");return t||null}g(h,"engineItem");function P(m){let t=m.target;h(t)?.$state.loadingState.set("loaded")}g(P,"finishedLoading");function C(m){let t=m.target;if(t.readyState<4){let e=h(t);if(e?.hasAttribute("preload"))return;e?.$state.loadingState.set("loading")}}g(C,"initiateLoading");var D=E,I="de-audio",M="de-audio-item";L(I,E);L(M,w);export{U as a,w as b,D as c,I as d,M as e,V as f}; - -//# sourceMappingURL=./chunk-KFSOQOUF.js.map \ No newline at end of file diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js.br b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js.br deleted file mode 100644 index e20f21bc50afcb629ced63cd14e23c4f18dca76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4041 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 B*y#WO diff --git a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js.map b/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js.map deleted file mode 100644 index 46122fdb..00000000 --- a/artifacts/bafybeieb4rce45j6hdeabruxk4bj3bf3zylu32cozjzrbjosyla77nkrqm/chunk-KFSOQOUF.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["/components/engine/audio/element.js"],"sourcesContent":["import { keyed } from \"lit-html/directives/keyed.js\";\n\nimport {\n BroadcastableDiffuseElement,\n defineElement,\n nothing,\n} from \"~/common/element.js\";\nimport { computed, signal, untracked } from \"~/common/signal.js\";\n\n/**\n * @import {Actions, AudioUrl, AudioState, AudioStateReadOnly, LoadingState} from \"@specs/components/engine/audio/types.d.ts\"\n * @import {RenderArg} from \"~/common/element.d.ts\"\n * @import {SignalReader} from \"~/common/signal.d.ts\"\n */\n\n////////////////////////////////////////////\n// CONSTANTS\n////////////////////////////////////////////\nconst SILENT_MP3 =\n \"data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjM2LjEwMAAAAAAAAAAAAAAA//OEAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAAEAAABIADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV6urq6urq6urq6urq6urq6urq6urq6urq6v////////////////////////////////8AAAAATGF2YzU2LjQxAAAAAAAAAAAAAAAAJAAAAAAAAAAAASDs90hvAAAAAAAAAAAAAAAAAAAA//MUZAAAAAGkAAAAAAAAA0gAAAAATEFN//MUZAMAAAGkAAAAAAAAA0gAAAAARTMu//MUZAYAAAGkAAAAAAAAA0gAAAAAOTku//MUZAkAAAGkAAAAAAAAA0gAAAAANVVV\";\n\n////////////////////////////////////////////\n// ELEMENT\n////////////////////////////////////////////\n\n/**\n * @implements {Actions}\n */\nclass AudioEngine extends BroadcastableDiffuseElement {\n static NAME = \"diffuse/engine/audio\";\n\n constructor() {\n super();\n\n this.state = this.state.bind(this);\n }\n\n /**\n * Mobile Safari caps the number of live media elements and behaves poorly\n * when fresh