most-box 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -16
- package/electron/main.js +72 -8
- package/electron/preload.js +6 -0
- package/out/404/index.html +2 -2
- package/out/404.html +2 -2
- package/out/__next.__PAGE__.txt +6 -6
- package/out/__next._full.txt +23 -20
- package/out/__next._head.txt +3 -3
- package/out/__next._index.txt +8 -6
- package/out/__next._tree.txt +6 -4
- package/out/_next/static/chunks/0-n3pg7th.zza.js +1 -0
- package/out/_next/static/chunks/0.4j.0k5a64vg.js +1 -0
- package/out/_next/static/chunks/0.e2avjgna_b2.js +1 -0
- package/out/_next/static/chunks/0.ozi1_x2.m.~.js +1 -0
- package/out/_next/static/chunks/0.t5wlt51zou5.js +1 -0
- package/out/_next/static/chunks/0.w4hkvap~bva.js +1 -0
- package/out/_next/static/chunks/00d9h1tddnnnd.js +1 -0
- package/out/_next/static/chunks/00tkdqwxch-3s.js +1 -0
- package/out/_next/static/chunks/01l3o90g~1z42.js +1 -0
- package/out/_next/static/chunks/01mfky9camw6i.js +1 -0
- package/out/_next/static/chunks/01r.v-pqs1vrm.js +1 -0
- package/out/_next/static/chunks/03edqrb4zdj~g.js +31 -0
- package/out/_next/static/chunks/03h_6oo-gqkhz.js +1 -0
- package/out/_next/static/chunks/{0ho~log~~-jwp.css → 03h~nhgj0hv3p.css} +1 -1
- package/out/_next/static/chunks/04hcgsanv1hhu.js +1 -0
- package/out/_next/static/chunks/05g2q0w5b34.g.js +1 -0
- package/out/_next/static/chunks/05of77xycbt8~.js +1 -0
- package/out/_next/static/chunks/05zwemzfjx3sh.js +1 -0
- package/out/_next/static/chunks/06dpc5df94.v1.js +1 -0
- package/out/_next/static/chunks/06e1~1-z_ic9a.js +1 -0
- package/out/_next/static/chunks/075s7sn.ns~u5.js +1 -0
- package/out/_next/static/chunks/07dynrbvd3.f4.js +1 -0
- package/out/_next/static/chunks/07p~uva5pwgwe.js +1 -0
- package/out/_next/static/chunks/07r9nn-pzlgg1.js +1 -0
- package/out/_next/static/chunks/07td.jq7xff84.css +1 -0
- package/out/_next/static/chunks/08.72abkgwy9g.js +1 -0
- package/out/_next/static/chunks/08576xhv~~jck.js +1 -0
- package/out/_next/static/chunks/08u211~k~qu52.js +1 -0
- package/out/_next/static/chunks/098.p.2-zm4p7.js +1 -0
- package/out/_next/static/chunks/09ngvtajm7e5y.js +1 -0
- package/out/_next/static/chunks/09ps~-43n5qyo.js +1 -0
- package/out/_next/static/chunks/09v7_0gclxr46.js +1 -0
- package/out/_next/static/chunks/09yql86dir9c4.js +1 -0
- package/out/_next/static/chunks/09zmlfljowj1~.js +1 -0
- package/out/_next/static/chunks/0_s~ebb-7b2hr.js +1 -0
- package/out/_next/static/chunks/0_w-0-2z5oqd_.js +1 -0
- package/out/_next/static/chunks/0adx~d-j05c9d.css +24 -0
- package/out/_next/static/chunks/0ao1lbi4b.sfa.js +1 -0
- package/out/_next/static/chunks/0aq.rc9woa2nz.js +1 -0
- package/out/_next/static/chunks/0bld2u_ld~va2.js +1 -0
- package/out/_next/static/chunks/0bliugh5lxw55.js +1 -0
- package/out/_next/static/chunks/0cn9a7aimbdzq.js +1 -0
- package/out/_next/static/chunks/0d3f-nk3c.2re.js +1 -0
- package/out/_next/static/chunks/0dtohpf7~3d12.js +1 -0
- package/out/_next/static/chunks/0e-3e8h7g99yf.js +1 -0
- package/out/_next/static/chunks/0e531nije_ln2.js +1 -0
- package/out/_next/static/chunks/0e5zvj_rh0z3m.js +1 -0
- package/out/_next/static/chunks/0etes81d_cihn.js +1 -0
- package/out/_next/static/chunks/0f4y~rkk-n81e.js +1 -0
- package/out/_next/static/chunks/0fk~0~p7ivfn1.js +1 -0
- package/out/_next/static/chunks/0fw6juc~lsj3z.js +1 -0
- package/out/_next/static/chunks/0g0u7785a73vo.js +1 -0
- package/out/_next/static/chunks/0g_a~e050bgzg.css +1 -0
- package/out/_next/static/chunks/0g_fpgh7drfda.js +1 -0
- package/out/_next/static/chunks/{0n~dq4kpx9xxx.js → 0gcsdf57gcm6h.js} +1 -1
- package/out/_next/static/chunks/0gwian.hp3-92.js +1 -0
- package/out/_next/static/chunks/0gze5uso1mbe9.js +1 -0
- package/out/_next/static/chunks/0h4r.qtmpa6eh.js +1 -0
- package/out/_next/static/chunks/0hf.aosc-7172.js +1 -0
- package/out/_next/static/chunks/0hgz35c1ejbs9.js +1 -0
- package/out/_next/static/chunks/0hpev4am9jpmu.css +1 -0
- package/out/_next/static/chunks/0hrw-r.xmvmsq.js +1 -0
- package/out/_next/static/chunks/0hzg4al.v~8~m.js +1 -0
- package/out/_next/static/chunks/0ip9xrols_83o.js +1 -0
- package/out/_next/static/chunks/0j4-d0qf.v~kn.js +1 -0
- package/out/_next/static/chunks/0jhdeq.j9_02m.js +1 -0
- package/out/_next/static/chunks/0jy63h3i-y69i.js +1 -0
- package/out/_next/static/chunks/0kdnx_u-60k9s.js +1 -0
- package/out/_next/static/chunks/0kq~edq42o1-c.js +1 -0
- package/out/_next/static/chunks/0l5_.uqb-uqb8.js +1 -0
- package/out/_next/static/chunks/0l682p362d-5w.js +1 -0
- package/out/_next/static/chunks/0m68p9txef5rs.js +1 -0
- package/out/_next/static/chunks/0mex8svsiv-2l.js +1 -0
- package/out/_next/static/chunks/0mme-fm5d2oz2.js +1 -0
- package/out/_next/static/chunks/0myp4sjagr~h0.js +1 -0
- package/out/_next/static/chunks/0myq9gs8szydh.js +1 -0
- package/out/_next/static/chunks/0n.qlfk~z7o.6.js +1 -0
- package/out/_next/static/chunks/0n4t80gjc3q5h.js +1 -0
- package/out/_next/static/chunks/0o9ce4cyf76by.js +736 -0
- package/out/_next/static/chunks/0oz3yl6_-716p.js +1 -0
- package/out/_next/static/chunks/0p0sv~fuddvgr.js +1 -0
- package/out/_next/static/chunks/0pt.5cg1t09qs.js +1 -0
- package/out/_next/static/chunks/0q0ksgxg98xgd.js +1 -0
- package/out/_next/static/chunks/0qgx9t4jx16ua.css +1 -0
- package/out/_next/static/chunks/0qqupeexg83u7.js +1 -0
- package/out/_next/static/chunks/0rb-ri481.kc9.js +1 -0
- package/out/_next/static/chunks/0rsnmahfd.59p.js +1 -0
- package/out/_next/static/chunks/0rt6rgnvr-s_p.js +1 -0
- package/out/_next/static/chunks/0runh28p_gg6..js +1 -0
- package/out/_next/static/chunks/0shy.t1fwqcev.js +1 -0
- package/out/_next/static/chunks/{0d3shmwh5_nmn.js → 0t2xr05rlu96l.js} +1 -1
- package/out/_next/static/chunks/0t6h56rhg1y5i.js +1 -0
- package/out/_next/static/chunks/0tdqd1zunusgk.js +1 -0
- package/out/_next/static/chunks/0ujbnp38x63ek.js +1 -0
- package/out/_next/static/chunks/0ukyg~tkm~h2m.css +1 -0
- package/out/_next/static/chunks/0v68pdrp54lb-.js +1 -0
- package/out/_next/static/chunks/0vsm0m5sxrb.3.js +1 -0
- package/out/_next/static/chunks/0vzlz.iboqo3c.js +1 -0
- package/out/_next/static/chunks/0w87vbpkf-ogd.js +1 -0
- package/out/_next/static/chunks/0wtf0xsiicxx6.js +1 -0
- package/out/_next/static/chunks/0xdwau5k2augv.css +4 -0
- package/out/_next/static/chunks/0xgg0~kmf3gd-.js +1 -0
- package/out/_next/static/chunks/0xj24-70ptdzp.js +1 -0
- package/out/_next/static/chunks/0xxlx772fr3x4.js +1 -0
- package/out/_next/static/chunks/0y.li-~3oybew.js +1 -0
- package/out/_next/static/chunks/0yl2t7cs-n_ng.js +1 -0
- package/out/_next/static/chunks/0yq3kh.hchtm_.js +1 -0
- package/out/_next/static/chunks/0ys0l5au.9c2c.js +1 -0
- package/out/_next/static/chunks/0z48pmi6buytt.js +1 -0
- package/out/_next/static/chunks/0zapnvgy89mg..js +1 -0
- package/out/_next/static/chunks/0~.-vxi5oc.r0.js +1 -0
- package/out/_next/static/chunks/0~3ik-hfp9s-7.js +1 -0
- package/out/_next/static/chunks/0~4f5p6tvn1lq.js +1 -0
- package/out/_next/static/chunks/0~_0ys.2whxbw.js +1 -0
- package/out/_next/static/chunks/0~_ui9l7.2sxf.js +1 -0
- package/out/_next/static/chunks/1037jlyw5~7ht.js +1 -0
- package/out/_next/static/chunks/1045hfzu533z0.js +1 -0
- package/out/_next/static/chunks/104e5nmc.c-pl.js +1 -0
- package/out/_next/static/chunks/109taw1pbh-0b.js +1 -0
- package/out/_next/static/chunks/10x7~onqwp338.js +1 -0
- package/out/_next/static/chunks/10ynz1dy483wf.js +1 -0
- package/out/_next/static/chunks/11hds.mg~4_r-.js +1 -0
- package/out/_next/static/chunks/11ibzaklcauw~.js +1 -0
- package/out/_next/static/chunks/11z.0s6.42b.p.js +1 -0
- package/out/_next/static/chunks/12-9n56l0y3yr.js +1 -0
- package/out/_next/static/chunks/126enaq~f7scl.js +1 -0
- package/out/_next/static/chunks/12nr19.nnn6s3.js +5 -0
- package/out/_next/static/chunks/{0qub_r0x_r-e9.css → 12pep-2t-qg4n.css} +1 -1
- package/out/_next/static/chunks/1380op_pfk.qo.js +1 -0
- package/out/_next/static/chunks/146oiw1bggtn4.js +1 -0
- package/out/_next/static/chunks/14_inksek_rth.js +2 -0
- package/out/_next/static/chunks/14_po2rb_arn4.js +1 -0
- package/out/_next/static/chunks/14a4fwbiq.l3z.js +1 -0
- package/out/_next/static/chunks/14cowsqn95m1k.js +1 -0
- package/out/_next/static/chunks/14dtd3l03v.kx.js +1 -0
- package/out/_next/static/chunks/14tm3qa-v9o-4.js +1 -0
- package/out/_next/static/chunks/15-o4kb-evqd7.js +1 -0
- package/out/_next/static/chunks/153-sz7s.qml2.js +1 -0
- package/out/_next/static/chunks/157z7bowux3xj.js +1 -0
- package/out/_next/static/chunks/15m1_677az2cm.js +1 -0
- package/out/_next/static/chunks/15v.~.ne6ogkk.js +1 -0
- package/out/_next/static/chunks/16i.qbk8t8gf_.js +1 -0
- package/out/_next/static/chunks/16u9f35gylw8l.js +1 -0
- package/out/_next/static/chunks/16xls5tt_68lx.js +1 -0
- package/out/_next/static/chunks/17ajyb5ogk5yj.js +1 -0
- package/out/_next/static/chunks/17dyfxbq8yz8n.js +1 -0
- package/out/_next/static/chunks/180zln9pcq9ih.js +1 -0
- package/out/_next/static/chunks/1814izi5gh.kp.js +1 -0
- package/out/_next/static/chunks/turbopack-0xta0kqwzkf28.js +1 -0
- package/out/_next/static/media/KaTeX_AMS-Regular.0b~8ki5y928w2.woff +0 -0
- package/out/_next/static/media/KaTeX_AMS-Regular.0p1vbqd84i2~o.woff2 +0 -0
- package/out/_next/static/media/KaTeX_AMS-Regular.173t6ktr7uf-w.ttf +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Bold.01-pzluls4zgb.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Bold.0x2v1lwn~880f.woff +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Bold.16zv5fax0h0ka.ttf +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Regular.02i3z7wig438t.ttf +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Regular.0rysu1t-ncjq8.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Caligraphic-Regular.10927swgekwun.woff +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Bold.0e-16u10iuyyf.woff +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Bold.0et27v~3~4uhe.ttf +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Bold.0w23i72~hprpq.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Regular.0b.riegzdfue2.woff +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Regular.0rekyoa-52fj_.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Fraktur-Regular.0vjwa15znhk~4.ttf +0 -0
- package/out/_next/static/media/KaTeX_Main-Bold.09i7~607shf-h.ttf +0 -0
- package/out/_next/static/media/KaTeX_Main-Bold.09lmynrorhcbw.woff +0 -0
- package/out/_next/static/media/KaTeX_Main-Bold.16pfc63_du6mx.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Main-BoldItalic.0cp37g7x1q8h6.woff +0 -0
- package/out/_next/static/media/KaTeX_Main-BoldItalic.0d54rk08rx11s.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Main-BoldItalic.15j6k~hix2t_0.ttf +0 -0
- package/out/_next/static/media/KaTeX_Main-Italic.0382gqciexmbu.woff +0 -0
- package/out/_next/static/media/KaTeX_Main-Italic.06o5nq0_91v60.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Main-Italic.0su4i6mm18-wo.ttf +0 -0
- package/out/_next/static/media/KaTeX_Main-Regular.08zh8z.7shijf.ttf +0 -0
- package/out/_next/static/media/KaTeX_Main-Regular.0diheg01zyoph.woff +0 -0
- package/out/_next/static/media/KaTeX_Main-Regular.0kaf-ag2_wkm-.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Math-BoldItalic.0ajzxypnbx1h1.ttf +0 -0
- package/out/_next/static/media/KaTeX_Math-BoldItalic.0ck1myuerwyqw.woff +0 -0
- package/out/_next/static/media/KaTeX_Math-BoldItalic.0ja97dn.cpc87.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Math-Italic.09xkhecjcn5r9.woff +0 -0
- package/out/_next/static/media/KaTeX_Math-Italic.0x23a-bmp-5tg.ttf +0 -0
- package/out/_next/static/media/KaTeX_Math-Italic.0zrha2c4sl2je.woff2 +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Bold.05a9.pc1j_zx9.woff2 +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Bold.0jcl-ayi1uun0.woff +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Bold.0re8y.dm7.mt5.ttf +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Italic.0a0234dc3s62j.woff2 +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Italic.0judofdln9731.woff +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Italic.10z1iap9pfus8.ttf +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Regular.0h9yjlugq4q_e.woff +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Regular.0v6gcj32-czft.woff2 +0 -0
- package/out/_next/static/media/KaTeX_SansSerif-Regular.0zm18kga42ebc.ttf +0 -0
- package/out/_next/static/media/KaTeX_Script-Regular.0c4.h-mer83d_.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Script-Regular.0q14y6zkzlpob.ttf +0 -0
- package/out/_next/static/media/KaTeX_Script-Regular.0ze6v4r_-99oy.woff +0 -0
- package/out/_next/static/media/KaTeX_Size1-Regular.013x6a4ierotp.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Size1-Regular.0kidw0oi.m68o.woff +0 -0
- package/out/_next/static/media/KaTeX_Size1-Regular.0m6y-i6wfokni.ttf +0 -0
- package/out/_next/static/media/KaTeX_Size2-Regular.0blpmluwilgbg.woff +0 -0
- package/out/_next/static/media/KaTeX_Size2-Regular.0d5inmyp-tyv3.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Size2-Regular.0wnhnvj-.k9d5.ttf +0 -0
- package/out/_next/static/media/KaTeX_Size3-Regular.01h0xm_sfctj3.woff +0 -0
- package/out/_next/static/media/KaTeX_Size3-Regular.0iukctyhw5j56.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Size3-Regular.0jl8mqyf4gzpn.ttf +0 -0
- package/out/_next/static/media/KaTeX_Size4-Regular.0w3.rb_c4stzk.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Size4-Regular.0wr_9l81-mu06.ttf +0 -0
- package/out/_next/static/media/KaTeX_Size4-Regular.12tvaesf3.zl3.woff +0 -0
- package/out/_next/static/media/KaTeX_Typewriter-Regular.0c4zdxz~8frhm.woff2 +0 -0
- package/out/_next/static/media/KaTeX_Typewriter-Regular.0cgrzn5l3kao5.woff +0 -0
- package/out/_next/static/media/KaTeX_Typewriter-Regular.128~qc3858otl.ttf +0 -0
- package/out/_not-found/__next._full.txt +21 -19
- package/out/_not-found/__next._head.txt +3 -3
- package/out/_not-found/__next._index.txt +8 -6
- package/out/_not-found/__next._not-found.__PAGE__.txt +4 -4
- package/out/_not-found/__next._not-found.txt +3 -3
- package/out/_not-found/__next._tree.txt +3 -2
- package/out/_not-found/index.html +2 -2
- package/out/_not-found/index.txt +21 -19
- package/out/admin/__next._full.txt +23 -0
- package/out/admin/__next._head.txt +5 -0
- package/out/admin/__next._index.txt +9 -0
- package/out/admin/__next._tree.txt +5 -0
- package/out/admin/__next.admin.__PAGE__.txt +9 -0
- package/out/admin/__next.admin.txt +5 -0
- package/out/admin/index.html +15 -0
- package/out/admin/index.txt +23 -0
- package/out/app/__next._full.txt +15 -13
- package/out/app/__next._head.txt +3 -3
- package/out/app/__next._index.txt +8 -6
- package/out/app/__next._tree.txt +4 -2
- package/out/app/__next.app.__PAGE__.txt +4 -4
- package/out/app/__next.app.txt +3 -4
- package/out/app/index.html +2 -2
- package/out/app/index.txt +15 -13
- package/out/chat/__next._full.txt +16 -14
- package/out/chat/__next._head.txt +3 -3
- package/out/chat/__next._index.txt +8 -6
- package/out/chat/__next._tree.txt +5 -3
- package/out/chat/__next.chat.__PAGE__.txt +4 -4
- package/out/chat/__next.chat.txt +4 -5
- package/out/chat/index.html +2 -2
- package/out/chat/index.txt +16 -14
- package/out/chat/join/__next._full.txt +25 -0
- package/out/chat/join/__next._head.txt +5 -0
- package/out/chat/join/__next._index.txt +9 -0
- package/out/chat/join/__next._tree.txt +5 -0
- package/out/chat/join/__next.chat.join.__PAGE__.txt +9 -0
- package/out/chat/join/__next.chat.join.txt +5 -0
- package/out/chat/join/__next.chat.txt +5 -0
- package/out/chat/join/index.html +15 -0
- package/out/chat/join/index.txt +25 -0
- package/out/download/__next._full.txt +34 -33
- package/out/download/__next._head.txt +3 -3
- package/out/download/__next._index.txt +8 -6
- package/out/download/__next._tree.txt +6 -4
- package/out/download/__next.download.__PAGE__.txt +13 -14
- package/out/download/__next.download.txt +3 -3
- package/out/download/index.html +2 -2
- package/out/download/index.txt +34 -33
- package/out/index.html +2 -2
- package/out/index.txt +23 -20
- package/out/note/__next._full.txt +24 -0
- package/out/{changelog → note}/__next._head.txt +3 -3
- package/out/note/__next._index.txt +9 -0
- package/out/note/__next._tree.txt +4 -0
- package/out/note/__next.note.__PAGE__.txt +9 -0
- package/out/note/__next.note.txt +5 -0
- package/out/note/index.html +15 -0
- package/out/note/index.txt +24 -0
- package/out/ping/__next._full.txt +23 -20
- package/out/ping/__next._head.txt +3 -3
- package/out/ping/__next._index.txt +8 -6
- package/out/ping/__next._tree.txt +6 -4
- package/out/ping/__next.ping.__PAGE__.txt +5 -5
- package/out/ping/__next.ping.txt +4 -4
- package/out/ping/index.html +2 -2
- package/out/ping/index.txt +23 -20
- package/out/web3/__next._full.txt +16 -14
- package/out/web3/__next._head.txt +3 -3
- package/out/web3/__next._index.txt +8 -6
- package/out/web3/__next._tree.txt +5 -3
- package/out/web3/__next.web3.__PAGE__.txt +4 -4
- package/out/web3/__next.web3.txt +4 -5
- package/out/web3/ed25519/__next._full.txt +14 -12
- package/out/web3/ed25519/__next._head.txt +3 -3
- package/out/web3/ed25519/__next._index.txt +8 -6
- package/out/web3/ed25519/__next._tree.txt +5 -3
- package/out/web3/ed25519/__next.web3.ed25519.__PAGE__.txt +2 -2
- package/out/web3/ed25519/__next.web3.ed25519.txt +3 -3
- package/out/web3/ed25519/__next.web3.txt +4 -5
- package/out/web3/ed25519/index.html +1 -1
- package/out/web3/ed25519/index.txt +14 -12
- package/out/web3/index.html +2 -2
- package/out/web3/index.txt +16 -14
- package/out/web3/tools/__next._full.txt +14 -12
- package/out/web3/tools/__next._head.txt +3 -3
- package/out/web3/tools/__next._index.txt +8 -6
- package/out/web3/tools/__next._tree.txt +5 -3
- package/out/web3/tools/__next.web3.tools.__PAGE__.txt +2 -2
- package/out/web3/tools/__next.web3.tools.txt +3 -3
- package/out/web3/tools/__next.web3.txt +4 -5
- package/out/web3/tools/index.html +1 -1
- package/out/web3/tools/index.txt +14 -12
- package/package.json +30 -13
- package/server/index.js +188 -901
- package/server/src/config.js +5 -1
- package/server/src/core/channelAttachment.js +68 -0
- package/server/src/core/cid.js +6 -71
- package/server/src/core/cidTopic.js +29 -0
- package/server/src/core/mostLink.js +88 -0
- package/server/src/http/access.js +123 -0
- package/server/src/http/app.js +1095 -0
- package/server/src/http/errors.js +35 -0
- package/server/src/http/nodeLogs.js +53 -0
- package/server/src/http/nodeStatus.js +146 -0
- package/server/src/http/staticFiles.js +84 -0
- package/server/src/http/uploads.js +114 -0
- package/server/src/index.js +1539 -301
- package/server/src/node/config.js +191 -0
- package/server/src/node/logs.js +94 -0
- package/server/src/utils/api.js +359 -8
- package/server/src/utils/auth.js +63 -0
- package/server/src/utils/dateTime.js +30 -0
- package/server/src/utils/downloadMessages.js +89 -0
- package/server/src/utils/errors.js +14 -0
- package/server/src/utils/mostWallet.js +185 -1
- package/server/src/utils/mp.js +2 -26
- package/server/src/utils/noteBackup.js +116 -0
- package/server/src/utils/noteUtils.js +128 -0
- package/server/src/utils/userIdentity.js +8 -61
- package/out/_next/static/chunks/003jnm.v5tzw5.js +0 -1
- package/out/_next/static/chunks/00re8v.gbcywn.js +0 -1
- package/out/_next/static/chunks/00s106sbq8t9v.js +0 -1
- package/out/_next/static/chunks/012hi627qrdnn.js +0 -1
- package/out/_next/static/chunks/0174xh3wfsjm1.js +0 -2
- package/out/_next/static/chunks/02~o2nmo5pmy1.js +0 -1
- package/out/_next/static/chunks/07t.dhhokszz5.css +0 -1
- package/out/_next/static/chunks/0_wia9ofmsi1c.css +0 -2
- package/out/_next/static/chunks/0ah8fihozo2_u.js +0 -5
- package/out/_next/static/chunks/0bzupvr5gt3k9.js +0 -31
- package/out/_next/static/chunks/0e_h0d3ekzks8.css +0 -1
- package/out/_next/static/chunks/0gdluj423gso1.js +0 -1
- package/out/_next/static/chunks/0gmoiq06srjay.css +0 -1
- package/out/_next/static/chunks/0imkasy7kb67u.js +0 -1
- package/out/_next/static/chunks/0jjc_b9q_ldi2.js +0 -1
- package/out/_next/static/chunks/0jl~j62iz2uvr.js +0 -1
- package/out/_next/static/chunks/0lqslm813wk_h.js +0 -1
- package/out/_next/static/chunks/0q782fxxd0lx~.js +0 -1
- package/out/_next/static/chunks/0slwj0c46k5cu.js +0 -1
- package/out/_next/static/chunks/0sorqk.oc6b7j.css +0 -1
- package/out/_next/static/chunks/0tapzqc6hgvx-.js +0 -1
- package/out/_next/static/chunks/0xsc7z5x8n7wg.js +0 -1
- package/out/_next/static/chunks/0zm~gys2jwl0g.js +0 -1
- package/out/_next/static/chunks/turbopack-0a_g3u0ud~jb8.js +0 -1
- package/out/changelog/__next._full.txt +0 -22
- package/out/changelog/__next._index.txt +0 -7
- package/out/changelog/__next._tree.txt +0 -3
- package/out/changelog/__next.changelog.__PAGE__.txt +0 -10
- package/out/changelog/__next.changelog.txt +0 -5
- package/out/changelog/index.html +0 -15
- package/out/changelog/index.txt +0 -22
- package/out/docs/__next._full.txt +0 -22
- package/out/docs/__next._head.txt +0 -5
- package/out/docs/__next._index.txt +0 -7
- package/out/docs/__next._tree.txt +0 -3
- package/out/docs/__next.docs.__PAGE__.txt +0 -10
- package/out/docs/__next.docs.txt +0 -5
- package/out/docs/getting-started/__next._full.txt +0 -22
- package/out/docs/getting-started/__next._head.txt +0 -5
- package/out/docs/getting-started/__next._index.txt +0 -7
- package/out/docs/getting-started/__next._tree.txt +0 -3
- package/out/docs/getting-started/__next.docs.getting-started.__PAGE__.txt +0 -10
- package/out/docs/getting-started/__next.docs.getting-started.txt +0 -5
- package/out/docs/getting-started/__next.docs.txt +0 -5
- package/out/docs/getting-started/index.html +0 -15
- package/out/docs/getting-started/index.txt +0 -22
- package/out/docs/index.html +0 -15
- package/out/docs/index.txt +0 -22
- /package/out/_next/static/{iOB2EBwOGZ0iYW7Lbg9u_ → t7ZIeQpVvjz4a7-5Tt-VK}/_buildManifest.js +0 -0
- /package/out/_next/static/{iOB2EBwOGZ0iYW7Lbg9u_ → t7ZIeQpVvjz4a7-5Tt-VK}/_clientMiddlewareManifest.js +0 -0
- /package/out/_next/static/{iOB2EBwOGZ0iYW7Lbg9u_ → t7ZIeQpVvjz4a7-5Tt-VK}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function getApiErrorStatus(err) {
|
|
2
|
+
switch (err.code) {
|
|
3
|
+
case 'VALIDATION_ERROR':
|
|
4
|
+
case 'PATH_SECURITY_ERROR':
|
|
5
|
+
case 'FILE_SIZE_ERROR':
|
|
6
|
+
return 400
|
|
7
|
+
case 'PEER_NOT_FOUND':
|
|
8
|
+
return 503
|
|
9
|
+
case 'INTEGRITY_ERROR':
|
|
10
|
+
return 422
|
|
11
|
+
case 'CONFLICT':
|
|
12
|
+
return 409
|
|
13
|
+
case 'PERMISSION_ERROR':
|
|
14
|
+
return 403
|
|
15
|
+
case 'ENGINE_NOT_INITIALIZED':
|
|
16
|
+
return 503
|
|
17
|
+
default:
|
|
18
|
+
return 500
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function errorJson(c, err) {
|
|
23
|
+
return c.json(
|
|
24
|
+
{
|
|
25
|
+
error: err.message,
|
|
26
|
+
code: err.code || 'UNKNOWN',
|
|
27
|
+
},
|
|
28
|
+
getApiErrorStatus(err)
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function badRequestOrAppError(c, err) {
|
|
33
|
+
if (err.code) return errorJson(c, err)
|
|
34
|
+
return c.json({ error: err.message }, 400)
|
|
35
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const NODE_LOG_FILTERS = {
|
|
2
|
+
join: ['join', 'joined', 'topic'],
|
|
3
|
+
pull: ['pull', 'p2p'],
|
|
4
|
+
verify: ['verify', 'verified', 'integrity', 'download:success'],
|
|
5
|
+
serve: ['seed', 'seeding', 'holding', 'publish:success', 'topic:joined'],
|
|
6
|
+
error: ['error', 'failed', 'fail'],
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function getNodeLogSearchText(log = {}) {
|
|
10
|
+
let dataText = ''
|
|
11
|
+
try {
|
|
12
|
+
dataText = JSON.stringify(log.data || {})
|
|
13
|
+
} catch {}
|
|
14
|
+
|
|
15
|
+
return [log.level, log.event, log.message, dataText]
|
|
16
|
+
.map(value => String(value || '').toLowerCase())
|
|
17
|
+
.join(' ')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function matchesNodeLogFilter(log, filter) {
|
|
21
|
+
const normalized = String(filter || 'all')
|
|
22
|
+
.trim()
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
if (!normalized || normalized === 'all') return true
|
|
25
|
+
|
|
26
|
+
const text = getNodeLogSearchText(log)
|
|
27
|
+
if (normalized === 'error') {
|
|
28
|
+
return (
|
|
29
|
+
log.level === 'error' ||
|
|
30
|
+
NODE_LOG_FILTERS.error.some(term => text.includes(term))
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const terms = NODE_LOG_FILTERS[normalized] || [normalized]
|
|
35
|
+
return terms.some(term => text.includes(term))
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function listFilteredNodeLogs(nodeLogger, options = {}) {
|
|
39
|
+
const limit = Math.max(1, Math.min(Number(options.limit) || 100, 1000))
|
|
40
|
+
const filter = String(options.filter || 'all')
|
|
41
|
+
.trim()
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
const query = String(options.query || '')
|
|
44
|
+
.trim()
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
const logs = nodeLogger
|
|
47
|
+
.list(1000)
|
|
48
|
+
.filter(log => matchesNodeLogFilter(log, filter))
|
|
49
|
+
.filter(log => !query || getNodeLogSearchText(log).includes(query))
|
|
50
|
+
.slice(0, limit)
|
|
51
|
+
|
|
52
|
+
return { filter, query, logs }
|
|
53
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { DEFAULT_NODE_HOST } from '../node/config.js'
|
|
5
|
+
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
const PACKAGE_JSON = readPackageJson()
|
|
8
|
+
|
|
9
|
+
function readPackageJson() {
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(
|
|
12
|
+
fs.readFileSync(
|
|
13
|
+
path.join(__dirname, '..', '..', '..', 'package.json'),
|
|
14
|
+
'utf-8'
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
} catch {
|
|
18
|
+
return { version: '0.0.0' }
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function getNetworkAddresses(appPort) {
|
|
23
|
+
return {
|
|
24
|
+
port: appPort,
|
|
25
|
+
addresses: [
|
|
26
|
+
{ type: 'local', ip: 'localhost', label: '本机', iface: 'loopback' },
|
|
27
|
+
],
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function buildNodeStatus(engine, configStore, appPort) {
|
|
32
|
+
const config = configStore.getNodeConfig()
|
|
33
|
+
const { remoteInvites, ...publicConfig } = config
|
|
34
|
+
const remoteInviteCount = remoteInvites.length
|
|
35
|
+
const storage = await engine.getStorageStats()
|
|
36
|
+
const network = engine.getNetworkStatus()
|
|
37
|
+
const holdings = engine.listHoldings()
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
status: 'online',
|
|
41
|
+
version: PACKAGE_JSON.version,
|
|
42
|
+
uptimeSeconds: Math.floor(process.uptime()),
|
|
43
|
+
nodeId: engine.getNodeId(),
|
|
44
|
+
host: DEFAULT_NODE_HOST,
|
|
45
|
+
port: appPort,
|
|
46
|
+
listen: getNetworkAddresses(appPort),
|
|
47
|
+
dataPath: configStore.getDataPath(),
|
|
48
|
+
config: {
|
|
49
|
+
...publicConfig,
|
|
50
|
+
remoteInviteCount,
|
|
51
|
+
remoteInviteConfigured: remoteInviteCount > 0,
|
|
52
|
+
},
|
|
53
|
+
policy: {
|
|
54
|
+
maxFileSizeBytes: config.maxFileSizeBytes,
|
|
55
|
+
},
|
|
56
|
+
capacity: {
|
|
57
|
+
configuredBytes: config.capacityBytes,
|
|
58
|
+
usedBytes: storage.used,
|
|
59
|
+
freeBytes: Math.max(0, config.capacityBytes - storage.used),
|
|
60
|
+
},
|
|
61
|
+
storage,
|
|
62
|
+
network,
|
|
63
|
+
holdings,
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function buildOpenApiSpec(appPort) {
|
|
68
|
+
return {
|
|
69
|
+
openapi: '3.1.0',
|
|
70
|
+
info: {
|
|
71
|
+
title: 'MostBox Node Daemon API',
|
|
72
|
+
version: PACKAGE_JSON.version,
|
|
73
|
+
},
|
|
74
|
+
servers: [{ url: `http://localhost:${appPort}` }],
|
|
75
|
+
paths: {
|
|
76
|
+
'/api/node/status': {
|
|
77
|
+
get: {
|
|
78
|
+
summary: 'Get node daemon status',
|
|
79
|
+
responses: { 200: { description: 'Node status' } },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
'/api/node/config': {
|
|
83
|
+
get: {
|
|
84
|
+
summary: 'Get node daemon config',
|
|
85
|
+
responses: { 200: { description: 'Node config' } },
|
|
86
|
+
},
|
|
87
|
+
post: {
|
|
88
|
+
summary: 'Update node daemon config',
|
|
89
|
+
responses: { 200: { description: 'Updated config' } },
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
'/api/node/policy': {
|
|
93
|
+
get: {
|
|
94
|
+
summary: 'Get local storage limits',
|
|
95
|
+
responses: { 200: { description: 'Storage limits' } },
|
|
96
|
+
},
|
|
97
|
+
post: {
|
|
98
|
+
summary: 'Update local storage limits',
|
|
99
|
+
responses: { 200: { description: 'Updated policy' } },
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
'/api/node/policy/evaluate': {
|
|
103
|
+
post: {
|
|
104
|
+
summary: 'Evaluate a local file against storage limits',
|
|
105
|
+
responses: { 200: { description: 'Storage limit decision' } },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
'/api/node/holdings': {
|
|
109
|
+
get: {
|
|
110
|
+
summary: 'List CID replicas held by this node',
|
|
111
|
+
responses: { 200: { description: 'Node holdings' } },
|
|
112
|
+
},
|
|
113
|
+
post: {
|
|
114
|
+
summary: 'Add a held CID replica record and join its topic',
|
|
115
|
+
responses: { 200: { description: 'Created holding' } },
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
'/api/node/logs': {
|
|
119
|
+
get: {
|
|
120
|
+
summary: 'Read recent node daemon logs',
|
|
121
|
+
responses: { 200: { description: 'Node logs' } },
|
|
122
|
+
},
|
|
123
|
+
delete: {
|
|
124
|
+
summary: 'Clear node daemon logs',
|
|
125
|
+
responses: { 200: { description: 'Logs cleared' } },
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
'/api/node/diagnostics': {
|
|
129
|
+
get: {
|
|
130
|
+
summary: 'Export node diagnostics snapshot',
|
|
131
|
+
responses: { 200: { description: 'Diagnostics snapshot' } },
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
'/api/p2p/pull': {
|
|
135
|
+
post: {
|
|
136
|
+
summary: 'Pull a full file replica by CID',
|
|
137
|
+
responses: { 200: { description: 'Pull task result' } },
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function getPackageVersion() {
|
|
145
|
+
return PACKAGE_JSON.version
|
|
146
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { fileURLToPath } from 'node:url'
|
|
4
|
+
import { serveStatic } from '@hono/node-server/serve-static'
|
|
5
|
+
|
|
6
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
|
|
8
|
+
const MIME_TYPES = {
|
|
9
|
+
'.html': 'text/html; charset=utf-8',
|
|
10
|
+
'.js': 'application/javascript; charset=utf-8',
|
|
11
|
+
'.css': 'text/css; charset=utf-8',
|
|
12
|
+
'.json': 'application/json',
|
|
13
|
+
'.png': 'image/png',
|
|
14
|
+
'.jpg': 'image/jpeg',
|
|
15
|
+
'.jpeg': 'image/jpeg',
|
|
16
|
+
'.gif': 'image/gif',
|
|
17
|
+
'.webp': 'image/webp',
|
|
18
|
+
'.svg': 'image/svg+xml',
|
|
19
|
+
'.ico': 'image/x-icon',
|
|
20
|
+
'.mp4': 'video/mp4',
|
|
21
|
+
'.webm': 'video/webm',
|
|
22
|
+
'.ogg': 'video/ogg',
|
|
23
|
+
'.mp3': 'audio/mpeg',
|
|
24
|
+
'.wav': 'audio/wav',
|
|
25
|
+
'.flac': 'audio/flac',
|
|
26
|
+
'.aac': 'audio/aac',
|
|
27
|
+
'.m4a': 'audio/mp4',
|
|
28
|
+
'.opus': 'audio/opus',
|
|
29
|
+
'.woff2': 'font/woff2',
|
|
30
|
+
'.woff': 'font/woff',
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getMimeType(fileName) {
|
|
34
|
+
const ext = path.extname(fileName).toLowerCase()
|
|
35
|
+
return MIME_TYPES[ext] || 'application/octet-stream'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function registerStaticRoutes(app) {
|
|
39
|
+
const publicDir = path.join(__dirname, '..', '..', '..', 'out')
|
|
40
|
+
|
|
41
|
+
app.get('/static/*', serveStatic({ root: './out' }))
|
|
42
|
+
app.get('/_next/*', serveStatic({ root: './out' }))
|
|
43
|
+
|
|
44
|
+
app.all('/api/*', c => {
|
|
45
|
+
return c.json({ error: 'Not found' }, 404)
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
app.get('*', async c => {
|
|
49
|
+
const pathname = c.req.path
|
|
50
|
+
const filePath = path.join(publicDir, pathname)
|
|
51
|
+
const resolved = path.resolve(filePath)
|
|
52
|
+
const resolvedPublic = path.resolve(publicDir)
|
|
53
|
+
|
|
54
|
+
if (
|
|
55
|
+
!resolved.startsWith(resolvedPublic + path.sep) &&
|
|
56
|
+
resolved !== resolvedPublic
|
|
57
|
+
) {
|
|
58
|
+
return c.json({ error: 'Not found' }, 404)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (fs.existsSync(filePath)) {
|
|
62
|
+
const stat = fs.statSync(filePath)
|
|
63
|
+
if (stat.isFile()) {
|
|
64
|
+
c.header('Content-Type', getMimeType(filePath))
|
|
65
|
+
return c.body(fs.readFileSync(filePath))
|
|
66
|
+
}
|
|
67
|
+
if (stat.isDirectory()) {
|
|
68
|
+
const dirIndex = path.join(filePath, 'index.html')
|
|
69
|
+
if (fs.existsSync(dirIndex)) {
|
|
70
|
+
c.header('Content-Type', 'text/html; charset=utf-8')
|
|
71
|
+
return c.body(fs.readFileSync(dirIndex, 'utf-8'))
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const indexPath = path.join(publicDir, 'index.html')
|
|
77
|
+
if (fs.existsSync(indexPath)) {
|
|
78
|
+
c.header('Content-Type', 'text/html; charset=utf-8')
|
|
79
|
+
return c.body(fs.readFileSync(indexPath, 'utf-8'))
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return c.json({ error: 'Not found' }, 404)
|
|
83
|
+
})
|
|
84
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import os from 'node:os'
|
|
4
|
+
import Busboy from 'busboy'
|
|
5
|
+
import { MAX_FILE_SIZE } from '../config.js'
|
|
6
|
+
|
|
7
|
+
export const UPLOAD_TMP_DIR = path.join(os.tmpdir(), 'most-box-uploads')
|
|
8
|
+
|
|
9
|
+
function decodeFilenameFromHeader(headerStr) {
|
|
10
|
+
if (!headerStr) return null
|
|
11
|
+
|
|
12
|
+
const filenameStarMatch = headerStr.match(
|
|
13
|
+
/filename\*=(?:UTF-8''|utf-8'')([^;\r\n]+)/i
|
|
14
|
+
)
|
|
15
|
+
if (filenameStarMatch) {
|
|
16
|
+
return decodeURIComponent(filenameStarMatch[1])
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const filenameMatch = headerStr.match(/filename="([^"]+)"/)
|
|
20
|
+
if (filenameMatch) {
|
|
21
|
+
const rawFilename = filenameMatch[1]
|
|
22
|
+
try {
|
|
23
|
+
const buf = Buffer.from(rawFilename, 'latin1')
|
|
24
|
+
const decoded = buf.toString('utf8')
|
|
25
|
+
if (decoded.includes('\ufffd')) {
|
|
26
|
+
return rawFilename
|
|
27
|
+
}
|
|
28
|
+
return decoded
|
|
29
|
+
} catch {
|
|
30
|
+
return rawFilename
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const filenamePlainMatch = headerStr.match(/filename=([^;\r\n]+)/)
|
|
35
|
+
if (filenamePlainMatch) {
|
|
36
|
+
return filenamePlainMatch[1].trim()
|
|
37
|
+
}
|
|
38
|
+
return null
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function parseMultipartBusboy(req, maxUploadSize = MAX_FILE_SIZE) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
if (!fs.existsSync(UPLOAD_TMP_DIR)) {
|
|
44
|
+
fs.mkdirSync(UPLOAD_TMP_DIR, { recursive: true })
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const busboy = Busboy({
|
|
48
|
+
headers: req.headers,
|
|
49
|
+
limits: {
|
|
50
|
+
fileSize: maxUploadSize,
|
|
51
|
+
files: 1,
|
|
52
|
+
fields: 0,
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const result = { filePath: null, filename: null }
|
|
57
|
+
let fileSize = 0
|
|
58
|
+
let writeStream = null
|
|
59
|
+
let tempPath = null
|
|
60
|
+
|
|
61
|
+
busboy.on('file', (name, stream, info) => {
|
|
62
|
+
result.filename = decodeFilenameFromHeader(`filename="${info.filename}"`)
|
|
63
|
+
tempPath = path.join(
|
|
64
|
+
UPLOAD_TMP_DIR,
|
|
65
|
+
`upload_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`
|
|
66
|
+
)
|
|
67
|
+
writeStream = fs.createWriteStream(tempPath)
|
|
68
|
+
|
|
69
|
+
stream.on('data', chunk => {
|
|
70
|
+
fileSize += chunk.length
|
|
71
|
+
if (fileSize > maxUploadSize) {
|
|
72
|
+
stream.destroy()
|
|
73
|
+
writeStream.destroy()
|
|
74
|
+
fs.unlink(tempPath, () => {})
|
|
75
|
+
reject(new Error('File too large'))
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
stream.on('error', () => {
|
|
81
|
+
if (tempPath) fs.unlink(tempPath, () => {})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
stream.pipe(writeStream)
|
|
85
|
+
|
|
86
|
+
writeStream.on('finish', () => {
|
|
87
|
+
result.filePath = tempPath
|
|
88
|
+
resolve(result)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
writeStream.on('error', err => {
|
|
92
|
+
if (tempPath) fs.unlink(tempPath, () => {})
|
|
93
|
+
reject(err)
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
busboy.on('error', err => {
|
|
98
|
+
if (tempPath) fs.unlink(tempPath, () => {})
|
|
99
|
+
reject(err)
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
busboy.on('close', () => {
|
|
103
|
+
if (!result.filename) {
|
|
104
|
+
resolve(null)
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
req.on('error', err => {
|
|
109
|
+
if (tempPath) fs.unlink(tempPath, () => {})
|
|
110
|
+
reject(err)
|
|
111
|
+
})
|
|
112
|
+
req.pipe(busboy)
|
|
113
|
+
})
|
|
114
|
+
}
|