@jesec/flood 0.0.0-master.8daf3f8 → 0.0.0-master.8dbd865

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.
Files changed (407) hide show
  1. package/CHANGELOG.md +606 -103
  2. package/README.md +125 -45
  3. package/SECURITY.md +27 -0
  4. package/dist/assets/icon_128x128.png +0 -0
  5. package/dist/assets/icon_192x192.png +0 -0
  6. package/dist/assets/icon_256x256.png +0 -0
  7. package/dist/assets/icon_384x384.png +0 -0
  8. package/dist/assets/icon_512x512.png +0 -0
  9. package/dist/assets/icon_96x96.png +0 -0
  10. package/dist/assets/icon_maskable.png +0 -0
  11. package/dist/assets/icon_maskable_180x180.png +0 -0
  12. package/dist/assets/index.html +1 -1
  13. package/dist/assets/manifest.json +35 -7
  14. package/dist/assets/static/css/662.37bdb6f87f387ec14604.css +1 -0
  15. package/dist/assets/static/css/main.1e285a62d2e5127de06b.css +1 -0
  16. package/dist/assets/static/js/179.372e151d.chunk.js +1 -0
  17. package/dist/assets/static/js/662.1b1f1092.chunk.js +1 -0
  18. package/dist/assets/static/js/963.94abcb99.chunk.js +1 -0
  19. package/dist/assets/static/js/996.f0e63eaa.chunk.js +1 -0
  20. package/dist/assets/static/js/flag0.56298b91.chunk.js +1 -0
  21. package/dist/assets/static/js/flag1.badfc781.chunk.js +1 -0
  22. package/dist/assets/static/js/flag2.c5a910ff.chunk.js +1 -0
  23. package/dist/assets/static/js/flag3.2a4050b4.chunk.js +1 -0
  24. package/dist/assets/static/js/i18n0.b0c0bc82.chunk.js +1 -0
  25. package/dist/assets/static/js/i18n1.cb04b1f5.chunk.js +1 -0
  26. package/dist/assets/static/js/i18n10.8ca66096.chunk.js +1 -0
  27. package/dist/assets/static/js/i18n11.b66895ae.chunk.js +1 -0
  28. package/dist/assets/static/js/i18n12.76af2306.chunk.js +1 -0
  29. package/dist/assets/static/js/i18n13.d6692432.chunk.js +1 -0
  30. package/dist/assets/static/js/i18n14.22da7cd2.chunk.js +1 -0
  31. package/dist/assets/static/js/i18n15.bbfb5738.chunk.js +1 -0
  32. package/dist/assets/static/js/i18n16.c77ad464.chunk.js +1 -0
  33. package/dist/assets/static/js/i18n17.e5397215.chunk.js +1 -0
  34. package/dist/assets/static/js/i18n18.2faa4785.chunk.js +1 -0
  35. package/dist/assets/static/js/i18n19.a5db1b01.chunk.js +1 -0
  36. package/dist/assets/static/js/i18n2.7d1aed47.chunk.js +1 -0
  37. package/dist/assets/static/js/i18n20.cba7bf0c.chunk.js +1 -0
  38. package/dist/assets/static/js/i18n21.a27eaf09.chunk.js +1 -0
  39. package/dist/assets/static/js/i18n22.fa878be7.chunk.js +1 -0
  40. package/dist/assets/static/js/i18n23.5c647e79.chunk.js +1 -0
  41. package/dist/assets/static/js/i18n24.6b14986d.chunk.js +1 -0
  42. package/dist/assets/static/js/i18n25.afe69894.chunk.js +1 -0
  43. package/dist/assets/static/js/i18n26.eac16996.chunk.js +1 -0
  44. package/dist/assets/static/js/i18n27.8d32b1f7.chunk.js +1 -0
  45. package/dist/assets/static/js/i18n28.d64c3baf.chunk.js +1 -0
  46. package/dist/assets/static/js/i18n3.14d4def3.chunk.js +1 -0
  47. package/dist/assets/static/js/i18n4.5c77cde4.chunk.js +1 -0
  48. package/dist/assets/static/js/i18n5.430ea15f.chunk.js +1 -0
  49. package/dist/assets/static/js/i18n6.3c79cffd.chunk.js +1 -0
  50. package/dist/assets/static/js/i18n8.6a62aa52.chunk.js +1 -0
  51. package/dist/assets/static/js/i18n9.d06ff92d.chunk.js +1 -0
  52. package/dist/assets/static/js/main.fd1408d5.js +1 -0
  53. package/dist/assets/static/media/ad.1b24595d.png +0 -0
  54. package/dist/assets/static/media/ae.4dd8f55e.png +0 -0
  55. package/dist/assets/static/media/af.4ce660eb.png +0 -0
  56. package/dist/assets/static/media/ag.fd9409e4.png +0 -0
  57. package/dist/assets/static/media/al.a297aacf.png +0 -0
  58. package/dist/assets/static/media/am.c84ee0cf.png +0 -0
  59. package/dist/assets/static/media/ao.a7c9214e.png +0 -0
  60. package/dist/assets/static/media/ar.7e57ef92.png +0 -0
  61. package/dist/assets/static/media/at.5aa9728a.png +0 -0
  62. package/dist/assets/static/media/au.155b51d8.png +0 -0
  63. package/dist/assets/static/media/az.63afef5b.png +0 -0
  64. package/dist/assets/static/media/ba.5ce8f273.png +0 -0
  65. package/dist/assets/static/media/bb.f369fc62.png +0 -0
  66. package/dist/assets/static/media/bd.516278fc.png +0 -0
  67. package/dist/assets/static/media/be.08ec4a8d.png +0 -0
  68. package/dist/assets/static/media/bf.50bfcb31.png +0 -0
  69. package/dist/assets/static/media/bg.d9346b96.png +0 -0
  70. package/dist/assets/static/media/bh.f06d5914.png +0 -0
  71. package/dist/assets/static/media/bi.4923e3a3.png +0 -0
  72. package/dist/assets/static/media/bj.019fa79b.png +0 -0
  73. package/dist/assets/static/media/bn.077671e2.png +0 -0
  74. package/dist/assets/static/media/bo.8fb15fc6.png +0 -0
  75. package/dist/assets/static/media/br.ec051f0c.png +0 -0
  76. package/dist/assets/static/media/bs.a74a126f.png +0 -0
  77. package/dist/assets/static/media/bt.4217b804.png +0 -0
  78. package/dist/assets/static/media/bw.21fe1567.png +0 -0
  79. package/dist/assets/static/media/by.d247fe16.png +0 -0
  80. package/dist/assets/static/media/bz.98ec59f6.png +0 -0
  81. package/dist/assets/static/media/ca.25743e11.png +0 -0
  82. package/dist/assets/static/media/cd.a5bfda53.png +0 -0
  83. package/dist/assets/static/media/cf.de7d5d92.png +0 -0
  84. package/dist/assets/static/media/cg.a47b626b.png +0 -0
  85. package/dist/assets/static/media/ch.445f47a1.png +0 -0
  86. package/dist/assets/static/media/ci.a6009c5b.png +0 -0
  87. package/dist/assets/static/media/cl.de1d715e.png +0 -0
  88. package/dist/assets/static/media/cm.3ce8a86a.png +0 -0
  89. package/dist/assets/static/media/cn.e6a26073.png +0 -0
  90. package/dist/assets/static/media/co.e9244faa.png +0 -0
  91. package/dist/assets/static/media/cr.c895e035.png +0 -0
  92. package/dist/assets/static/media/cu.e486c055.png +0 -0
  93. package/dist/assets/static/media/cv.a9585acf.png +0 -0
  94. package/dist/assets/static/media/cw.df13039d.png +0 -0
  95. package/dist/assets/static/media/cy.b31f43a9.png +0 -0
  96. package/dist/assets/static/media/cz.8ec5948b.png +0 -0
  97. package/dist/assets/static/media/de.d12f391a.png +0 -0
  98. package/dist/assets/static/media/dj.154c3580.png +0 -0
  99. package/dist/assets/static/media/dk.da382fe2.png +0 -0
  100. package/dist/assets/static/media/dm.f452e6cd.png +0 -0
  101. package/dist/assets/static/media/do.c6bd7637.png +0 -0
  102. package/dist/assets/static/media/dz.672a69c0.png +0 -0
  103. package/dist/assets/static/media/ec.349d9bd7.png +0 -0
  104. package/dist/assets/static/media/ee.2396205f.png +0 -0
  105. package/dist/assets/static/media/eg.ccbf3f45.png +0 -0
  106. package/dist/assets/static/media/eh.af65674a.png +0 -0
  107. package/dist/assets/static/media/er.21afb638.png +0 -0
  108. package/dist/assets/static/media/es.2a6eaee4.png +0 -0
  109. package/dist/assets/static/media/et.8beb65c8.png +0 -0
  110. package/dist/assets/static/media/fi.331f70fd.png +0 -0
  111. package/dist/assets/static/media/fj.7724d800.png +0 -0
  112. package/dist/assets/static/media/fm.eeaf71e9.png +0 -0
  113. package/dist/assets/static/media/fr.5d5ab008.png +0 -0
  114. package/dist/assets/static/media/ga.77ed474c.png +0 -0
  115. package/dist/assets/static/media/gb.e00065bf.png +0 -0
  116. package/dist/assets/static/media/gd.b4522267.png +0 -0
  117. package/dist/assets/static/media/ge.91a7654d.png +0 -0
  118. package/dist/assets/static/media/gh.4759f92f.png +0 -0
  119. package/dist/assets/static/media/gm.81cd9f75.png +0 -0
  120. package/dist/assets/static/media/gn.9f3d376e.png +0 -0
  121. package/dist/assets/static/media/gq.e8ad58be.png +0 -0
  122. package/dist/assets/static/media/gr.26f3ac0b.png +0 -0
  123. package/dist/assets/static/media/gt.9d81c52e.png +0 -0
  124. package/dist/assets/static/media/gw.dc906982.png +0 -0
  125. package/dist/assets/static/media/gy.a4f62b6c.png +0 -0
  126. package/dist/assets/static/media/hk.56555c3f.png +0 -0
  127. package/dist/assets/static/media/hn.64ee6aad.png +0 -0
  128. package/dist/assets/static/media/hr.93ebecd3.png +0 -0
  129. package/dist/assets/static/media/ht.42ca1596.png +0 -0
  130. package/dist/assets/static/media/hu.bb30f05d.png +0 -0
  131. package/dist/assets/static/media/id.2cb49f2d.png +0 -0
  132. package/dist/assets/static/media/ie.b4dd1f19.png +0 -0
  133. package/dist/assets/static/media/il.cd1d1faf.png +0 -0
  134. package/dist/assets/static/media/in.2df03847.png +0 -0
  135. package/dist/assets/static/media/iq.a9b670ab.png +0 -0
  136. package/dist/assets/static/media/ir.9a3de085.png +0 -0
  137. package/dist/assets/static/media/is.d88f4fc9.png +0 -0
  138. package/dist/assets/static/media/it.b73713e3.png +0 -0
  139. package/dist/assets/static/media/je.0353f56a.png +0 -0
  140. package/dist/assets/static/media/jm.20330ef4.png +0 -0
  141. package/dist/assets/static/media/jo.eb66f1d1.png +0 -0
  142. package/dist/assets/static/media/jp.63e382ae.png +0 -0
  143. package/dist/assets/static/media/ke.ab2e43b8.png +0 -0
  144. package/dist/assets/static/media/kg.2c47c2af.png +0 -0
  145. package/dist/assets/static/media/kh.4732c810.png +0 -0
  146. package/dist/assets/static/media/ki.5fba09fd.png +0 -0
  147. package/dist/assets/static/media/km.7bbed3e9.png +0 -0
  148. package/dist/assets/static/media/kn.a9595a16.png +0 -0
  149. package/dist/assets/static/media/kp.8a4dc30a.png +0 -0
  150. package/dist/assets/static/media/kr.5273be1d.png +0 -0
  151. package/dist/assets/static/media/ks.99f78645.png +0 -0
  152. package/dist/assets/static/media/kw.af3521bc.png +0 -0
  153. package/dist/assets/static/media/kz.ea47ef79.png +0 -0
  154. package/dist/assets/static/media/la.78a598d7.png +0 -0
  155. package/dist/assets/static/media/lb.7a7c15a9.png +0 -0
  156. package/dist/assets/static/media/lc.6083a4ff.png +0 -0
  157. package/dist/assets/static/media/li.61c564a4.png +0 -0
  158. package/dist/assets/static/media/lk.6fa85802.png +0 -0
  159. package/dist/assets/static/media/lr.8063f7db.png +0 -0
  160. package/dist/assets/static/media/ls.901ddb71.png +0 -0
  161. package/dist/assets/static/media/lt.9209ace3.png +0 -0
  162. package/dist/assets/static/media/lu.c9872bc1.png +0 -0
  163. package/dist/assets/static/media/lv.7bcacf0a.png +0 -0
  164. package/dist/assets/static/media/ly.2830aa63.png +0 -0
  165. package/dist/assets/static/media/ma.ce5f697b.png +0 -0
  166. package/dist/assets/static/media/mc.4bd5d57a.png +0 -0
  167. package/dist/assets/static/media/md.fb4b5bdf.png +0 -0
  168. package/dist/assets/static/media/me.1f1d1772.png +0 -0
  169. package/dist/assets/static/media/mg.89101bd2.png +0 -0
  170. package/dist/assets/static/media/mh.ff11dff7.png +0 -0
  171. package/dist/assets/static/media/mk.8420e604.png +0 -0
  172. package/dist/assets/static/media/ml.4db47c66.png +0 -0
  173. package/dist/assets/static/media/mm.8e4ac30a.png +0 -0
  174. package/dist/assets/static/media/mn.dc1daa04.png +0 -0
  175. package/dist/assets/static/media/mr.7cbca6d0.png +0 -0
  176. package/dist/assets/static/media/mt.28a4b863.png +0 -0
  177. package/dist/assets/static/media/mu.d93db6c7.png +0 -0
  178. package/dist/assets/static/media/mv.7d026bf1.png +0 -0
  179. package/dist/assets/static/media/mw.960cd4fb.png +0 -0
  180. package/dist/assets/static/media/mx.39b78eb2.png +0 -0
  181. package/dist/assets/static/media/my.916a8392.png +0 -0
  182. package/dist/assets/static/media/mz.facb4ea3.png +0 -0
  183. package/dist/assets/static/media/na.472666a9.png +0 -0
  184. package/dist/assets/static/media/ne.d774701f.png +0 -0
  185. package/dist/assets/static/media/ng.7b06a49f.png +0 -0
  186. package/dist/assets/static/media/ni.7140131c.png +0 -0
  187. package/dist/assets/static/media/nl.4c04aa96.png +0 -0
  188. package/dist/assets/static/media/no.c19eb00d.png +0 -0
  189. package/dist/assets/static/media/np.54fb4f2f.png +0 -0
  190. package/dist/assets/static/media/nr.7527cc38.png +0 -0
  191. package/dist/assets/static/media/nz.738be05b.png +0 -0
  192. package/dist/assets/static/media/om.b25e0a17.png +0 -0
  193. package/dist/assets/static/media/pa.b28a9059.png +0 -0
  194. package/dist/assets/static/media/pe.c1fc1d96.png +0 -0
  195. package/dist/assets/static/media/pg.380115db.png +0 -0
  196. package/dist/assets/static/media/ph.02199ddc.png +0 -0
  197. package/dist/assets/static/media/pk.094f9517.png +0 -0
  198. package/dist/assets/static/media/pl.41521283.png +0 -0
  199. package/dist/assets/static/media/pt.1f82dc04.png +0 -0
  200. package/dist/assets/static/media/pw.a26c2316.png +0 -0
  201. package/dist/assets/static/media/py.926c65ed.png +0 -0
  202. package/dist/assets/static/media/qa.c6a3c20e.png +0 -0
  203. package/dist/assets/static/media/ro.a36876c9.png +0 -0
  204. package/dist/assets/static/media/rs.c6629de8.png +0 -0
  205. package/dist/assets/static/media/ru.a9b948c1.png +0 -0
  206. package/dist/assets/static/media/rw.e8aecba0.png +0 -0
  207. package/dist/assets/static/media/sa.859049c8.png +0 -0
  208. package/dist/assets/static/media/sb.4ad27b27.png +0 -0
  209. package/dist/assets/static/media/sc.3293efde.png +0 -0
  210. package/dist/assets/static/media/sd.19c94faa.png +0 -0
  211. package/dist/assets/static/media/se.195b3f93.png +0 -0
  212. package/dist/assets/static/media/sg.19d81907.png +0 -0
  213. package/dist/assets/static/media/si.367c5443.png +0 -0
  214. package/dist/assets/static/media/sk.4e5b8a39.png +0 -0
  215. package/dist/assets/static/media/sl.4b174b1c.png +0 -0
  216. package/dist/assets/static/media/sm.2cba3dac.png +0 -0
  217. package/dist/assets/static/media/sn.a4c1041d.png +0 -0
  218. package/dist/assets/static/media/so.b455e3bf.png +0 -0
  219. package/dist/assets/static/media/sr.5adc1c00.png +0 -0
  220. package/dist/assets/static/media/st.5ae44155.png +0 -0
  221. package/dist/assets/static/media/sv.43aa6cdf.png +0 -0
  222. package/dist/assets/static/media/sy.0fbd24f7.png +0 -0
  223. package/dist/assets/static/media/sz.ff204912.png +0 -0
  224. package/dist/assets/static/media/td.c7aa2a4e.png +0 -0
  225. package/dist/assets/static/media/tg.857c3bec.png +0 -0
  226. package/dist/assets/static/media/th.683600c7.png +0 -0
  227. package/dist/assets/static/media/tj.d20c5570.png +0 -0
  228. package/dist/assets/static/media/tl.5edd8ea7.png +0 -0
  229. package/dist/assets/static/media/tm.15960215.png +0 -0
  230. package/dist/assets/static/media/tn.40df718e.png +0 -0
  231. package/dist/assets/static/media/to.c3b054df.png +0 -0
  232. package/dist/assets/static/media/tr.adeace6d.png +0 -0
  233. package/dist/assets/static/media/tt.839bd7f1.png +0 -0
  234. package/dist/assets/static/media/tv.628cae3e.png +0 -0
  235. package/dist/assets/static/media/tw.4e885914.png +0 -0
  236. package/dist/assets/static/media/tz.b2f0dc37.png +0 -0
  237. package/dist/assets/static/media/ua.6b103313.png +0 -0
  238. package/dist/assets/static/media/ug.c84042fc.png +0 -0
  239. package/dist/assets/static/media/us.8523c31d.png +0 -0
  240. package/dist/assets/static/media/uy.a943f85e.png +0 -0
  241. package/dist/assets/static/media/uz.25552673.png +0 -0
  242. package/dist/assets/static/media/va.a29e1b53.png +0 -0
  243. package/dist/assets/static/media/vc.7480bd37.png +0 -0
  244. package/dist/assets/static/media/ve.fd4273c2.png +0 -0
  245. package/dist/assets/static/media/vn.7d2eff1b.png +0 -0
  246. package/dist/assets/static/media/vu.48b64cf3.png +0 -0
  247. package/dist/assets/static/media/ws.f3d9202f.png +0 -0
  248. package/dist/assets/static/media/ye.311a0e50.png +0 -0
  249. package/dist/assets/static/media/za.090a856f.png +0 -0
  250. package/dist/assets/static/media/zm.8371e197.png +0 -0
  251. package/dist/assets/static/media/zw.a6809447.png +0 -0
  252. package/dist/index.js +145901 -0
  253. package/package.json +212 -152
  254. package/dist/assets/android-chrome-192x192.png +0 -0
  255. package/dist/assets/android-chrome-512x512.png +0 -0
  256. package/dist/assets/apple-touch-icon.png +0 -0
  257. package/dist/assets/asset-manifest.json +0 -57
  258. package/dist/assets/browserconfig.xml +0 -9
  259. package/dist/assets/favicon-16x16.png +0 -0
  260. package/dist/assets/favicon-32x32.png +0 -0
  261. package/dist/assets/mstile-144x144.png +0 -0
  262. package/dist/assets/mstile-150x150.png +0 -0
  263. package/dist/assets/mstile-310x150.png +0 -0
  264. package/dist/assets/mstile-310x310.png +0 -0
  265. package/dist/assets/mstile-70x70.png +0 -0
  266. package/dist/assets/static/css/main.b6ffc2bec74dc4b98b88.css +0 -1
  267. package/dist/assets/static/js/0.0a556a75.chunk.js +0 -1
  268. package/dist/assets/static/js/1.14dd2d0c.chunk.js +0 -1
  269. package/dist/assets/static/js/10.d4eef924.chunk.js +0 -1
  270. package/dist/assets/static/js/11.53cd515d.chunk.js +0 -1
  271. package/dist/assets/static/js/12.ce0f8a4e.chunk.js +0 -1
  272. package/dist/assets/static/js/13.9ca96920.chunk.js +0 -1
  273. package/dist/assets/static/js/14.588e3d0c.chunk.js +0 -1
  274. package/dist/assets/static/js/15.f28d64ab.chunk.js +0 -1
  275. package/dist/assets/static/js/16.53dd87df.chunk.js +0 -1
  276. package/dist/assets/static/js/17.b764e125.chunk.js +0 -1
  277. package/dist/assets/static/js/18.80c3ac22.chunk.js +0 -1
  278. package/dist/assets/static/js/2.8fafb9ff.chunk.js +0 -1
  279. package/dist/assets/static/js/20.64809e35.chunk.js +0 -1
  280. package/dist/assets/static/js/21.f3058669.chunk.js +0 -1
  281. package/dist/assets/static/js/22.9450fc59.chunk.js +0 -1
  282. package/dist/assets/static/js/23.840a4201.chunk.js +0 -1
  283. package/dist/assets/static/js/24.0a173a0d.chunk.js +0 -1
  284. package/dist/assets/static/js/25.e4c2217e.chunk.js +0 -1
  285. package/dist/assets/static/js/26.5f03f1a3.chunk.js +0 -1
  286. package/dist/assets/static/js/27.5127408d.chunk.js +0 -1
  287. package/dist/assets/static/js/28.ebac4379.chunk.js +0 -1
  288. package/dist/assets/static/js/29.de46849d.chunk.js +0 -1
  289. package/dist/assets/static/js/3.c219b8a8.chunk.js +0 -1
  290. package/dist/assets/static/js/30.ff543e93.chunk.js +0 -1
  291. package/dist/assets/static/js/31.1f1ad44f.chunk.js +0 -1
  292. package/dist/assets/static/js/32.b4c28098.chunk.js +0 -1
  293. package/dist/assets/static/js/33.3febffaf.chunk.js +0 -1
  294. package/dist/assets/static/js/34.2e764e96.chunk.js +0 -1
  295. package/dist/assets/static/js/35.92c40bb9.chunk.js +0 -1
  296. package/dist/assets/static/js/36.27afe215.chunk.js +0 -1
  297. package/dist/assets/static/js/37.6d94e34b.chunk.js +0 -1
  298. package/dist/assets/static/js/38.107b5aa9.chunk.js +0 -1
  299. package/dist/assets/static/js/39.112b724b.chunk.js +0 -1
  300. package/dist/assets/static/js/4.19d26f13.chunk.js +0 -1
  301. package/dist/assets/static/js/40.44aa79f5.chunk.js +0 -1
  302. package/dist/assets/static/js/41.fb69cc30.chunk.js +0 -1
  303. package/dist/assets/static/js/42.906cc1ff.chunk.js +0 -1
  304. package/dist/assets/static/js/43.135e1560.chunk.js +0 -1
  305. package/dist/assets/static/js/44.a3d23bab.chunk.js +0 -1
  306. package/dist/assets/static/js/45.f025dffe.chunk.js +0 -1
  307. package/dist/assets/static/js/46.3ea25c9e.chunk.js +0 -1
  308. package/dist/assets/static/js/47.5a213255.chunk.js +0 -1
  309. package/dist/assets/static/js/48.ce4bfe23.chunk.js +0 -1
  310. package/dist/assets/static/js/49.857650de.chunk.js +0 -1
  311. package/dist/assets/static/js/5.dc5232a2.chunk.js +0 -1
  312. package/dist/assets/static/js/50.2a5fd558.chunk.js +0 -1
  313. package/dist/assets/static/js/6.210f5d48.chunk.js +0 -1
  314. package/dist/assets/static/js/7.29af7904.chunk.js +0 -1
  315. package/dist/assets/static/js/8.efcd70d8.chunk.js +0 -1
  316. package/dist/assets/static/js/9.23e24017.chunk.js +0 -1
  317. package/dist/assets/static/js/main.f3cd799a.js +0 -1
  318. package/dist/assets/static/media/ABOUT.d02918c9.md +0 -13
  319. package/dist/assets/static/media/Roboto-500.64e69384.woff +0 -0
  320. package/dist/assets/static/media/Roboto-500.7f8f0146.eot +0 -0
  321. package/dist/assets/static/media/Roboto-500.916656a2.ttf +0 -0
  322. package/dist/assets/static/media/Roboto-500.abd255e8.svg +0 -305
  323. package/dist/assets/static/media/Roboto-700.8d11d1e1.ttf +0 -0
  324. package/dist/assets/static/media/Roboto-700.9c9c164e.svg +0 -310
  325. package/dist/assets/static/media/Roboto-700.c65552c8.eot +0 -0
  326. package/dist/assets/static/media/Roboto-700.ee82bda2.woff +0 -0
  327. package/dist/assets/static/media/Roboto-700italic.1dc5bfed.eot +0 -0
  328. package/dist/assets/static/media/Roboto-700italic.686da014.woff +0 -0
  329. package/dist/assets/static/media/Roboto-700italic.896656dc.ttf +0 -0
  330. package/dist/assets/static/media/Roboto-700italic.cacb9681.svg +0 -325
  331. package/dist/assets/static/media/Roboto-italic.09ed2f27.svg +0 -323
  332. package/dist/assets/static/media/Roboto-italic.c1421604.woff +0 -0
  333. package/dist/assets/static/media/Roboto-italic.c38ecad2.ttf +0 -0
  334. package/dist/assets/static/media/Roboto-italic.f7677a07.eot +0 -0
  335. package/dist/assets/static/media/Roboto-regular.5107f918.eot +0 -0
  336. package/dist/assets/static/media/Roboto-regular.6a307cf2.woff +0 -0
  337. package/dist/assets/static/media/Roboto-regular.81dc9b21.ttf +0 -0
  338. package/dist/assets/static/media/Roboto-regular.bcf2ba9e.svg +0 -308
  339. package/dist/config.js +0 -173
  340. package/dist/server/app.js +0 -79
  341. package/dist/server/bin/enforce-prerequisites.js +0 -55
  342. package/dist/server/bin/migrations/fix-is-admin-flag.js +0 -41
  343. package/dist/server/bin/migrations/per-user-rtorrent-instances.js +0 -67
  344. package/dist/server/bin/migrations/run.js +0 -10
  345. package/dist/server/bin/start.js +0 -18
  346. package/dist/server/bin/web-server.js +0 -94
  347. package/dist/server/config/passport.js +0 -32
  348. package/dist/server/constants/clientGatewayServiceEvents.js +0 -15
  349. package/dist/server/constants/diskUsageServiceEvents.js +0 -8
  350. package/dist/server/constants/fileListPropMap.js +0 -29
  351. package/dist/server/constants/historyServiceEvents.js +0 -18
  352. package/dist/server/constants/notificationServiceEvents.js +0 -8
  353. package/dist/server/constants/taxonomyServiceEvents.js +0 -8
  354. package/dist/server/constants/torrentListPropMap.js +0 -200
  355. package/dist/server/constants/torrentServiceEvents.js +0 -8
  356. package/dist/server/constants/transferSummaryPropMap.js +0 -28
  357. package/dist/server/middleware/appendUserServices.js +0 -10
  358. package/dist/server/middleware/booleanCoerce.js +0 -9
  359. package/dist/server/middleware/clientActivityStream.js +0 -124
  360. package/dist/server/middleware/eventStream.js +0 -25
  361. package/dist/server/middleware/requireAdmin.js +0 -8
  362. package/dist/server/models/ClientRequest.js +0 -310
  363. package/dist/server/models/Feed.js +0 -65
  364. package/dist/server/models/Filesystem.js +0 -44
  365. package/dist/server/models/HistoryEra.js +0 -168
  366. package/dist/server/models/ServerEvent.js +0 -27
  367. package/dist/server/models/TemporaryStorage.js +0 -20
  368. package/dist/server/models/Users.js +0 -171
  369. package/dist/server/models/client.js +0 -363
  370. package/dist/server/models/settings.js +0 -119
  371. package/dist/server/routes/api.js +0 -69
  372. package/dist/server/routes/auth.js +0 -184
  373. package/dist/server/routes/client.js +0 -101
  374. package/dist/server/services/BaseService.js +0 -24
  375. package/dist/server/services/clientGatewayService.js +0 -220
  376. package/dist/server/services/clientRequestManager.js +0 -76
  377. package/dist/server/services/diskUsageService.js +0 -133
  378. package/dist/server/services/feedService.js +0 -290
  379. package/dist/server/services/historyService.js +0 -181
  380. package/dist/server/services/index.js +0 -108
  381. package/dist/server/services/notificationService.js +0 -109
  382. package/dist/server/services/taxonomyService.js +0 -107
  383. package/dist/server/services/torrentService.js +0 -235
  384. package/dist/server/util/ajaxUtil.js +0 -19
  385. package/dist/server/util/clientResponseUtil.js +0 -99
  386. package/dist/server/util/fileUtil.js +0 -45
  387. package/dist/server/util/mediainfo.js +0 -34
  388. package/dist/server/util/methodCallUtil.js +0 -22
  389. package/dist/server/util/numberUtils.js +0 -7
  390. package/dist/server/util/rTorrentDeserializer.js +0 -104
  391. package/dist/server/util/rTorrentPropMap.js +0 -13
  392. package/dist/server/util/scgiUtil.js +0 -36
  393. package/dist/server/util/torrentFileUtil.js +0 -23
  394. package/dist/shared/config/paths.js +0 -41
  395. package/dist/shared/constants/clientSettingsMap.js +0 -53
  396. package/dist/shared/constants/diffActionTypes.js +0 -6
  397. package/dist/shared/constants/historySnapshotTypes.js +0 -11
  398. package/dist/shared/constants/serverEventTypes.js +0 -18
  399. package/dist/shared/constants/torrentFilePropsMap.js +0 -6
  400. package/dist/shared/constants/torrentPeerPropsMap.js +0 -32
  401. package/dist/shared/constants/torrentStatusMap.js +0 -17
  402. package/dist/shared/constants/torrentTrackerPropsMap.js +0 -6
  403. package/dist/shared/types/Auth.js +0 -2
  404. package/dist/shared/util/formatUtil.js +0 -33
  405. package/dist/shared/util/objectUtil.js +0 -56
  406. package/dist/shared/util/regEx.js +0 -7
  407. /package/dist/assets/{safari-pinned-tab.svg → icon.svg} +0 -0
@@ -1,108 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const clientGatewayService_1 = __importDefault(require("./clientGatewayService"));
7
- const clientRequestManager_1 = __importDefault(require("./clientRequestManager"));
8
- const feedService_1 = __importDefault(require("./feedService"));
9
- const historyService_1 = __importDefault(require("./historyService"));
10
- const notificationService_1 = __importDefault(require("./notificationService"));
11
- const taxonomyService_1 = __importDefault(require("./taxonomyService"));
12
- const torrentService_1 = __importDefault(require("./torrentService"));
13
- const clientRequestManagers = new Map();
14
- const clientGatewayServices = new Map();
15
- const feedServices = new Map();
16
- const historyServices = new Map();
17
- const notificationServices = new Map();
18
- const taxonomyServices = new Map();
19
- const torrentServices = new Map();
20
- const allServiceMaps = [
21
- clientRequestManagers,
22
- clientGatewayServices,
23
- feedServices,
24
- historyServices,
25
- notificationServices,
26
- taxonomyServices,
27
- torrentServices,
28
- ];
29
- const getService = ({ servicesMap, service: Service, user }) => {
30
- let serviceInstance = servicesMap.get(user._id);
31
- if (!serviceInstance) {
32
- // eslint-disable-next-line no-use-before-define
33
- serviceInstance = new Service(user, getAllServices(user));
34
- servicesMap.set(user._id, serviceInstance);
35
- }
36
- return serviceInstance;
37
- };
38
- const getClientRequestManager = (user) => getService({ servicesMap: clientRequestManagers, service: clientRequestManager_1.default, user });
39
- const getClientGatewayService = (user) => getService({ servicesMap: clientGatewayServices, service: clientGatewayService_1.default, user });
40
- const getFeedService = (user) => getService({ servicesMap: feedServices, service: feedService_1.default, user });
41
- const getHistoryService = (user) => getService({ servicesMap: historyServices, service: historyService_1.default, user });
42
- const getNotificationService = (user) => getService({ servicesMap: notificationServices, service: notificationService_1.default, user });
43
- const getTaxonomyService = (user) => getService({ servicesMap: taxonomyServices, service: taxonomyService_1.default, user });
44
- const getTorrentService = (user) => getService({ servicesMap: torrentServices, service: torrentService_1.default, user });
45
- const bootstrapServicesForUser = (user) => {
46
- getClientRequestManager(user);
47
- getClientGatewayService(user);
48
- getFeedService(user);
49
- getHistoryService(user);
50
- getNotificationService(user);
51
- getTaxonomyService(user);
52
- getTorrentService(user);
53
- };
54
- const destroyUserServices = (user) => {
55
- const userId = user._id;
56
- allServiceMaps.forEach((serviceMap) => {
57
- const userService = serviceMap.get(userId);
58
- if (userService != null) {
59
- userService.destroy();
60
- serviceMap.delete(userId);
61
- }
62
- });
63
- };
64
- const getAllServices = (user) => ({
65
- get clientRequestManager() {
66
- return getClientRequestManager(user);
67
- },
68
- get clientGatewayService() {
69
- return getClientGatewayService(user);
70
- },
71
- get feedService() {
72
- return getFeedService(user);
73
- },
74
- get historyService() {
75
- return getHistoryService(user);
76
- },
77
- get notificationService() {
78
- return getNotificationService(user);
79
- },
80
- get taxonomyService() {
81
- return getTaxonomyService(user);
82
- },
83
- get torrentService() {
84
- return getTorrentService(user);
85
- },
86
- });
87
- const updateUserServices = (user) => {
88
- const userId = user._id;
89
- allServiceMaps.forEach((serviceMap) => {
90
- const service = serviceMap.get(userId);
91
- if (service != null) {
92
- service.updateUser(user);
93
- serviceMap.delete(userId);
94
- }
95
- });
96
- };
97
- exports.default = {
98
- bootstrapServicesForUser,
99
- destroyUserServices,
100
- getAllServices,
101
- getClientRequestManager,
102
- getClientGatewayService,
103
- getHistoryService,
104
- getNotificationService,
105
- getTaxonomyService,
106
- getTorrentService,
107
- updateUserServices,
108
- };
@@ -1,109 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const castArray_1 = __importDefault(require("lodash/castArray"));
7
- const nedb_1 = __importDefault(require("nedb"));
8
- const debounce_1 = __importDefault(require("lodash/debounce"));
9
- const path_1 = __importDefault(require("path"));
10
- const BaseService_1 = __importDefault(require("./BaseService"));
11
- const config_1 = __importDefault(require("../../config"));
12
- const notificationServiceEvents_1 = __importDefault(require("../constants/notificationServiceEvents"));
13
- const DEFAULT_QUERY_LIMIT = 20;
14
- const INITIAL_COUNT_VALUE = { read: 0, total: 0, unread: 0 };
15
- class NotificationService extends BaseService_1.default {
16
- constructor(...serviceConfig) {
17
- super(...serviceConfig);
18
- this.count = { ...INITIAL_COUNT_VALUE };
19
- this.ready = false;
20
- this.db = this.loadDatabase();
21
- this.emitUpdate = debounce_1.default(this.emitUpdate.bind(this), 100);
22
- this.countNotifications();
23
- }
24
- addNotification(notifications) {
25
- notifications = castArray_1.default(notifications);
26
- this.count.total += notifications.length;
27
- this.count.unread += notifications.length;
28
- const timestamp = Date.now();
29
- const notificationsToInsert = notifications.map((notification) => ({
30
- ts: timestamp,
31
- data: notification.data,
32
- id: notification.id,
33
- read: false,
34
- }));
35
- this.db.insert(notificationsToInsert, () => this.emitUpdate());
36
- }
37
- clearNotifications(options, callback) {
38
- this.db.remove({}, { multi: true }, (err) => {
39
- if (err) {
40
- callback(null, err);
41
- return;
42
- }
43
- this.count = { ...INITIAL_COUNT_VALUE };
44
- callback();
45
- });
46
- this.emitUpdate();
47
- }
48
- countNotifications() {
49
- this.db.find({}, (err, docs) => {
50
- if (err) {
51
- this.count = { ...INITIAL_COUNT_VALUE };
52
- }
53
- else {
54
- docs.forEach((notification) => {
55
- if (notification.read) {
56
- this.count.read++;
57
- }
58
- else {
59
- this.count.unread++;
60
- }
61
- this.count.total++;
62
- });
63
- }
64
- this.emitUpdate();
65
- });
66
- }
67
- emitUpdate() {
68
- this.emit(notificationServiceEvents_1.default.NOTIFICATION_COUNT_CHANGE, {
69
- id: Date.now(),
70
- data: this.count,
71
- });
72
- }
73
- getNotificationCount() {
74
- return this.count;
75
- }
76
- getNotifications(query, callback) {
77
- const sortedNotifications = this.db.find({}).sort({ ts: -1 });
78
- const queryCallback = (err, docs) => {
79
- if (err) {
80
- callback(null, err);
81
- return;
82
- }
83
- callback({ notifications: docs, count: this.count });
84
- };
85
- if (query.allNotifications) {
86
- sortedNotifications.exec(queryCallback);
87
- }
88
- else if (query.start != null) {
89
- sortedNotifications
90
- .skip(Number(query.start))
91
- .limit(Number(query.limit) || DEFAULT_QUERY_LIMIT)
92
- .exec(queryCallback);
93
- }
94
- else {
95
- sortedNotifications.limit(Number(query.limit) || DEFAULT_QUERY_LIMIT).exec(queryCallback);
96
- }
97
- }
98
- loadDatabase() {
99
- if (this.ready)
100
- return;
101
- const db = new nedb_1.default({
102
- autoload: true,
103
- filename: path_1.default.join(config_1.default.dbPath, this.user._id, 'notifications.db'),
104
- });
105
- this.ready = true;
106
- return db;
107
- }
108
- }
109
- exports.default = NotificationService;
@@ -1,107 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const BaseService_1 = __importDefault(require("./BaseService"));
7
- const clientGatewayServiceEvents_1 = __importDefault(require("../constants/clientGatewayServiceEvents"));
8
- const objectUtil_1 = __importDefault(require("../../shared/util/objectUtil"));
9
- const taxonomyServiceEvents_1 = __importDefault(require("../constants/taxonomyServiceEvents"));
10
- const torrentStatusMap_1 = __importDefault(require("../../shared/constants/torrentStatusMap"));
11
- class TaxonomyService extends BaseService_1.default {
12
- constructor(...serviceConfig) {
13
- super(...serviceConfig);
14
- this.lastStatusCounts = { all: 0 };
15
- this.lastTagCounts = { all: 0 };
16
- this.lastTrackerCounts = { all: 0 };
17
- this.statusCounts = { all: 0 };
18
- this.tagCounts = { all: 0 };
19
- this.trackerCounts = { all: 0 };
20
- this.handleProcessTorrent = this.handleProcessTorrent.bind(this);
21
- this.handleProcessTorrentListStart = this.handleProcessTorrentListStart.bind(this);
22
- this.handleProcessTorrentListEnd = this.handleProcessTorrentListEnd.bind(this);
23
- const { clientGatewayService } = this.services;
24
- clientGatewayService.on(clientGatewayServiceEvents_1.default.PROCESS_TORRENT_LIST_START, this.handleProcessTorrentListStart);
25
- clientGatewayService.on(clientGatewayServiceEvents_1.default.PROCESS_TORRENT_LIST_END, this.handleProcessTorrentListEnd);
26
- clientGatewayService.on(clientGatewayServiceEvents_1.default.PROCESS_TORRENT, this.handleProcessTorrent);
27
- }
28
- destroy() {
29
- const { clientGatewayService } = this.services;
30
- clientGatewayService.removeListener(clientGatewayServiceEvents_1.default.PROCESS_TORRENT_LIST_START, this.handleProcessTorrentListStart);
31
- clientGatewayService.removeListener(clientGatewayServiceEvents_1.default.PROCESS_TORRENT_LIST_END, this.handleProcessTorrentListEnd);
32
- clientGatewayService.removeListener(clientGatewayServiceEvents_1.default.PROCESS_TORRENT, this.handleProcessTorrent);
33
- }
34
- getTaxonomy() {
35
- return {
36
- id: Date.now(),
37
- taxonomy: {
38
- statusCounts: this.statusCounts,
39
- tagCounts: this.tagCounts,
40
- trackerCounts: this.trackerCounts,
41
- },
42
- };
43
- }
44
- handleProcessTorrentListStart() {
45
- this.lastStatusCounts = { ...this.statusCounts };
46
- this.lastTagCounts = { ...this.tagCounts };
47
- this.lastTrackerCounts = { ...this.trackerCounts };
48
- torrentStatusMap_1.default.statusShorthand.forEach((statusShorthand) => {
49
- this.statusCounts[torrentStatusMap_1.default[statusShorthand]] = 0;
50
- });
51
- this.statusCounts.all = 0;
52
- this.tagCounts = { all: 0 };
53
- this.trackerCounts = { all: 0 };
54
- }
55
- handleProcessTorrentListEnd(torrentList) {
56
- const { length = 0 } = torrentList;
57
- this.statusCounts.all = length;
58
- this.tagCounts.all = length;
59
- this.trackerCounts.all = length;
60
- const taxonomyDiffs = {
61
- statusCounts: objectUtil_1.default.getDiff(this.lastStatusCounts, this.statusCounts),
62
- tagCounts: objectUtil_1.default.getDiff(this.lastTagCounts, this.tagCounts),
63
- trackerCounts: objectUtil_1.default.getDiff(this.lastTrackerCounts, this.trackerCounts),
64
- };
65
- const didDiffChange = Object.keys(taxonomyDiffs).some((diffKey) => taxonomyDiffs[diffKey].length > 0);
66
- if (didDiffChange) {
67
- this.emit(taxonomyServiceEvents_1.default.TAXONOMY_DIFF_CHANGE, {
68
- diff: taxonomyDiffs,
69
- id: Date.now(),
70
- });
71
- }
72
- }
73
- handleProcessTorrent(torrentDetails) {
74
- this.incrementStatusCounts(torrentDetails.status);
75
- this.incrementTagCounts(torrentDetails.tags);
76
- this.incrementTrackerCounts(torrentDetails.trackerURIs);
77
- }
78
- incrementStatusCounts(statuses) {
79
- statuses.forEach((status) => {
80
- this.statusCounts[torrentStatusMap_1.default[status]]++;
81
- });
82
- }
83
- incrementTagCounts(tags) {
84
- if (tags.length === 0) {
85
- tags = ['untagged'];
86
- }
87
- tags.forEach((tag) => {
88
- if (this.tagCounts[tag] != null) {
89
- this.tagCounts[tag]++;
90
- }
91
- else {
92
- this.tagCounts[tag] = 1;
93
- }
94
- });
95
- }
96
- incrementTrackerCounts(trackers) {
97
- trackers.forEach((tracker) => {
98
- if (this.trackerCounts[tracker] != null) {
99
- this.trackerCounts[tracker]++;
100
- }
101
- else {
102
- this.trackerCounts[tracker] = 1;
103
- }
104
- });
105
- }
106
- }
107
- exports.default = TaxonomyService;
@@ -1,235 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const deep_equal_1 = __importDefault(require("deep-equal"));
7
- const BaseService_1 = __importDefault(require("./BaseService"));
8
- const clientGatewayServiceEvents_1 = __importDefault(require("../constants/clientGatewayServiceEvents"));
9
- const config_1 = __importDefault(require("../../config"));
10
- const formatUtil_1 = __importDefault(require("../../shared/util/formatUtil"));
11
- const methodCallUtil_1 = __importDefault(require("../util/methodCallUtil"));
12
- const serverEventTypes_1 = __importDefault(require("../../shared/constants/serverEventTypes"));
13
- const numberUtils_1 = __importDefault(require("../util/numberUtils"));
14
- const torrentListPropMap_1 = __importDefault(require("../constants/torrentListPropMap"));
15
- const torrentServiceEvents_1 = __importDefault(require("../constants/torrentServiceEvents"));
16
- const torrentStatusMap_1 = __importDefault(require("../../shared/constants/torrentStatusMap"));
17
- const torrentListMethodCallConfig = methodCallUtil_1.default.getMethodCallConfigFromPropMap(torrentListPropMap_1.default);
18
- const getTorrentETAFromDetails = (torrentDetails) => {
19
- const { downRate, bytesDone, sizeBytes } = torrentDetails;
20
- if (downRate > 0) {
21
- return formatUtil_1.default.secondsToDuration((sizeBytes - bytesDone) / downRate);
22
- }
23
- return Infinity;
24
- };
25
- const getTorrentPercentCompleteFromDetails = (torrentDetails) => {
26
- const percentComplete = (torrentDetails.bytesDone / torrentDetails.sizeBytes) * 100;
27
- if (percentComplete > 0 && percentComplete < 10) {
28
- return Number(numberUtils_1.default(percentComplete, 2));
29
- }
30
- if (percentComplete > 10 && percentComplete < 100) {
31
- return Number(numberUtils_1.default(percentComplete, 1));
32
- }
33
- return percentComplete;
34
- };
35
- const getTorrentStatusFromDetails = (torrentDetails) => {
36
- const { isHashing, isComplete, isOpen, upRate, downRate, state, message } = torrentDetails;
37
- const torrentStatus = [];
38
- if (isHashing !== '0') {
39
- torrentStatus.push(torrentStatusMap_1.default.checking);
40
- }
41
- else if (isComplete && isOpen && state === '1') {
42
- torrentStatus.push(torrentStatusMap_1.default.complete);
43
- torrentStatus.push(torrentStatusMap_1.default.seeding);
44
- }
45
- else if (isComplete && isOpen && state === '0') {
46
- torrentStatus.push(torrentStatusMap_1.default.stopped);
47
- }
48
- else if (isComplete && !isOpen) {
49
- torrentStatus.push(torrentStatusMap_1.default.stopped);
50
- torrentStatus.push(torrentStatusMap_1.default.complete);
51
- }
52
- else if (!isComplete && isOpen && state === '1') {
53
- torrentStatus.push(torrentStatusMap_1.default.downloading);
54
- }
55
- else if (!isComplete && isOpen && state === '0') {
56
- torrentStatus.push(torrentStatusMap_1.default.stopped);
57
- }
58
- else if (!isComplete && !isOpen) {
59
- torrentStatus.push(torrentStatusMap_1.default.stopped);
60
- }
61
- if (message.length) {
62
- torrentStatus.push(torrentStatusMap_1.default.error);
63
- }
64
- if (upRate !== 0) {
65
- torrentStatus.push(torrentStatusMap_1.default.activelyUploading);
66
- }
67
- if (downRate !== 0) {
68
- torrentStatus.push(torrentStatusMap_1.default.activelyDownloading);
69
- }
70
- if (upRate !== 0 || downRate !== 0) {
71
- torrentStatus.push(torrentStatusMap_1.default.active);
72
- }
73
- else {
74
- torrentStatus.push(torrentStatusMap_1.default.inactive);
75
- }
76
- return torrentStatus;
77
- };
78
- const hasTorrentFinished = (prevData = {}, nextData = {}) => {
79
- const { status = [] } = prevData;
80
- return (!status.includes(torrentStatusMap_1.default.checking) && prevData.percentComplete < 100 && nextData.percentComplete === 100);
81
- };
82
- class TorrentService extends BaseService_1.default {
83
- constructor(...serviceConfig) {
84
- super(...serviceConfig);
85
- this.errorCount = 0;
86
- this.pollTimeout = null;
87
- this.torrentListSummary = { torrents: {} };
88
- this.fetchTorrentList = this.fetchTorrentList.bind(this);
89
- this.handleTorrentProcessed = this.handleTorrentProcessed.bind(this);
90
- this.handleTorrentsRemoved = this.handleTorrentsRemoved.bind(this);
91
- this.handleFetchTorrentListSuccess = this.handleFetchTorrentListSuccess.bind(this);
92
- this.handleFetchTorrentListError = this.handleFetchTorrentListError.bind(this);
93
- const { clientGatewayService } = this.services;
94
- clientGatewayService.addTorrentListReducer({
95
- key: 'status',
96
- reduce: getTorrentStatusFromDetails,
97
- });
98
- clientGatewayService.addTorrentListReducer({
99
- key: 'percentComplete',
100
- reduce: getTorrentPercentCompleteFromDetails,
101
- });
102
- clientGatewayService.addTorrentListReducer({
103
- key: 'eta',
104
- reduce: getTorrentETAFromDetails,
105
- });
106
- clientGatewayService.on(clientGatewayServiceEvents_1.default.PROCESS_TORRENT, this.handleTorrentProcessed);
107
- clientGatewayService.on(clientGatewayServiceEvents_1.default.TORRENTS_REMOVED, this.handleTorrentsRemoved);
108
- this.fetchTorrentList();
109
- }
110
- assignDeletedTorrentsToDiff(diff, nextTorrentListSummary, options = {}) {
111
- const { newTorrentCount = 0 } = options;
112
- // We need to look for deleted torrents in two scenarios:
113
- // 1. the next list length is less than than the current length
114
- // 2. at least one new torrent was added and the next list length is
115
- // equal to or greater than the current list length.
116
- //
117
- // We definitely don't need to look for deleted torrents if the number
118
- // of new torrents is equal to the difference between next torrent list
119
- // length and previous torrent list length.
120
- let shouldLookForDeletedTorrents = nextTorrentListSummary.length < this.torrentListSummary.length;
121
- if (newTorrentCount > 0) {
122
- if (nextTorrentListSummary.length >= this.torrentListSummary.length) {
123
- shouldLookForDeletedTorrents = true;
124
- }
125
- if (newTorrentCount === nextTorrentListSummary.length - this.torrentListSummary.length) {
126
- shouldLookForDeletedTorrents = false;
127
- }
128
- }
129
- if (shouldLookForDeletedTorrents) {
130
- Object.keys(this.torrentListSummary.torrents).forEach((hash) => {
131
- if (nextTorrentListSummary.torrents[hash] == null) {
132
- diff[hash] = {
133
- action: serverEventTypes_1.default.TORRENT_LIST_ACTION_TORRENT_DELETED,
134
- };
135
- }
136
- }, {});
137
- }
138
- }
139
- deferFetchTorrentList(interval = config_1.default.torrentClientPollInterval || 2000) {
140
- this.pollTimeout = setTimeout(this.fetchTorrentList, interval);
141
- }
142
- destroy() {
143
- clearTimeout(this.pollTimeout);
144
- }
145
- fetchTorrentList() {
146
- if (this.pollTimeout != null) {
147
- clearTimeout(this.pollTimeout);
148
- }
149
- return this.services.clientGatewayService
150
- .fetchTorrentList(torrentListMethodCallConfig)
151
- .then(this.handleFetchTorrentListSuccess)
152
- .catch(this.handleFetchTorrentListError);
153
- }
154
- getTorrent(hash) {
155
- return this.torrentListSummary.torrents[hash];
156
- }
157
- getTorrentList() {
158
- return this.torrentListSummary;
159
- }
160
- getTorrentListDiff(nextTorrentListSummary) {
161
- let newTorrentCount = 0;
162
- // Get the diff...
163
- const diff = Object.keys(nextTorrentListSummary.torrents).reduce((accumulator, hash) => {
164
- const currentTorrentDetails = this.torrentListSummary.torrents[hash];
165
- const nextTorrentDetails = nextTorrentListSummary.torrents[hash];
166
- // If the current torrent list doesn't contain any details for this
167
- // hash, then it's a brand new torrent, so every detail is part of the
168
- // diff.
169
- if (currentTorrentDetails == null) {
170
- accumulator[hash] = {
171
- action: serverEventTypes_1.default.TORRENT_LIST_ACTION_TORRENT_ADDED,
172
- data: nextTorrentDetails,
173
- };
174
- // Track the number of new torrents added.
175
- newTorrentCount++;
176
- }
177
- else {
178
- Object.keys(nextTorrentDetails).forEach((propKey) => {
179
- // If one of the details is inequal, we need to add it to the diff.
180
- if (!deep_equal_1.default(currentTorrentDetails[propKey], nextTorrentDetails[propKey])) {
181
- // Initialize with an empty object when this is the first known
182
- // inequal property.
183
- if (accumulator[hash] == null) {
184
- accumulator[hash] = {
185
- action: serverEventTypes_1.default.TORRENT_LIST_ACTION_TORRENT_DETAIL_UPDATED,
186
- data: {},
187
- };
188
- }
189
- // Add the diff details.
190
- accumulator[hash].data[propKey] = nextTorrentDetails[propKey];
191
- }
192
- });
193
- }
194
- return accumulator;
195
- }, {});
196
- this.assignDeletedTorrentsToDiff(diff, nextTorrentListSummary, { newTorrentCount });
197
- return diff;
198
- }
199
- handleFetchTorrentListError() {
200
- let nextInterval = config_1.default.torrentClientPollInterval || 2000;
201
- // If more than consecutive errors have occurred, then we delay the next
202
- // request.
203
- if (++this.errorCount >= 3) {
204
- nextInterval = Math.min(nextInterval + 2 ** this.errorCount, 1000 * 60);
205
- }
206
- this.deferFetchTorrentList(nextInterval);
207
- this.emit(torrentServiceEvents_1.default.FETCH_TORRENT_LIST_ERROR);
208
- }
209
- getTorrentListSummary() {
210
- return this.torrentListSummary;
211
- }
212
- handleFetchTorrentListSuccess(nextTorrentListSummary) {
213
- const diff = this.getTorrentListDiff(nextTorrentListSummary);
214
- if (Object.keys(diff).length > 0) {
215
- this.emit(torrentServiceEvents_1.default.TORRENT_LIST_DIFF_CHANGE, { diff, id: nextTorrentListSummary.id });
216
- }
217
- this.torrentListSummary = nextTorrentListSummary;
218
- this.deferFetchTorrentList();
219
- this.errorCount = 0;
220
- this.emit(torrentServiceEvents_1.default.FETCH_TORRENT_LIST_SUCCESS);
221
- }
222
- handleTorrentProcessed(nextTorrentDetails) {
223
- const prevTorrentDetails = this.torrentListSummary.torrents[nextTorrentDetails.hash];
224
- if (hasTorrentFinished(prevTorrentDetails, nextTorrentDetails)) {
225
- this.services.notificationService.addNotification({
226
- id: 'notification.torrent.finished',
227
- data: { name: nextTorrentDetails.name },
228
- });
229
- }
230
- }
231
- handleTorrentsRemoved() {
232
- this.fetchTorrentList();
233
- }
234
- }
235
- exports.default = TorrentService;
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const ajaxUtil = {
4
- getResponseFn: (res) => (data, error) => {
5
- if (error) {
6
- if (process.env.NODE_ENV === 'development') {
7
- console.trace(error);
8
- }
9
- if (typeof error === 'string') {
10
- res.status(500).json(Error(error));
11
- }
12
- res.status(500).json(error);
13
- }
14
- else {
15
- res.json(data);
16
- }
17
- },
18
- };
19
- exports.default = ajaxUtil;
@@ -1,99 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const geoip_country_1 = __importDefault(require("geoip-country"));
7
- const numberUtils_1 = __importDefault(require("./numberUtils"));
8
- const torrentFilePropsMap_1 = __importDefault(require("../../shared/constants/torrentFilePropsMap"));
9
- const torrentPeerPropsMap_1 = __importDefault(require("../../shared/constants/torrentPeerPropsMap"));
10
- const torrentTrackerPropsMap_1 = __importDefault(require("../../shared/constants/torrentTrackerPropsMap"));
11
- const processFile = (file) => {
12
- file.filename = file.pathComponents[file.pathComponents.length - 1];
13
- file.percentComplete = numberUtils_1.default((file.completedChunks / file.sizeChunks) * 100);
14
- delete file.completedChunks;
15
- delete file.pathComponents;
16
- delete file.sizeChunks;
17
- return file;
18
- };
19
- const getFileTreeFromPathsArr = (tree, directory, file, depth) => {
20
- if (depth == null) {
21
- depth = 0;
22
- }
23
- if (tree == null) {
24
- tree = {};
25
- }
26
- if (depth++ < file.pathComponents.length - 1) {
27
- if (!tree.directories) {
28
- tree.directories = {};
29
- }
30
- tree.directories[directory] = getFileTreeFromPathsArr(tree.directories[directory], file.pathComponents[depth], file, depth);
31
- }
32
- else {
33
- if (!tree.files) {
34
- tree.files = [];
35
- }
36
- tree.files.push(processFile(file));
37
- }
38
- return tree;
39
- };
40
- const mapPropsToResponse = (requestedKeys, clientResponse) => {
41
- if (clientResponse.length === 0) {
42
- return [];
43
- }
44
- // clientResponse is always an array of arrays.
45
- if (clientResponse[0].length === 1) {
46
- // When the length of the nested arrays is 1, the nested arrays represent a
47
- // singular requested value (e.g. total data transferred or current upload
48
- // speed). Therefore we construct an object where the requested keys map to
49
- // their values.
50
- return clientResponse.reduce((memo, value, index) => {
51
- const singleValue = value[0];
52
- memo[requestedKeys[index]] = singleValue;
53
- return memo;
54
- }, {});
55
- }
56
- // When the length of the nested arrays is more than 1, the nested arrays
57
- // represent one of many items of the same type (e.g. a list of torrents,
58
- // peers, files, etc). Therefore we construct an array of objects, where each
59
- // object contains all of the requested keys and its value. We add an index
60
- // for each item, a requirement for file lists.
61
- return clientResponse.map((listItem, index) => listItem.reduce((nestedMemo, value, nestedIndex) => {
62
- nestedMemo[requestedKeys[nestedIndex]] = value;
63
- return nestedMemo;
64
- }, { index }), []);
65
- };
66
- const processTorrentDetails = (data) => {
67
- // TODO: This is ugly.
68
- const peersData = data[0][0] || null;
69
- const filesData = data[1][0] || null;
70
- const trackerData = data[2][0] || null;
71
- let peers = null;
72
- let files = null;
73
- let trackers = null;
74
- let fileTree = {};
75
- if (peersData && peersData.length) {
76
- peers = mapPropsToResponse(torrentPeerPropsMap_1.default.props, peersData).map((peer) => {
77
- const geoData = geoip_country_1.default.lookup(peer.address) || {};
78
- peer.country = geoData.country;
79
- // Strings to boolean
80
- peer.isEncrypted = peer.isEncrypted === '1';
81
- peer.isIncoming = peer.isIncoming === '1';
82
- return peer;
83
- });
84
- }
85
- if (filesData && filesData.length) {
86
- files = mapPropsToResponse(torrentFilePropsMap_1.default.props, filesData);
87
- fileTree = files.reduce((memo, file) => getFileTreeFromPathsArr(memo, file.pathComponents[0], file), {});
88
- }
89
- if (trackerData && trackerData.length) {
90
- trackers = mapPropsToResponse(torrentTrackerPropsMap_1.default.props, trackerData);
91
- }
92
- return { peers, trackers, fileTree };
93
- };
94
- const clientResponseUtil = {
95
- mapPropsToResponse,
96
- processFile,
97
- processTorrentDetails,
98
- };
99
- exports.default = clientResponseUtil;