vscroll 1.6.3 → 1.7.0

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 (315) hide show
  1. package/dist/bundles/vscroll.esm5.js +5704 -5705
  2. package/dist/bundles/vscroll.esm5.js.map +1 -1
  3. package/dist/bundles/vscroll.esm5.min.js +2 -2
  4. package/dist/bundles/vscroll.esm5.min.js.map +1 -1
  5. package/dist/bundles/vscroll.esm6.js +5193 -5194
  6. package/dist/bundles/vscroll.esm6.js.map +1 -1
  7. package/dist/bundles/vscroll.esm6.min.js +2 -2
  8. package/dist/bundles/vscroll.esm6.min.js.map +1 -1
  9. package/dist/bundles/vscroll.umd.js +5712 -5714
  10. package/dist/bundles/vscroll.umd.js.map +1 -1
  11. package/dist/bundles/vscroll.umd.min.js +2 -2
  12. package/dist/bundles/vscroll.umd.min.js.map +1 -1
  13. package/dist/esm2015/classes/adapter/context.js +43 -43
  14. package/dist/esm2015/classes/adapter/context.js.map +1 -1
  15. package/dist/esm2015/classes/adapter/props.js +300 -300
  16. package/dist/esm2015/classes/adapter/wanted.js +28 -28
  17. package/dist/esm2015/classes/adapter/wanted.js.map +1 -1
  18. package/dist/esm2015/classes/adapter.js +487 -487
  19. package/dist/esm2015/classes/adapter.js.map +1 -1
  20. package/dist/esm2015/classes/buffer/cache.js +246 -246
  21. package/dist/esm2015/classes/buffer/cache.js.map +1 -1
  22. package/dist/esm2015/classes/buffer/checkCall.js +48 -48
  23. package/dist/esm2015/classes/buffer/checkCall.js.map +1 -1
  24. package/dist/esm2015/classes/buffer/defaultSize.js +127 -127
  25. package/dist/esm2015/classes/buffer/defaultSize.js.map +1 -1
  26. package/dist/esm2015/classes/buffer.js +342 -342
  27. package/dist/esm2015/classes/buffer.js.map +1 -1
  28. package/dist/esm2015/classes/datasource.js +23 -24
  29. package/dist/esm2015/classes/datasource.js.map +1 -1
  30. package/dist/esm2015/classes/domRoutines.js +160 -160
  31. package/dist/esm2015/classes/domRoutines.js.map +1 -1
  32. package/dist/esm2015/classes/item.js +61 -61
  33. package/dist/esm2015/classes/item.js.map +1 -1
  34. package/dist/esm2015/classes/logger.js +186 -186
  35. package/dist/esm2015/classes/logger.js.map +1 -1
  36. package/dist/esm2015/classes/paddings.js +72 -72
  37. package/dist/esm2015/classes/paddings.js.map +1 -1
  38. package/dist/esm2015/classes/reactive.js +54 -54
  39. package/dist/esm2015/classes/reactive.js.map +1 -1
  40. package/dist/esm2015/classes/settings.js +39 -39
  41. package/dist/esm2015/classes/settings.js.map +1 -1
  42. package/dist/esm2015/classes/state/clip.js +16 -16
  43. package/dist/esm2015/classes/state/clip.js.map +1 -1
  44. package/dist/esm2015/classes/state/cycle.js +60 -60
  45. package/dist/esm2015/classes/state/cycle.js.map +1 -1
  46. package/dist/esm2015/classes/state/fetch.js +122 -122
  47. package/dist/esm2015/classes/state/fetch.js.map +1 -1
  48. package/dist/esm2015/classes/state/render.js +14 -14
  49. package/dist/esm2015/classes/state/scroll.js +30 -30
  50. package/dist/esm2015/classes/state/scroll.js.map +1 -1
  51. package/dist/esm2015/classes/state.js +62 -62
  52. package/dist/esm2015/classes/state.js.map +1 -1
  53. package/dist/esm2015/classes/viewport.js +72 -72
  54. package/dist/esm2015/classes/viewport.js.map +1 -1
  55. package/dist/esm2015/index.js +9 -9
  56. package/dist/esm2015/inputs/adapter.js +242 -242
  57. package/dist/esm2015/inputs/common.js +11 -11
  58. package/dist/esm2015/inputs/datasource.js +20 -20
  59. package/dist/esm2015/inputs/index.js +7 -7
  60. package/dist/esm2015/inputs/settings.js +146 -146
  61. package/dist/esm2015/inputs/validation.js +371 -374
  62. package/dist/esm2015/inputs/validation.js.map +1 -1
  63. package/dist/esm2015/inputs/workflow.js +30 -30
  64. package/dist/esm2015/interfaces/adapter.js +1 -1
  65. package/dist/esm2015/interfaces/datasource.js +1 -1
  66. package/dist/esm2015/interfaces/index.js +1 -1
  67. package/dist/esm2015/interfaces/item.js +1 -1
  68. package/dist/esm2015/interfaces/process.js +1 -1
  69. package/dist/esm2015/interfaces/process.js.map +1 -1
  70. package/dist/esm2015/interfaces/routines.js +1 -1
  71. package/dist/esm2015/interfaces/settings.js +1 -1
  72. package/dist/esm2015/interfaces/state.js +1 -1
  73. package/dist/esm2015/interfaces/validation.js +1 -1
  74. package/dist/esm2015/interfaces/workflow.js +1 -1
  75. package/dist/esm2015/processes/adapter/append.js +36 -36
  76. package/dist/esm2015/processes/adapter/append.js.map +1 -1
  77. package/dist/esm2015/processes/adapter/check.js +32 -32
  78. package/dist/esm2015/processes/adapter/check.js.map +1 -1
  79. package/dist/esm2015/processes/adapter/clip.js +12 -12
  80. package/dist/esm2015/processes/adapter/fix.js +77 -77
  81. package/dist/esm2015/processes/adapter/fix.js.map +1 -1
  82. package/dist/esm2015/processes/adapter/insert.js +73 -73
  83. package/dist/esm2015/processes/adapter/insert.js.map +1 -1
  84. package/dist/esm2015/processes/adapter/pause.js +22 -22
  85. package/dist/esm2015/processes/adapter/pause.js.map +1 -1
  86. package/dist/esm2015/processes/adapter/reload.js +19 -19
  87. package/dist/esm2015/processes/adapter/reload.js.map +1 -1
  88. package/dist/esm2015/processes/adapter/remove.js +102 -102
  89. package/dist/esm2015/processes/adapter/remove.js.map +1 -1
  90. package/dist/esm2015/processes/adapter/replace.js +39 -39
  91. package/dist/esm2015/processes/adapter/replace.js.map +1 -1
  92. package/dist/esm2015/processes/adapter/reset.js +35 -35
  93. package/dist/esm2015/processes/adapter/reset.js.map +1 -1
  94. package/dist/esm2015/processes/adapter/update.js +43 -43
  95. package/dist/esm2015/processes/adapter/update.js.map +1 -1
  96. package/dist/esm2015/processes/adjust.js +141 -141
  97. package/dist/esm2015/processes/adjust.js.map +1 -1
  98. package/dist/esm2015/processes/clip.js +49 -49
  99. package/dist/esm2015/processes/clip.js.map +1 -1
  100. package/dist/esm2015/processes/end.js +52 -52
  101. package/dist/esm2015/processes/end.js.map +1 -1
  102. package/dist/esm2015/processes/fetch.js +91 -91
  103. package/dist/esm2015/processes/fetch.js.map +1 -1
  104. package/dist/esm2015/processes/index.js +24 -24
  105. package/dist/esm2015/processes/init.js +14 -14
  106. package/dist/esm2015/processes/misc/base.js +30 -30
  107. package/dist/esm2015/processes/misc/base.js.map +1 -1
  108. package/dist/esm2015/processes/misc/enums.js +36 -36
  109. package/dist/esm2015/processes/misc/index.js +2 -2
  110. package/dist/esm2015/processes/postFetch.js +65 -65
  111. package/dist/esm2015/processes/postFetch.js.map +1 -1
  112. package/dist/esm2015/processes/preClip.js +85 -85
  113. package/dist/esm2015/processes/preClip.js.map +1 -1
  114. package/dist/esm2015/processes/preFetch.js +240 -240
  115. package/dist/esm2015/processes/preFetch.js.map +1 -1
  116. package/dist/esm2015/processes/render.js +54 -54
  117. package/dist/esm2015/processes/render.js.map +1 -1
  118. package/dist/esm2015/processes/scroll.js +97 -97
  119. package/dist/esm2015/processes/scroll.js.map +1 -1
  120. package/dist/esm2015/processes/start.js +11 -11
  121. package/dist/esm2015/scroller.js +86 -86
  122. package/dist/esm2015/scroller.js.map +1 -1
  123. package/dist/esm2015/version.js +4 -4
  124. package/dist/esm2015/version.js.map +1 -1
  125. package/dist/esm2015/workflow-transducer.js +218 -218
  126. package/dist/esm2015/workflow-transducer.js.map +1 -1
  127. package/dist/esm2015/workflow.js +174 -174
  128. package/dist/esm2015/workflow.js.map +1 -1
  129. package/dist/esm5/classes/adapter/context.js +50 -50
  130. package/dist/esm5/classes/adapter/context.js.map +1 -1
  131. package/dist/esm5/classes/adapter/props.js +300 -300
  132. package/dist/esm5/classes/adapter/wanted.js +29 -29
  133. package/dist/esm5/classes/adapter/wanted.js.map +1 -1
  134. package/dist/esm5/classes/adapter.js +535 -535
  135. package/dist/esm5/classes/adapter.js.map +1 -1
  136. package/dist/esm5/classes/buffer/cache.js +260 -260
  137. package/dist/esm5/classes/buffer/cache.js.map +1 -1
  138. package/dist/esm5/classes/buffer/checkCall.js +56 -56
  139. package/dist/esm5/classes/buffer/checkCall.js.map +1 -1
  140. package/dist/esm5/classes/buffer/defaultSize.js +145 -145
  141. package/dist/esm5/classes/buffer/defaultSize.js.map +1 -1
  142. package/dist/esm5/classes/buffer.js +409 -409
  143. package/dist/esm5/classes/buffer.js.map +1 -1
  144. package/dist/esm5/classes/datasource.js +30 -31
  145. package/dist/esm5/classes/datasource.js.map +1 -1
  146. package/dist/esm5/classes/domRoutines.js +165 -165
  147. package/dist/esm5/classes/domRoutines.js.map +1 -1
  148. package/dist/esm5/classes/item.js +76 -76
  149. package/dist/esm5/classes/item.js.map +1 -1
  150. package/dist/esm5/classes/logger.js +210 -210
  151. package/dist/esm5/classes/logger.js.map +1 -1
  152. package/dist/esm5/classes/paddings.js +80 -80
  153. package/dist/esm5/classes/paddings.js.map +1 -1
  154. package/dist/esm5/classes/reactive.js +69 -69
  155. package/dist/esm5/classes/reactive.js.map +1 -1
  156. package/dist/esm5/classes/settings.js +47 -47
  157. package/dist/esm5/classes/settings.js.map +1 -1
  158. package/dist/esm5/classes/state/clip.js +22 -22
  159. package/dist/esm5/classes/state/clip.js.map +1 -1
  160. package/dist/esm5/classes/state/cycle.js +75 -75
  161. package/dist/esm5/classes/state/cycle.js.map +1 -1
  162. package/dist/esm5/classes/state/fetch.js +148 -148
  163. package/dist/esm5/classes/state/fetch.js.map +1 -1
  164. package/dist/esm5/classes/state/render.js +20 -20
  165. package/dist/esm5/classes/state/scroll.js +32 -32
  166. package/dist/esm5/classes/state/scroll.js.map +1 -1
  167. package/dist/esm5/classes/state.js +69 -69
  168. package/dist/esm5/classes/state.js.map +1 -1
  169. package/dist/esm5/classes/viewport.js +79 -79
  170. package/dist/esm5/classes/viewport.js.map +1 -1
  171. package/dist/esm5/index.js +9 -9
  172. package/dist/esm5/inputs/adapter.js +243 -243
  173. package/dist/esm5/inputs/common.js +11 -11
  174. package/dist/esm5/inputs/datasource.js +21 -21
  175. package/dist/esm5/inputs/index.js +7 -7
  176. package/dist/esm5/inputs/settings.js +147 -147
  177. package/dist/esm5/inputs/validation.js +393 -396
  178. package/dist/esm5/inputs/validation.js.map +1 -1
  179. package/dist/esm5/inputs/workflow.js +31 -31
  180. package/dist/esm5/interfaces/adapter.js +1 -1
  181. package/dist/esm5/interfaces/datasource.js +1 -1
  182. package/dist/esm5/interfaces/index.js +1 -1
  183. package/dist/esm5/interfaces/item.js +1 -1
  184. package/dist/esm5/interfaces/process.js +1 -1
  185. package/dist/esm5/interfaces/process.js.map +1 -1
  186. package/dist/esm5/interfaces/routines.js +1 -1
  187. package/dist/esm5/interfaces/settings.js +1 -1
  188. package/dist/esm5/interfaces/state.js +1 -1
  189. package/dist/esm5/interfaces/validation.js +1 -1
  190. package/dist/esm5/interfaces/workflow.js +1 -1
  191. package/dist/esm5/processes/adapter/append.js +44 -44
  192. package/dist/esm5/processes/adapter/append.js.map +1 -1
  193. package/dist/esm5/processes/adapter/check.js +39 -39
  194. package/dist/esm5/processes/adapter/check.js.map +1 -1
  195. package/dist/esm5/processes/adapter/clip.js +19 -19
  196. package/dist/esm5/processes/adapter/fix.js +89 -89
  197. package/dist/esm5/processes/adapter/fix.js.map +1 -1
  198. package/dist/esm5/processes/adapter/insert.js +81 -81
  199. package/dist/esm5/processes/adapter/insert.js.map +1 -1
  200. package/dist/esm5/processes/adapter/pause.js +29 -29
  201. package/dist/esm5/processes/adapter/pause.js.map +1 -1
  202. package/dist/esm5/processes/adapter/reload.js +26 -26
  203. package/dist/esm5/processes/adapter/reload.js.map +1 -1
  204. package/dist/esm5/processes/adapter/remove.js +115 -115
  205. package/dist/esm5/processes/adapter/remove.js.map +1 -1
  206. package/dist/esm5/processes/adapter/replace.js +47 -47
  207. package/dist/esm5/processes/adapter/replace.js.map +1 -1
  208. package/dist/esm5/processes/adapter/reset.js +42 -42
  209. package/dist/esm5/processes/adapter/reset.js.map +1 -1
  210. package/dist/esm5/processes/adapter/update.js +59 -59
  211. package/dist/esm5/processes/adapter/update.js.map +1 -1
  212. package/dist/esm5/processes/adjust.js +152 -152
  213. package/dist/esm5/processes/adjust.js.map +1 -1
  214. package/dist/esm5/processes/clip.js +60 -60
  215. package/dist/esm5/processes/clip.js.map +1 -1
  216. package/dist/esm5/processes/end.js +63 -63
  217. package/dist/esm5/processes/end.js.map +1 -1
  218. package/dist/esm5/processes/fetch.js +102 -102
  219. package/dist/esm5/processes/fetch.js.map +1 -1
  220. package/dist/esm5/processes/index.js +24 -24
  221. package/dist/esm5/processes/init.js +21 -21
  222. package/dist/esm5/processes/misc/base.js +44 -44
  223. package/dist/esm5/processes/misc/base.js.map +1 -1
  224. package/dist/esm5/processes/misc/enums.js +36 -36
  225. package/dist/esm5/processes/misc/index.js +2 -2
  226. package/dist/esm5/processes/postFetch.js +74 -74
  227. package/dist/esm5/processes/postFetch.js.map +1 -1
  228. package/dist/esm5/processes/preClip.js +94 -94
  229. package/dist/esm5/processes/preClip.js.map +1 -1
  230. package/dist/esm5/processes/preFetch.js +247 -247
  231. package/dist/esm5/processes/preFetch.js.map +1 -1
  232. package/dist/esm5/processes/render.js +63 -63
  233. package/dist/esm5/processes/render.js.map +1 -1
  234. package/dist/esm5/processes/scroll.js +107 -107
  235. package/dist/esm5/processes/scroll.js.map +1 -1
  236. package/dist/esm5/processes/start.js +18 -18
  237. package/dist/esm5/scroller.js +100 -100
  238. package/dist/esm5/scroller.js.map +1 -1
  239. package/dist/esm5/version.js +4 -4
  240. package/dist/esm5/version.js.map +1 -1
  241. package/dist/esm5/workflow-transducer.js +220 -220
  242. package/dist/esm5/workflow-transducer.js.map +1 -1
  243. package/dist/esm5/workflow.js +198 -198
  244. package/dist/esm5/workflow.js.map +1 -1
  245. package/dist/typings/classes/adapter/context.d.ts +4 -4
  246. package/dist/typings/classes/adapter/props.d.ts +52 -52
  247. package/dist/typings/classes/adapter/wanted.d.ts +14 -14
  248. package/dist/typings/classes/adapter.d.ts +79 -79
  249. package/dist/typings/classes/buffer/cache.d.ts +95 -95
  250. package/dist/typings/classes/buffer/checkCall.d.ts +12 -12
  251. package/dist/typings/classes/buffer/defaultSize.d.ts +32 -32
  252. package/dist/typings/classes/buffer.d.ts +64 -64
  253. package/dist/typings/classes/datasource.d.ts +11 -11
  254. package/dist/typings/classes/domRoutines.d.ts +36 -36
  255. package/dist/typings/classes/item.d.ts +28 -28
  256. package/dist/typings/classes/logger.d.ts +28 -28
  257. package/dist/typings/classes/paddings.d.ts +22 -22
  258. package/dist/typings/classes/reactive.d.ts +21 -21
  259. package/dist/typings/classes/settings.d.ts +119 -119
  260. package/dist/typings/classes/state/clip.d.ts +9 -9
  261. package/dist/typings/classes/state/cycle.d.ts +29 -29
  262. package/dist/typings/classes/state/fetch.d.ts +62 -62
  263. package/dist/typings/classes/state/render.d.ts +9 -9
  264. package/dist/typings/classes/state/scroll.d.ts +16 -16
  265. package/dist/typings/classes/state.d.ts +29 -29
  266. package/dist/typings/classes/viewport.d.ts +32 -32
  267. package/dist/typings/index.d.ts +10 -10
  268. package/dist/typings/inputs/adapter.d.ts +5 -5
  269. package/dist/typings/inputs/common.d.ts +9 -9
  270. package/dist/typings/inputs/datasource.d.ts +7 -7
  271. package/dist/typings/inputs/index.d.ts +7 -7
  272. package/dist/typings/inputs/settings.d.ts +41 -41
  273. package/dist/typings/inputs/validation.d.ts +82 -83
  274. package/dist/typings/inputs/workflow.d.ts +9 -9
  275. package/dist/typings/interfaces/adapter.d.ts +164 -164
  276. package/dist/typings/interfaces/datasource.d.ts +28 -28
  277. package/dist/typings/interfaces/index.d.ts +10 -10
  278. package/dist/typings/interfaces/item.d.ts +8 -8
  279. package/dist/typings/interfaces/process.d.ts +35 -35
  280. package/dist/typings/interfaces/routines.d.ts +166 -166
  281. package/dist/typings/interfaces/settings.d.ts +31 -31
  282. package/dist/typings/interfaces/state.d.ts +24 -24
  283. package/dist/typings/interfaces/validation.d.ts +33 -33
  284. package/dist/typings/interfaces/workflow.d.ts +53 -53
  285. package/dist/typings/processes/adapter/append.d.ts +14 -14
  286. package/dist/typings/processes/adapter/check.d.ts +6 -6
  287. package/dist/typings/processes/adapter/clip.d.ts +7 -7
  288. package/dist/typings/processes/adapter/fix.d.ts +13 -13
  289. package/dist/typings/processes/adapter/insert.d.ts +11 -11
  290. package/dist/typings/processes/adapter/pause.d.ts +8 -8
  291. package/dist/typings/processes/adapter/reload.d.ts +6 -6
  292. package/dist/typings/processes/adapter/remove.d.ts +11 -11
  293. package/dist/typings/processes/adapter/replace.d.ts +8 -8
  294. package/dist/typings/processes/adapter/reset.d.ts +7 -7
  295. package/dist/typings/processes/adapter/update.d.ts +8 -8
  296. package/dist/typings/processes/adjust.d.ts +10 -10
  297. package/dist/typings/processes/clip.d.ts +7 -7
  298. package/dist/typings/processes/end.d.ts +10 -10
  299. package/dist/typings/processes/fetch.d.ts +18 -18
  300. package/dist/typings/processes/index.d.ts +24 -24
  301. package/dist/typings/processes/init.d.ts +7 -7
  302. package/dist/typings/processes/misc/base.d.ts +4 -4
  303. package/dist/typings/processes/misc/enums.d.ts +33 -33
  304. package/dist/typings/processes/misc/index.d.ts +2 -2
  305. package/dist/typings/processes/postFetch.d.ts +8 -8
  306. package/dist/typings/processes/preClip.d.ts +12 -12
  307. package/dist/typings/processes/preFetch.d.ts +17 -17
  308. package/dist/typings/processes/render.d.ts +9 -9
  309. package/dist/typings/processes/scroll.d.ts +13 -13
  310. package/dist/typings/processes/start.d.ts +6 -6
  311. package/dist/typings/scroller.d.ts +26 -26
  312. package/dist/typings/version.d.ts +5 -5
  313. package/dist/typings/workflow-transducer.d.ts +2 -2
  314. package/dist/typings/workflow.d.ts +29 -29
  315. package/package.json +19 -18
@@ -1,241 +1,241 @@
1
- import { BaseProcessFactory, CommonProcess, AdapterProcess, ProcessStatus } from './misc/index';
2
- import { Direction } from '../inputs/index';
3
- export default class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
4
- static run(scroller) {
5
- const { workflow, buffer, state: { fetch, cycle } } = scroller;
6
- fetch.minIndex = buffer.minIndex;
7
- // set first and last indexes of items to fetch
8
- PreFetch.setPositionsAndIndexes(scroller);
9
- // skip indexes that are in buffer
10
- PreFetch.skipBufferedItems(scroller);
11
- if (scroller.settings.infinite) {
12
- // fill indexes to include buffer if no clip
13
- PreFetch.checkBufferGaps(scroller);
14
- }
15
- // add indexes if there are too few items to fetch (clip padding)
16
- PreFetch.checkFetchPackSize(scroller);
17
- // set fetch direction
18
- PreFetch.setFetchDirection(scroller);
19
- workflow.call({
20
- process: PreFetch.process,
21
- status: PreFetch.getStatus(scroller),
22
- payload: { process: cycle.initiator }
23
- });
24
- }
25
- static setPositionsAndIndexes(scroller) {
26
- PreFetch.setPositions(scroller);
27
- PreFetch.setFirstIndex(scroller);
28
- PreFetch.setLastIndex(scroller);
29
- scroller.logger.fetch();
30
- }
31
- static setPositions(scroller) {
32
- const { state: { fetch: { positions } }, viewport } = scroller;
33
- const paddingDelta = viewport.getBufferPadding();
34
- positions.before = viewport.scrollPosition;
35
- positions.startDelta = PreFetch.getStartDelta(scroller);
36
- positions.relative = positions.before - positions.startDelta;
37
- positions.start = positions.relative - paddingDelta;
38
- positions.end = positions.relative + viewport.getSize() + paddingDelta;
39
- }
40
- static getStartDelta(scroller) {
41
- const { buffer, viewport: { offset } } = scroller;
42
- let startDelta = 0;
43
- if (offset) {
44
- startDelta += offset;
45
- }
46
- if (!buffer.defaultSize) {
47
- return startDelta;
48
- }
49
- for (let index = buffer.finiteAbsMinIndex; index < buffer.startIndex; index++) {
50
- startDelta += buffer.getSizeByIndex(index);
51
- }
52
- scroller.logger.log(() => [
53
- `start delta is ${startDelta}`, ...(offset ? [` (+${offset} offset)`] : [])
54
- ]);
55
- return startDelta;
56
- }
57
- static setFirstIndex(scroller) {
58
- const { state, buffer } = scroller;
59
- const { positions: { start }, first } = state.fetch;
60
- let firstIndex = buffer.startIndex;
61
- let firstIndexPosition = 0;
62
- if (state.cycle.innerLoop.isInitial) {
63
- scroller.logger.log('skipping fetch backward direction [initial loop]');
64
- }
65
- else if (!buffer.defaultSize) {
66
- scroller.logger.log('skipping fetch backward direction [no item size]');
67
- }
68
- else {
69
- let position = firstIndexPosition;
70
- let index = firstIndex;
71
- while (1) { // eslint-disable-line no-constant-condition
72
- if (start >= 0) {
73
- const size = buffer.getSizeByIndex(index);
74
- const diff = (position + size) - start;
75
- if (diff > 0) {
76
- firstIndex = index;
77
- firstIndexPosition = position;
78
- break;
79
- }
80
- position += size;
81
- index++;
82
- if (index < buffer.absMinIndex) {
83
- break;
84
- }
85
- }
86
- if (start < 0) {
87
- index--;
88
- if (index < buffer.absMinIndex) {
89
- break;
90
- }
91
- position -= buffer.getSizeByIndex(index);
92
- const diff = position - start;
93
- firstIndex = index;
94
- firstIndexPosition = position;
95
- if (diff <= 0) {
96
- break;
97
- }
98
- }
99
- }
100
- }
101
- first.index = first.indexBuffer = Math.max(firstIndex, buffer.absMinIndex);
102
- first.position = firstIndexPosition;
103
- }
104
- static setLastIndex(scroller) {
105
- const { state: { fetch, cycle }, buffer, settings } = scroller;
106
- const { firstVisible, positions: { relative, end }, first, last } = fetch;
107
- let lastIndex;
108
- if (!buffer.defaultSize) {
109
- // just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
110
- lastIndex = buffer.startIndex + settings.bufferSize - 1;
111
- scroller.logger.log('forcing fetch forward direction [no item size]');
112
- }
113
- else {
114
- let index = first.indexBuffer;
115
- let position = first.position;
116
- lastIndex = index;
117
- while (1) { // eslint-disable-line no-constant-condition
118
- lastIndex = index;
119
- const size = buffer.getSizeByIndex(index);
120
- position += size;
121
- if (isNaN(firstVisible.index) && position > relative) {
122
- firstVisible.index = index;
123
- if (!cycle.innerLoop.isInitial) {
124
- firstVisible.delta = position - size - relative;
125
- }
126
- }
127
- if (position >= end) {
128
- break;
129
- }
130
- if (index++ > buffer.absMaxIndex) {
131
- break;
132
- }
133
- }
134
- }
135
- last.index = last.indexBuffer = Math.min(lastIndex, buffer.absMaxIndex);
136
- }
137
- static skipBufferedItems(scroller) {
138
- const { buffer } = scroller;
139
- if (!buffer.size) {
140
- return;
141
- }
142
- const { fetch } = scroller.state;
143
- const firstIndex = fetch.first.index;
144
- const lastIndex = fetch.last.index;
145
- const packs = [[]];
146
- let p = 0;
147
- for (let i = firstIndex; i <= lastIndex; i++) {
148
- if (!buffer.get(i)) {
149
- packs[p].push(i);
150
- }
151
- else if (packs[p].length) {
152
- packs[++p] = [];
153
- }
154
- }
155
- let pack = packs[0];
156
- if (packs[0].length && packs[1] && packs[1].length) {
157
- fetch.hasAnotherPack = true;
158
- // todo: need to look for biggest pack in visible area
159
- // todo: or think about merging two requests in a single Fetch process
160
- if (packs[1].length >= packs[0].length) {
161
- pack = packs[1];
162
- }
163
- }
164
- fetch.first.index = Math.max(pack[0], buffer.absMinIndex);
165
- fetch.last.index = Math.min(pack[pack.length - 1], buffer.absMaxIndex);
166
- if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {
167
- scroller.logger.fetch('after Buffer flushing');
168
- }
169
- }
170
- static checkBufferGaps(scroller) {
171
- const { buffer, state: { fetch } } = scroller;
172
- if (!buffer.size) {
173
- return;
174
- }
175
- const fetchFirst = fetch.first.index;
176
- const bufferLast = buffer.lastIndex;
177
- if (fetchFirst > bufferLast) {
178
- fetch.first.index = fetch.first.indexBuffer = bufferLast + 1;
179
- }
180
- const bufferFirst = buffer.firstIndex;
181
- const fetchLast = fetch.last.index;
182
- if (fetchLast < bufferFirst) {
183
- fetch.last.index = fetch.last.indexBuffer = bufferFirst - 1;
184
- }
185
- if (fetch.first.index !== fetchFirst || fetch.last.index !== fetchLast) {
186
- scroller.logger.fetch('after Buffer filling (no clip case)');
187
- }
188
- }
189
- static checkFetchPackSize(scroller) {
190
- const { buffer, state: { fetch } } = scroller;
191
- if (!fetch.shouldFetch) {
192
- return;
193
- }
194
- const firstIndex = fetch.first.index;
195
- const lastIndex = fetch.last.index;
196
- const diff = scroller.settings.bufferSize - (lastIndex - firstIndex + 1);
197
- if (diff <= 0) {
198
- return;
199
- }
200
- if (!buffer.size || lastIndex > buffer.items[0].$index) { // forward
201
- const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);
202
- if (newLastIndex > lastIndex) {
203
- fetch.last.index = fetch.last.indexBuffer = newLastIndex;
204
- }
205
- }
206
- else {
207
- const newFirstIndex = Math.max(firstIndex - diff, buffer.absMinIndex);
208
- if (newFirstIndex < firstIndex) {
209
- fetch.first.index = fetch.first.indexBuffer = newFirstIndex;
210
- }
211
- }
212
- if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {
213
- scroller.logger.fetch('after bufferSize adjustment');
214
- PreFetch.skipBufferedItems(scroller);
215
- }
216
- }
217
- static setFetchDirection(scroller) {
218
- const { buffer, state: { fetch } } = scroller;
219
- if (fetch.last.index) {
220
- let direction = Direction.forward;
221
- if (buffer.size) {
222
- direction = fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;
223
- }
224
- fetch.direction = direction;
225
- scroller.logger.log(() => `fetch direction is "${direction}"`);
226
- }
227
- }
228
- static getStatus(scroller) {
229
- const { cycle, fetch } = scroller.state;
230
- if (cycle.initiator === AdapterProcess.clip) {
231
- scroller.logger.log(() => `going to skip fetch due to "${AdapterProcess.clip}" process`);
232
- return ProcessStatus.next;
233
- }
234
- if (fetch.shouldFetch) {
235
- scroller.logger.log(() => `going to fetch ${fetch.count} items started from index ${fetch.index}`);
236
- return ProcessStatus.next;
237
- }
238
- return ProcessStatus.done;
239
- }
240
- }
1
+ import { BaseProcessFactory, CommonProcess, AdapterProcess, ProcessStatus } from './misc/index';
2
+ import { Direction } from '../inputs/index';
3
+ export default class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {
4
+ static run(scroller) {
5
+ const { workflow, buffer, state: { fetch, cycle } } = scroller;
6
+ fetch.minIndex = buffer.minIndex;
7
+ // set first and last indexes of items to fetch
8
+ PreFetch.setPositionsAndIndexes(scroller);
9
+ // skip indexes that are in buffer
10
+ PreFetch.skipBufferedItems(scroller);
11
+ if (scroller.settings.infinite) {
12
+ // fill indexes to include buffer if no clip
13
+ PreFetch.checkBufferGaps(scroller);
14
+ }
15
+ // add indexes if there are too few items to fetch (clip padding)
16
+ PreFetch.checkFetchPackSize(scroller);
17
+ // set fetch direction
18
+ PreFetch.setFetchDirection(scroller);
19
+ workflow.call({
20
+ process: PreFetch.process,
21
+ status: PreFetch.getStatus(scroller),
22
+ payload: { process: cycle.initiator }
23
+ });
24
+ }
25
+ static setPositionsAndIndexes(scroller) {
26
+ PreFetch.setPositions(scroller);
27
+ PreFetch.setFirstIndex(scroller);
28
+ PreFetch.setLastIndex(scroller);
29
+ scroller.logger.fetch();
30
+ }
31
+ static setPositions(scroller) {
32
+ const { state: { fetch: { positions } }, viewport } = scroller;
33
+ const paddingDelta = viewport.getBufferPadding();
34
+ positions.before = viewport.scrollPosition;
35
+ positions.startDelta = PreFetch.getStartDelta(scroller);
36
+ positions.relative = positions.before - positions.startDelta;
37
+ positions.start = positions.relative - paddingDelta;
38
+ positions.end = positions.relative + viewport.getSize() + paddingDelta;
39
+ }
40
+ static getStartDelta(scroller) {
41
+ const { buffer, viewport: { offset } } = scroller;
42
+ let startDelta = 0;
43
+ if (offset) {
44
+ startDelta += offset;
45
+ }
46
+ if (!buffer.defaultSize) {
47
+ return startDelta;
48
+ }
49
+ for (let index = buffer.finiteAbsMinIndex; index < buffer.startIndex; index++) {
50
+ startDelta += buffer.getSizeByIndex(index);
51
+ }
52
+ scroller.logger.log(() => [
53
+ `start delta is ${startDelta}`, ...(offset ? [` (+${offset} offset)`] : [])
54
+ ]);
55
+ return startDelta;
56
+ }
57
+ static setFirstIndex(scroller) {
58
+ const { state, buffer } = scroller;
59
+ const { positions: { start }, first } = state.fetch;
60
+ let firstIndex = buffer.startIndex;
61
+ let firstIndexPosition = 0;
62
+ if (state.cycle.innerLoop.isInitial) {
63
+ scroller.logger.log('skipping fetch backward direction [initial loop]');
64
+ }
65
+ else if (!buffer.defaultSize) {
66
+ scroller.logger.log('skipping fetch backward direction [no item size]');
67
+ }
68
+ else {
69
+ let position = firstIndexPosition;
70
+ let index = firstIndex;
71
+ while (1) { // eslint-disable-line no-constant-condition
72
+ if (start >= 0) {
73
+ const size = buffer.getSizeByIndex(index);
74
+ const diff = (position + size) - start;
75
+ if (diff > 0) {
76
+ firstIndex = index;
77
+ firstIndexPosition = position;
78
+ break;
79
+ }
80
+ position += size;
81
+ index++;
82
+ if (index < buffer.absMinIndex) {
83
+ break;
84
+ }
85
+ }
86
+ if (start < 0) {
87
+ index--;
88
+ if (index < buffer.absMinIndex) {
89
+ break;
90
+ }
91
+ position -= buffer.getSizeByIndex(index);
92
+ const diff = position - start;
93
+ firstIndex = index;
94
+ firstIndexPosition = position;
95
+ if (diff <= 0) {
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ }
101
+ first.index = first.indexBuffer = Math.max(firstIndex, buffer.absMinIndex);
102
+ first.position = firstIndexPosition;
103
+ }
104
+ static setLastIndex(scroller) {
105
+ const { state: { fetch, cycle }, buffer, settings } = scroller;
106
+ const { firstVisible, positions: { relative, end }, first, last } = fetch;
107
+ let lastIndex;
108
+ if (!buffer.defaultSize) {
109
+ // just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present
110
+ lastIndex = buffer.startIndex + settings.bufferSize - 1;
111
+ scroller.logger.log('forcing fetch forward direction [no item size]');
112
+ }
113
+ else {
114
+ let index = first.indexBuffer;
115
+ let position = first.position;
116
+ lastIndex = index;
117
+ while (1) { // eslint-disable-line no-constant-condition
118
+ lastIndex = index;
119
+ const size = buffer.getSizeByIndex(index);
120
+ position += size;
121
+ if (isNaN(firstVisible.index) && position > relative) {
122
+ firstVisible.index = index;
123
+ if (!cycle.innerLoop.isInitial) {
124
+ firstVisible.delta = position - size - relative;
125
+ }
126
+ }
127
+ if (position >= end) {
128
+ break;
129
+ }
130
+ if (index++ > buffer.absMaxIndex) {
131
+ break;
132
+ }
133
+ }
134
+ }
135
+ last.index = last.indexBuffer = Math.min(lastIndex, buffer.absMaxIndex);
136
+ }
137
+ static skipBufferedItems(scroller) {
138
+ const { buffer } = scroller;
139
+ if (!buffer.size) {
140
+ return;
141
+ }
142
+ const { fetch } = scroller.state;
143
+ const firstIndex = fetch.first.index;
144
+ const lastIndex = fetch.last.index;
145
+ const packs = [[]];
146
+ let p = 0;
147
+ for (let i = firstIndex; i <= lastIndex; i++) {
148
+ if (!buffer.get(i)) {
149
+ packs[p].push(i);
150
+ }
151
+ else if (packs[p].length) {
152
+ packs[++p] = [];
153
+ }
154
+ }
155
+ let pack = packs[0];
156
+ if (packs[0].length && packs[1] && packs[1].length) {
157
+ fetch.hasAnotherPack = true;
158
+ // todo: need to look for biggest pack in visible area
159
+ // todo: or think about merging two requests in a single Fetch process
160
+ if (packs[1].length >= packs[0].length) {
161
+ pack = packs[1];
162
+ }
163
+ }
164
+ fetch.first.index = Math.max(pack[0], buffer.absMinIndex);
165
+ fetch.last.index = Math.min(pack[pack.length - 1], buffer.absMaxIndex);
166
+ if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {
167
+ scroller.logger.fetch('after Buffer flushing');
168
+ }
169
+ }
170
+ static checkBufferGaps(scroller) {
171
+ const { buffer, state: { fetch } } = scroller;
172
+ if (!buffer.size) {
173
+ return;
174
+ }
175
+ const fetchFirst = fetch.first.index;
176
+ const bufferLast = buffer.lastIndex;
177
+ if (fetchFirst > bufferLast) {
178
+ fetch.first.index = fetch.first.indexBuffer = bufferLast + 1;
179
+ }
180
+ const bufferFirst = buffer.firstIndex;
181
+ const fetchLast = fetch.last.index;
182
+ if (fetchLast < bufferFirst) {
183
+ fetch.last.index = fetch.last.indexBuffer = bufferFirst - 1;
184
+ }
185
+ if (fetch.first.index !== fetchFirst || fetch.last.index !== fetchLast) {
186
+ scroller.logger.fetch('after Buffer filling (no clip case)');
187
+ }
188
+ }
189
+ static checkFetchPackSize(scroller) {
190
+ const { buffer, state: { fetch } } = scroller;
191
+ if (!fetch.shouldFetch) {
192
+ return;
193
+ }
194
+ const firstIndex = fetch.first.index;
195
+ const lastIndex = fetch.last.index;
196
+ const diff = scroller.settings.bufferSize - (lastIndex - firstIndex + 1);
197
+ if (diff <= 0) {
198
+ return;
199
+ }
200
+ if (!buffer.size || lastIndex > buffer.items[0].$index) { // forward
201
+ const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);
202
+ if (newLastIndex > lastIndex) {
203
+ fetch.last.index = fetch.last.indexBuffer = newLastIndex;
204
+ }
205
+ }
206
+ else {
207
+ const newFirstIndex = Math.max(firstIndex - diff, buffer.absMinIndex);
208
+ if (newFirstIndex < firstIndex) {
209
+ fetch.first.index = fetch.first.indexBuffer = newFirstIndex;
210
+ }
211
+ }
212
+ if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {
213
+ scroller.logger.fetch('after bufferSize adjustment');
214
+ PreFetch.skipBufferedItems(scroller);
215
+ }
216
+ }
217
+ static setFetchDirection(scroller) {
218
+ const { buffer, state: { fetch } } = scroller;
219
+ if (fetch.last.index) {
220
+ let direction = Direction.forward;
221
+ if (buffer.size) {
222
+ direction = fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;
223
+ }
224
+ fetch.direction = direction;
225
+ scroller.logger.log(() => `fetch direction is "${direction}"`);
226
+ }
227
+ }
228
+ static getStatus(scroller) {
229
+ const { cycle, fetch } = scroller.state;
230
+ if (cycle.initiator === AdapterProcess.clip) {
231
+ scroller.logger.log(() => `going to skip fetch due to "${AdapterProcess.clip}" process`);
232
+ return ProcessStatus.next;
233
+ }
234
+ if (fetch.shouldFetch) {
235
+ scroller.logger.log(() => `going to fetch ${fetch.count} items started from index ${fetch.index}`);
236
+ return ProcessStatus.next;
237
+ }
238
+ return ProcessStatus.done;
239
+ }
240
+ }
241
241
  //# sourceMappingURL=preFetch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preFetch.js","sourceRoot":"","sources":["../../../src/processes/preFetch.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseProcessFactory, CommonProcess, AdapterProcess, ProcessStatus } from './misc/index';\r\nimport { Scroller } from '../scroller';\r\nimport { Direction } from '../inputs/index';\r\n\r\nexport default class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {\r\n\r\n static run(scroller: Scroller): void {\r\n const { workflow, buffer, state: { fetch, cycle } } = scroller;\r\n fetch.minIndex = buffer.minIndex;\r\n\r\n // set first and last indexes of items to fetch\r\n PreFetch.setPositionsAndIndexes(scroller);\r\n\r\n // skip indexes that are in buffer\r\n PreFetch.skipBufferedItems(scroller);\r\n\r\n if (scroller.settings.infinite) {\r\n // fill indexes to include buffer if no clip\r\n PreFetch.checkBufferGaps(scroller);\r\n }\r\n\r\n // add indexes if there are too few items to fetch (clip padding)\r\n PreFetch.checkFetchPackSize(scroller);\r\n\r\n // set fetch direction\r\n PreFetch.setFetchDirection(scroller);\r\n\r\n workflow.call({\r\n process: PreFetch.process,\r\n status: PreFetch.getStatus(scroller),\r\n payload: { process: cycle.initiator }\r\n });\r\n }\r\n\r\n static setPositionsAndIndexes(scroller: Scroller): void {\r\n PreFetch.setPositions(scroller);\r\n PreFetch.setFirstIndex(scroller);\r\n PreFetch.setLastIndex(scroller);\r\n scroller.logger.fetch();\r\n }\r\n\r\n static setPositions(scroller: Scroller): void {\r\n const { state: { fetch: { positions } }, viewport } = scroller;\r\n const paddingDelta = viewport.getBufferPadding();\r\n positions.before = viewport.scrollPosition;\r\n positions.startDelta = PreFetch.getStartDelta(scroller);\r\n positions.relative = positions.before - positions.startDelta;\r\n positions.start = positions.relative - paddingDelta;\r\n positions.end = positions.relative + viewport.getSize() + paddingDelta;\r\n }\r\n\r\n static getStartDelta(scroller: Scroller): number { // calculate size before start index\r\n const { buffer, viewport: { offset } } = scroller;\r\n let startDelta = 0;\r\n if (offset) {\r\n startDelta += offset;\r\n }\r\n if (!buffer.defaultSize) {\r\n return startDelta;\r\n }\r\n for (let index = buffer.finiteAbsMinIndex; index < buffer.startIndex; index++) {\r\n startDelta += buffer.getSizeByIndex(index);\r\n }\r\n scroller.logger.log(() => [\r\n `start delta is ${startDelta}`, ...(offset ? [` (+${offset} offset)`] : [])\r\n ]);\r\n return startDelta;\r\n }\r\n\r\n static setFirstIndex(scroller: Scroller): void {\r\n const { state, buffer } = scroller;\r\n const { positions: { start }, first } = state.fetch;\r\n let firstIndex = buffer.startIndex;\r\n let firstIndexPosition = 0;\r\n if (state.cycle.innerLoop.isInitial) {\r\n scroller.logger.log('skipping fetch backward direction [initial loop]');\r\n } else if (!buffer.defaultSize) {\r\n scroller.logger.log('skipping fetch backward direction [no item size]');\r\n } else {\r\n let position = firstIndexPosition;\r\n let index = firstIndex;\r\n while (1) { // eslint-disable-line no-constant-condition\r\n if (start >= 0) {\r\n const size = buffer.getSizeByIndex(index);\r\n const diff = (position + size) - start;\r\n if (diff > 0) {\r\n firstIndex = index;\r\n firstIndexPosition = position;\r\n break;\r\n }\r\n position += size;\r\n index++;\r\n if (index < buffer.absMinIndex) {\r\n break;\r\n }\r\n }\r\n if (start < 0) {\r\n index--;\r\n if (index < buffer.absMinIndex) {\r\n break;\r\n }\r\n position -= buffer.getSizeByIndex(index);\r\n const diff = position - start;\r\n firstIndex = index;\r\n firstIndexPosition = position;\r\n if (diff <= 0) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n first.index = first.indexBuffer = Math.max(firstIndex, buffer.absMinIndex);\r\n first.position = firstIndexPosition;\r\n }\r\n\r\n static setLastIndex(scroller: Scroller): void {\r\n const { state: { fetch, cycle }, buffer, settings } = scroller;\r\n const { firstVisible, positions: { relative, end }, first, last } = fetch;\r\n let lastIndex;\r\n if (!buffer.defaultSize) {\r\n // just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present\r\n lastIndex = buffer.startIndex + settings.bufferSize - 1;\r\n scroller.logger.log('forcing fetch forward direction [no item size]');\r\n } else {\r\n let index = first.indexBuffer;\r\n let position = first.position;\r\n lastIndex = index;\r\n while (1) { // eslint-disable-line no-constant-condition\r\n lastIndex = index;\r\n const size = buffer.getSizeByIndex(index);\r\n position += size;\r\n if (isNaN(firstVisible.index) && position > relative) {\r\n firstVisible.index = index;\r\n if (!cycle.innerLoop.isInitial) {\r\n firstVisible.delta = position - size - relative;\r\n }\r\n }\r\n if (position >= end) {\r\n break;\r\n }\r\n if (index++ > buffer.absMaxIndex) {\r\n break;\r\n }\r\n }\r\n }\r\n last.index = last.indexBuffer = Math.min(lastIndex, buffer.absMaxIndex);\r\n }\r\n\r\n static skipBufferedItems(scroller: Scroller): void {\r\n const { buffer } = scroller;\r\n if (!buffer.size) {\r\n return;\r\n }\r\n const { fetch } = scroller.state;\r\n const firstIndex = fetch.first.index;\r\n const lastIndex = fetch.last.index;\r\n const packs: number[][] = [[]];\r\n let p = 0;\r\n for (let i = firstIndex; i <= lastIndex; i++) {\r\n if (!buffer.get(i)) {\r\n packs[p].push(i);\r\n } else if (packs[p].length) {\r\n packs[++p] = [];\r\n }\r\n }\r\n let pack = packs[0];\r\n if (packs[0].length && packs[1] && packs[1].length) {\r\n fetch.hasAnotherPack = true;\r\n // todo: need to look for biggest pack in visible area\r\n // todo: or think about merging two requests in a single Fetch process\r\n if (packs[1].length >= packs[0].length) {\r\n pack = packs[1];\r\n }\r\n }\r\n fetch.first.index = Math.max(pack[0], buffer.absMinIndex);\r\n fetch.last.index = Math.min(pack[pack.length - 1], buffer.absMaxIndex);\r\n if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {\r\n scroller.logger.fetch('after Buffer flushing');\r\n }\r\n }\r\n\r\n static checkBufferGaps(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (!buffer.size) {\r\n return;\r\n }\r\n const fetchFirst = fetch.first.index;\r\n const bufferLast = buffer.lastIndex;\r\n if (fetchFirst > bufferLast) {\r\n fetch.first.index = fetch.first.indexBuffer = bufferLast + 1;\r\n }\r\n const bufferFirst = buffer.firstIndex;\r\n const fetchLast = fetch.last.index;\r\n if (fetchLast < bufferFirst) {\r\n fetch.last.index = fetch.last.indexBuffer = bufferFirst - 1;\r\n }\r\n if (fetch.first.index !== fetchFirst || fetch.last.index !== fetchLast) {\r\n scroller.logger.fetch('after Buffer filling (no clip case)');\r\n }\r\n }\r\n\r\n static checkFetchPackSize(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (!fetch.shouldFetch) {\r\n return;\r\n }\r\n const firstIndex = fetch.first.index;\r\n const lastIndex = fetch.last.index;\r\n const diff = scroller.settings.bufferSize - (lastIndex - firstIndex + 1);\r\n if (diff <= 0) {\r\n return;\r\n }\r\n if (!buffer.size || lastIndex > buffer.items[0].$index) { // forward\r\n const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);\r\n if (newLastIndex > lastIndex) {\r\n fetch.last.index = fetch.last.indexBuffer = newLastIndex;\r\n }\r\n } else {\r\n const newFirstIndex = Math.max(firstIndex - diff, buffer.absMinIndex);\r\n if (newFirstIndex < firstIndex) {\r\n fetch.first.index = fetch.first.indexBuffer = newFirstIndex;\r\n }\r\n }\r\n if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {\r\n scroller.logger.fetch('after bufferSize adjustment');\r\n PreFetch.skipBufferedItems(scroller);\r\n }\r\n }\r\n\r\n static setFetchDirection(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (fetch.last.index) {\r\n let direction = Direction.forward;\r\n if (buffer.size) {\r\n direction = fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;\r\n }\r\n fetch.direction = direction;\r\n scroller.logger.log(() => `fetch direction is \"${direction}\"`);\r\n }\r\n }\r\n\r\n static getStatus(scroller: Scroller): ProcessStatus {\r\n const { cycle, fetch } = scroller.state;\r\n if (cycle.initiator === AdapterProcess.clip) {\r\n scroller.logger.log(() => `going to skip fetch due to \"${AdapterProcess.clip}\" process`);\r\n return ProcessStatus.next;\r\n }\r\n if (fetch.shouldFetch) {\r\n scroller.logger.log(() => `going to fetch ${fetch.count} items started from index ${fetch.index}`);\r\n return ProcessStatus.next;\r\n }\r\n return ProcessStatus.done;\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"preFetch.js","sourceRoot":"","sources":["../../../src/processes/preFetch.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseProcessFactory, CommonProcess, AdapterProcess, ProcessStatus } from './misc/index';\r\nimport { Scroller } from '../scroller';\r\nimport { Direction } from '../inputs/index';\r\n\r\nexport default class PreFetch extends BaseProcessFactory(CommonProcess.preFetch) {\r\n\r\n static run(scroller: Scroller): void {\r\n const { workflow, buffer, state: { fetch, cycle } } = scroller;\r\n fetch.minIndex = buffer.minIndex;\r\n\r\n // set first and last indexes of items to fetch\r\n PreFetch.setPositionsAndIndexes(scroller);\r\n\r\n // skip indexes that are in buffer\r\n PreFetch.skipBufferedItems(scroller);\r\n\r\n if (scroller.settings.infinite) {\r\n // fill indexes to include buffer if no clip\r\n PreFetch.checkBufferGaps(scroller);\r\n }\r\n\r\n // add indexes if there are too few items to fetch (clip padding)\r\n PreFetch.checkFetchPackSize(scroller);\r\n\r\n // set fetch direction\r\n PreFetch.setFetchDirection(scroller);\r\n\r\n workflow.call({\r\n process: PreFetch.process,\r\n status: PreFetch.getStatus(scroller),\r\n payload: { process: cycle.initiator }\r\n });\r\n }\r\n\r\n static setPositionsAndIndexes(scroller: Scroller): void {\r\n PreFetch.setPositions(scroller);\r\n PreFetch.setFirstIndex(scroller);\r\n PreFetch.setLastIndex(scroller);\r\n scroller.logger.fetch();\r\n }\r\n\r\n static setPositions(scroller: Scroller): void {\r\n const { state: { fetch: { positions } }, viewport } = scroller;\r\n const paddingDelta = viewport.getBufferPadding();\r\n positions.before = viewport.scrollPosition;\r\n positions.startDelta = PreFetch.getStartDelta(scroller);\r\n positions.relative = positions.before - positions.startDelta;\r\n positions.start = positions.relative - paddingDelta;\r\n positions.end = positions.relative + viewport.getSize() + paddingDelta;\r\n }\r\n\r\n static getStartDelta(scroller: Scroller): number { // calculate size before start index\r\n const { buffer, viewport: { offset } } = scroller;\r\n let startDelta = 0;\r\n if (offset) {\r\n startDelta += offset;\r\n }\r\n if (!buffer.defaultSize) {\r\n return startDelta;\r\n }\r\n for (let index = buffer.finiteAbsMinIndex; index < buffer.startIndex; index++) {\r\n startDelta += buffer.getSizeByIndex(index);\r\n }\r\n scroller.logger.log(() => [\r\n `start delta is ${startDelta}`, ...(offset ? [` (+${offset} offset)`] : [])\r\n ]);\r\n return startDelta;\r\n }\r\n\r\n static setFirstIndex(scroller: Scroller): void {\r\n const { state, buffer } = scroller;\r\n const { positions: { start }, first } = state.fetch;\r\n let firstIndex = buffer.startIndex;\r\n let firstIndexPosition = 0;\r\n if (state.cycle.innerLoop.isInitial) {\r\n scroller.logger.log('skipping fetch backward direction [initial loop]');\r\n } else if (!buffer.defaultSize) {\r\n scroller.logger.log('skipping fetch backward direction [no item size]');\r\n } else {\r\n let position = firstIndexPosition;\r\n let index = firstIndex;\r\n while (1) { // eslint-disable-line no-constant-condition\r\n if (start >= 0) {\r\n const size = buffer.getSizeByIndex(index);\r\n const diff = (position + size) - start;\r\n if (diff > 0) {\r\n firstIndex = index;\r\n firstIndexPosition = position;\r\n break;\r\n }\r\n position += size;\r\n index++;\r\n if (index < buffer.absMinIndex) {\r\n break;\r\n }\r\n }\r\n if (start < 0) {\r\n index--;\r\n if (index < buffer.absMinIndex) {\r\n break;\r\n }\r\n position -= buffer.getSizeByIndex(index);\r\n const diff = position - start;\r\n firstIndex = index;\r\n firstIndexPosition = position;\r\n if (diff <= 0) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n first.index = first.indexBuffer = Math.max(firstIndex, buffer.absMinIndex);\r\n first.position = firstIndexPosition;\r\n }\r\n\r\n static setLastIndex(scroller: Scroller): void {\r\n const { state: { fetch, cycle }, buffer, settings } = scroller;\r\n const { firstVisible, positions: { relative, end }, first, last } = fetch;\r\n let lastIndex;\r\n if (!buffer.defaultSize) {\r\n // just to fetch forward bufferSize items if neither averageItemSize nor itemSize are present\r\n lastIndex = buffer.startIndex + settings.bufferSize - 1;\r\n scroller.logger.log('forcing fetch forward direction [no item size]');\r\n } else {\r\n let index = first.indexBuffer;\r\n let position = first.position;\r\n lastIndex = index;\r\n while (1) { // eslint-disable-line no-constant-condition\r\n lastIndex = index;\r\n const size = buffer.getSizeByIndex(index);\r\n position += size;\r\n if (isNaN(firstVisible.index) && position > relative) {\r\n firstVisible.index = index;\r\n if (!cycle.innerLoop.isInitial) {\r\n firstVisible.delta = position - size - relative;\r\n }\r\n }\r\n if (position >= end) {\r\n break;\r\n }\r\n if (index++ > buffer.absMaxIndex) {\r\n break;\r\n }\r\n }\r\n }\r\n last.index = last.indexBuffer = Math.min(lastIndex, buffer.absMaxIndex);\r\n }\r\n\r\n static skipBufferedItems(scroller: Scroller): void {\r\n const { buffer } = scroller;\r\n if (!buffer.size) {\r\n return;\r\n }\r\n const { fetch } = scroller.state;\r\n const firstIndex = fetch.first.index;\r\n const lastIndex = fetch.last.index;\r\n const packs: number[][] = [[]];\r\n let p = 0;\r\n for (let i = firstIndex; i <= lastIndex; i++) {\r\n if (!buffer.get(i)) {\r\n packs[p].push(i);\r\n } else if (packs[p].length) {\r\n packs[++p] = [];\r\n }\r\n }\r\n let pack = packs[0];\r\n if (packs[0].length && packs[1] && packs[1].length) {\r\n fetch.hasAnotherPack = true;\r\n // todo: need to look for biggest pack in visible area\r\n // todo: or think about merging two requests in a single Fetch process\r\n if (packs[1].length >= packs[0].length) {\r\n pack = packs[1];\r\n }\r\n }\r\n fetch.first.index = Math.max(pack[0], buffer.absMinIndex);\r\n fetch.last.index = Math.min(pack[pack.length - 1], buffer.absMaxIndex);\r\n if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {\r\n scroller.logger.fetch('after Buffer flushing');\r\n }\r\n }\r\n\r\n static checkBufferGaps(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (!buffer.size) {\r\n return;\r\n }\r\n const fetchFirst = fetch.first.index;\r\n const bufferLast = buffer.lastIndex;\r\n if (fetchFirst > bufferLast) {\r\n fetch.first.index = fetch.first.indexBuffer = bufferLast + 1;\r\n }\r\n const bufferFirst = buffer.firstIndex;\r\n const fetchLast = fetch.last.index;\r\n if (fetchLast < bufferFirst) {\r\n fetch.last.index = fetch.last.indexBuffer = bufferFirst - 1;\r\n }\r\n if (fetch.first.index !== fetchFirst || fetch.last.index !== fetchLast) {\r\n scroller.logger.fetch('after Buffer filling (no clip case)');\r\n }\r\n }\r\n\r\n static checkFetchPackSize(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (!fetch.shouldFetch) {\r\n return;\r\n }\r\n const firstIndex = fetch.first.index;\r\n const lastIndex = fetch.last.index;\r\n const diff = scroller.settings.bufferSize - (lastIndex - firstIndex + 1);\r\n if (diff <= 0) {\r\n return;\r\n }\r\n if (!buffer.size || lastIndex > buffer.items[0].$index) { // forward\r\n const newLastIndex = Math.min(lastIndex + diff, buffer.absMaxIndex);\r\n if (newLastIndex > lastIndex) {\r\n fetch.last.index = fetch.last.indexBuffer = newLastIndex;\r\n }\r\n } else {\r\n const newFirstIndex = Math.max(firstIndex - diff, buffer.absMinIndex);\r\n if (newFirstIndex < firstIndex) {\r\n fetch.first.index = fetch.first.indexBuffer = newFirstIndex;\r\n }\r\n }\r\n if (fetch.first.index !== firstIndex || fetch.last.index !== lastIndex) {\r\n scroller.logger.fetch('after bufferSize adjustment');\r\n PreFetch.skipBufferedItems(scroller);\r\n }\r\n }\r\n\r\n static setFetchDirection(scroller: Scroller): void {\r\n const { buffer, state: { fetch } } = scroller;\r\n if (fetch.last.index) {\r\n let direction = Direction.forward;\r\n if (buffer.size) {\r\n direction = fetch.last.index < buffer.items[0].$index ? Direction.backward : Direction.forward;\r\n }\r\n fetch.direction = direction;\r\n scroller.logger.log(() => `fetch direction is \"${direction}\"`);\r\n }\r\n }\r\n\r\n static getStatus(scroller: Scroller): ProcessStatus {\r\n const { cycle, fetch } = scroller.state;\r\n if (cycle.initiator === AdapterProcess.clip) {\r\n scroller.logger.log(() => `going to skip fetch due to \"${AdapterProcess.clip}\" process`);\r\n return ProcessStatus.next;\r\n }\r\n if (fetch.shouldFetch) {\r\n scroller.logger.log(() => `going to fetch ${fetch.count} items started from index ${fetch.index}`);\r\n return ProcessStatus.next;\r\n }\r\n return ProcessStatus.done;\r\n }\r\n\r\n}\r\n"]}