@cloudant/couchbackup 2.9.16 → 2.9.17-SNAPSHOT.185

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 (392) hide show
  1. package/.scannerwork/report-task.txt +2 -2
  2. package/.scannerwork/scanner-report/analysis-cache2.pb +0 -0
  3. package/.scannerwork/scanner-report/analysis-warnings.pb +2 -2
  4. package/.scannerwork/scanner-report/changesets-23.pb +1 -0
  5. package/.scannerwork/scanner-report/changesets-24.pb +1 -0
  6. package/.scannerwork/scanner-report/changesets-26.pb +1 -0
  7. package/.scannerwork/scanner-report/changesets-27.pb +1 -0
  8. package/.scannerwork/scanner-report/changesets-28.pb +1 -0
  9. package/.scannerwork/scanner-report/changesets-29.pb +1 -0
  10. package/.scannerwork/scanner-report/changesets-53.pb +1 -0
  11. package/.scannerwork/scanner-report/changesets-55.pb +1 -0
  12. package/.scannerwork/scanner-report/changesets-56.pb +1 -0
  13. package/.scannerwork/scanner-report/changesets-57.pb +1 -0
  14. package/.scannerwork/scanner-report/changesets-58.pb +1 -0
  15. package/.scannerwork/scanner-report/changesets-59.pb +1 -0
  16. package/.scannerwork/scanner-report/changesets-62.pb +1 -0
  17. package/.scannerwork/scanner-report/changesets-63.pb +1 -0
  18. package/.scannerwork/scanner-report/changesets-67.pb +1 -0
  19. package/.scannerwork/scanner-report/changesets-69.pb +1 -0
  20. package/.scannerwork/scanner-report/component-1.pb +1 -2
  21. package/.scannerwork/scanner-report/component-11.pb +1 -1
  22. package/.scannerwork/scanner-report/component-12.pb +1 -1
  23. package/.scannerwork/scanner-report/component-13.pb +1 -1
  24. package/.scannerwork/scanner-report/component-14.pb +1 -1
  25. package/.scannerwork/scanner-report/component-15.pb +1 -1
  26. package/.scannerwork/scanner-report/component-16.pb +1 -1
  27. package/.scannerwork/scanner-report/component-17.pb +1 -1
  28. package/.scannerwork/scanner-report/component-18.pb +1 -1
  29. package/.scannerwork/scanner-report/component-19.pb +1 -1
  30. package/.scannerwork/scanner-report/component-20.pb +1 -1
  31. package/.scannerwork/scanner-report/component-21.pb +1 -1
  32. package/.scannerwork/scanner-report/component-22.pb +1 -1
  33. package/.scannerwork/scanner-report/component-23.pb +1 -0
  34. package/.scannerwork/scanner-report/component-24.pb +1 -0
  35. package/.scannerwork/scanner-report/component-25.pb +1 -0
  36. package/.scannerwork/scanner-report/component-26.pb +1 -0
  37. package/.scannerwork/scanner-report/component-27.pb +1 -0
  38. package/.scannerwork/scanner-report/component-28.pb +1 -0
  39. package/.scannerwork/scanner-report/component-29.pb +1 -0
  40. package/.scannerwork/scanner-report/component-3.pb +1 -1
  41. package/.scannerwork/scanner-report/component-41.pb +1 -1
  42. package/.scannerwork/scanner-report/component-42.pb +1 -1
  43. package/.scannerwork/scanner-report/component-43.pb +1 -1
  44. package/.scannerwork/scanner-report/component-44.pb +1 -1
  45. package/.scannerwork/scanner-report/component-45.pb +1 -1
  46. package/.scannerwork/scanner-report/component-46.pb +1 -1
  47. package/.scannerwork/scanner-report/component-47.pb +1 -1
  48. package/.scannerwork/scanner-report/component-48.pb +1 -1
  49. package/.scannerwork/scanner-report/component-49.pb +1 -1
  50. package/.scannerwork/scanner-report/component-50.pb +1 -1
  51. package/.scannerwork/scanner-report/component-51.pb +1 -1
  52. package/.scannerwork/scanner-report/component-52.pb +1 -1
  53. package/.scannerwork/scanner-report/component-53.pb +1 -0
  54. package/.scannerwork/scanner-report/component-54.pb +1 -1
  55. package/.scannerwork/scanner-report/component-55.pb +1 -1
  56. package/.scannerwork/scanner-report/component-56.pb +1 -0
  57. package/.scannerwork/scanner-report/component-57.pb +1 -0
  58. package/.scannerwork/scanner-report/component-58.pb +1 -0
  59. package/.scannerwork/scanner-report/component-59.pb +1 -0
  60. package/.scannerwork/scanner-report/component-60.pb +1 -1
  61. package/.scannerwork/scanner-report/component-62.pb +1 -0
  62. package/.scannerwork/scanner-report/component-63.pb +1 -0
  63. package/.scannerwork/scanner-report/component-67.pb +1 -0
  64. package/.scannerwork/scanner-report/component-69.pb +1 -0
  65. package/.scannerwork/scanner-report/component-70.pb +1 -0
  66. package/.scannerwork/scanner-report/component-9.pb +1 -1
  67. package/.scannerwork/scanner-report/coverages-11.pb +0 -0
  68. package/.scannerwork/scanner-report/coverages-12.pb +0 -0
  69. package/.scannerwork/scanner-report/coverages-13.pb +0 -0
  70. package/.scannerwork/scanner-report/coverages-14.pb +0 -0
  71. package/.scannerwork/scanner-report/coverages-15.pb +0 -0
  72. package/.scannerwork/scanner-report/coverages-16.pb +0 -0
  73. package/.scannerwork/scanner-report/coverages-17.pb +0 -0
  74. package/.scannerwork/scanner-report/coverages-18.pb +0 -0
  75. package/.scannerwork/scanner-report/coverages-19.pb +0 -0
  76. package/.scannerwork/scanner-report/coverages-20.pb +0 -0
  77. package/.scannerwork/scanner-report/coverages-21.pb +0 -0
  78. package/.scannerwork/scanner-report/coverages-22.pb +0 -0
  79. package/.scannerwork/scanner-report/coverages-24.pb +0 -0
  80. package/.scannerwork/scanner-report/coverages-27.pb +0 -0
  81. package/.scannerwork/scanner-report/coverages-28.pb +0 -0
  82. package/.scannerwork/scanner-report/coverages-41.pb +0 -0
  83. package/.scannerwork/scanner-report/coverages-42.pb +0 -0
  84. package/.scannerwork/scanner-report/coverages-43.pb +0 -0
  85. package/.scannerwork/scanner-report/coverages-44.pb +0 -0
  86. package/.scannerwork/scanner-report/coverages-45.pb +0 -0
  87. package/.scannerwork/scanner-report/coverages-46.pb +0 -0
  88. package/.scannerwork/scanner-report/coverages-47.pb +0 -0
  89. package/.scannerwork/scanner-report/coverages-48.pb +0 -0
  90. package/.scannerwork/scanner-report/coverages-49.pb +0 -0
  91. package/.scannerwork/scanner-report/coverages-50.pb +0 -0
  92. package/.scannerwork/scanner-report/coverages-51.pb +0 -0
  93. package/.scannerwork/scanner-report/coverages-52.pb +0 -0
  94. package/.scannerwork/scanner-report/coverages-54.pb +0 -0
  95. package/.scannerwork/scanner-report/coverages-56.pb +0 -0
  96. package/.scannerwork/scanner-report/coverages-58.pb +0 -0
  97. package/.scannerwork/scanner-report/coverages-59.pb +0 -0
  98. package/.scannerwork/scanner-report/coverages-60.pb +0 -0
  99. package/.scannerwork/scanner-report/coverages-62.pb +0 -0
  100. package/.scannerwork/scanner-report/coverages-69.pb +0 -0
  101. package/.scannerwork/scanner-report/duplications-12.pb +0 -3
  102. package/.scannerwork/scanner-report/duplications-15.pb +2 -0
  103. package/.scannerwork/scanner-report/duplications-24.pb +2 -0
  104. package/.scannerwork/scanner-report/duplications-43.pb +2 -0
  105. package/.scannerwork/scanner-report/duplications-50.pb +0 -2
  106. package/.scannerwork/scanner-report/duplications-51.pb +3 -2
  107. package/.scannerwork/scanner-report/duplications-66.pb +1 -1
  108. package/.scannerwork/scanner-report/measures-11.pb +0 -0
  109. package/.scannerwork/scanner-report/measures-12.pb +0 -0
  110. package/.scannerwork/scanner-report/measures-13.pb +0 -0
  111. package/.scannerwork/scanner-report/measures-14.pb +0 -0
  112. package/.scannerwork/scanner-report/measures-15.pb +0 -0
  113. package/.scannerwork/scanner-report/measures-16.pb +0 -0
  114. package/.scannerwork/scanner-report/measures-17.pb +0 -0
  115. package/.scannerwork/scanner-report/measures-18.pb +0 -0
  116. package/.scannerwork/scanner-report/measures-19.pb +0 -0
  117. package/.scannerwork/scanner-report/measures-20.pb +0 -0
  118. package/.scannerwork/scanner-report/measures-21.pb +0 -0
  119. package/.scannerwork/scanner-report/measures-22.pb +0 -0
  120. package/.scannerwork/scanner-report/measures-24.pb +0 -0
  121. package/.scannerwork/scanner-report/measures-27.pb +0 -0
  122. package/.scannerwork/scanner-report/measures-28.pb +0 -0
  123. package/.scannerwork/scanner-report/measures-41.pb +0 -0
  124. package/.scannerwork/scanner-report/measures-42.pb +0 -0
  125. package/.scannerwork/scanner-report/measures-43.pb +0 -0
  126. package/.scannerwork/scanner-report/measures-44.pb +0 -0
  127. package/.scannerwork/scanner-report/measures-45.pb +0 -0
  128. package/.scannerwork/scanner-report/measures-46.pb +0 -0
  129. package/.scannerwork/scanner-report/measures-47.pb +0 -0
  130. package/.scannerwork/scanner-report/measures-48.pb +0 -0
  131. package/.scannerwork/scanner-report/measures-49.pb +0 -0
  132. package/.scannerwork/scanner-report/measures-50.pb +0 -0
  133. package/.scannerwork/scanner-report/measures-51.pb +0 -0
  134. package/.scannerwork/scanner-report/measures-52.pb +0 -0
  135. package/.scannerwork/scanner-report/measures-54.pb +0 -0
  136. package/.scannerwork/scanner-report/measures-55.pb +0 -0
  137. package/.scannerwork/scanner-report/measures-56.pb +0 -0
  138. package/.scannerwork/scanner-report/measures-58.pb +0 -0
  139. package/.scannerwork/scanner-report/measures-59.pb +0 -0
  140. package/.scannerwork/scanner-report/measures-60.pb +0 -0
  141. package/.scannerwork/scanner-report/measures-62.pb +0 -0
  142. package/.scannerwork/scanner-report/measures-69.pb +0 -0
  143. package/.scannerwork/scanner-report/measures-9.pb +0 -0
  144. package/.scannerwork/scanner-report/metadata.pb +0 -0
  145. package/.scannerwork/scanner-report/source-11.txt +25 -16
  146. package/.scannerwork/scanner-report/source-12.txt +32 -199
  147. package/.scannerwork/scanner-report/source-13.txt +17 -87
  148. package/.scannerwork/scanner-report/source-14.txt +115 -116
  149. package/.scannerwork/scanner-report/source-15.txt +66 -423
  150. package/.scannerwork/scanner-report/source-16.txt +64 -277
  151. package/.scannerwork/scanner-report/source-17.txt +247 -66
  152. package/.scannerwork/scanner-report/source-18.txt +104 -92
  153. package/.scannerwork/scanner-report/source-19.txt +45 -120
  154. package/.scannerwork/scanner-report/source-20.txt +89 -41
  155. package/.scannerwork/scanner-report/source-21.txt +148 -24
  156. package/.scannerwork/scanner-report/source-22.txt +162 -25
  157. package/.scannerwork/scanner-report/source-24.txt +75 -0
  158. package/.scannerwork/scanner-report/{source-38.txt → source-25.txt} +143 -143
  159. package/.scannerwork/scanner-report/source-27.txt +65 -0
  160. package/.scannerwork/scanner-report/source-28.txt +100 -0
  161. package/.scannerwork/scanner-report/source-3.txt +152 -152
  162. package/.scannerwork/scanner-report/source-41.txt +315 -32
  163. package/.scannerwork/scanner-report/source-42.txt +23 -63
  164. package/.scannerwork/scanner-report/source-43.txt +169 -45
  165. package/.scannerwork/scanner-report/source-44.txt +23 -164
  166. package/.scannerwork/scanner-report/source-45.txt +116 -104
  167. package/.scannerwork/scanner-report/source-46.txt +14 -26
  168. package/.scannerwork/scanner-report/source-47.txt +48 -99
  169. package/.scannerwork/scanner-report/source-48.txt +52 -141
  170. package/.scannerwork/scanner-report/source-49.txt +254 -242
  171. package/.scannerwork/scanner-report/source-50.txt +114 -72
  172. package/.scannerwork/scanner-report/source-51.txt +198 -60
  173. package/.scannerwork/scanner-report/source-52.txt +134 -14
  174. package/.scannerwork/scanner-report/source-54.txt +80 -25
  175. package/.scannerwork/scanner-report/source-55.txt +187 -424
  176. package/.scannerwork/scanner-report/{source-5.txt → source-56.txt} +10 -7
  177. package/.scannerwork/scanner-report/source-58.txt +106 -0
  178. package/.scannerwork/scanner-report/source-59.txt +449 -0
  179. package/.scannerwork/scanner-report/source-60.txt +25 -44
  180. package/.scannerwork/scanner-report/source-62.txt +60 -0
  181. package/.scannerwork/scanner-report/source-69.txt +46 -0
  182. package/.scannerwork/scanner-report/{source-68.txt → source-70.txt} +49 -49
  183. package/.scannerwork/scanner-report/source-9.txt +424 -183
  184. package/.scannerwork/scanner-report/symbols-11.pb +18 -9
  185. package/.scannerwork/scanner-report/symbols-12.pb +20 -264
  186. package/.scannerwork/scanner-report/symbols-13.pb +13 -57
  187. package/.scannerwork/scanner-report/symbols-14.pb +33 -86
  188. package/.scannerwork/scanner-report/symbols-15.pb +43 -789
  189. package/.scannerwork/scanner-report/symbols-16.pb +44 -426
  190. package/.scannerwork/scanner-report/symbols-17.pb +354 -69
  191. package/.scannerwork/scanner-report/symbols-18.pb +30 -59
  192. package/.scannerwork/scanner-report/symbols-19.pb +19 -71
  193. package/.scannerwork/scanner-report/symbols-20.pb +45 -32
  194. package/.scannerwork/scanner-report/symbols-21.pb +126 -23
  195. package/.scannerwork/scanner-report/symbols-22.pb +143 -30
  196. package/.scannerwork/scanner-report/symbols-24.pb +42 -0
  197. package/.scannerwork/scanner-report/symbols-27.pb +33 -0
  198. package/.scannerwork/scanner-report/symbols-28.pb +69 -0
  199. package/.scannerwork/scanner-report/symbols-41.pb +353 -20
  200. package/.scannerwork/scanner-report/symbols-42.pb +23 -46
  201. package/.scannerwork/scanner-report/symbols-43.pb +203 -19
  202. package/.scannerwork/scanner-report/symbols-44.pb +9 -144
  203. package/.scannerwork/scanner-report/symbols-45.pb +86 -30
  204. package/.scannerwork/scanner-report/symbols-46.pb +8 -18
  205. package/.scannerwork/scanner-report/symbols-47.pb +23 -45
  206. package/.scannerwork/scanner-report/symbols-48.pb +39 -126
  207. package/.scannerwork/scanner-report/symbols-49.pb +402 -328
  208. package/.scannerwork/scanner-report/symbols-50.pb +71 -44
  209. package/.scannerwork/scanner-report/symbols-51.pb +264 -42
  210. package/.scannerwork/scanner-report/symbols-52.pb +92 -13
  211. package/.scannerwork/scanner-report/symbols-54.pb +58 -7
  212. package/.scannerwork/scanner-report/symbols-56.pb +9 -0
  213. package/.scannerwork/scanner-report/symbols-58.pb +59 -0
  214. package/.scannerwork/scanner-report/symbols-59.pb +790 -0
  215. package/.scannerwork/scanner-report/symbols-60.pb +31 -21
  216. package/.scannerwork/scanner-report/symbols-62.pb +21 -0
  217. package/.scannerwork/scanner-report/symbols-69.pb +7 -0
  218. package/.scannerwork/scanner-report/syntax-highlightings-11.pb +23 -25
  219. package/.scannerwork/scanner-report/syntax-highlightings-12.pb +33 -266
  220. package/.scannerwork/scanner-report/syntax-highlightings-13.pb +15 -124
  221. package/.scannerwork/scanner-report/syntax-highlightings-14.pb +94 -90
  222. package/.scannerwork/scanner-report/syntax-highlightings-15.pb +57 -591
  223. package/.scannerwork/scanner-report/syntax-highlightings-16.pb +62 -687
  224. package/.scannerwork/scanner-report/syntax-highlightings-17.pb +245 -67
  225. package/.scannerwork/scanner-report/syntax-highlightings-18.pb +83 -148
  226. package/.scannerwork/scanner-report/syntax-highlightings-19.pb +23 -145
  227. package/.scannerwork/scanner-report/syntax-highlightings-20.pb +93 -77
  228. package/.scannerwork/scanner-report/syntax-highlightings-21.pb +177 -20
  229. package/.scannerwork/scanner-report/syntax-highlightings-22.pb +207 -33
  230. package/.scannerwork/scanner-report/syntax-highlightings-24.pb +81 -0
  231. package/.scannerwork/scanner-report/{syntax-highlightings-38.pb → syntax-highlightings-25.pb} +103 -100
  232. package/.scannerwork/scanner-report/syntax-highlightings-27.pb +110 -0
  233. package/.scannerwork/scanner-report/syntax-highlightings-28.pb +107 -0
  234. package/.scannerwork/scanner-report/syntax-highlightings-3.pb +107 -108
  235. package/.scannerwork/scanner-report/syntax-highlightings-41.pb +590 -34
  236. package/.scannerwork/scanner-report/syntax-highlightings-42.pb +22 -61
  237. package/.scannerwork/scanner-report/syntax-highlightings-43.pb +246 -25
  238. package/.scannerwork/scanner-report/syntax-highlightings-44.pb +27 -209
  239. package/.scannerwork/scanner-report/syntax-highlightings-45.pb +95 -83
  240. package/.scannerwork/scanner-report/syntax-highlightings-46.pb +20 -23
  241. package/.scannerwork/scanner-report/syntax-highlightings-47.pb +67 -96
  242. package/.scannerwork/scanner-report/syntax-highlightings-48.pb +64 -176
  243. package/.scannerwork/scanner-report/syntax-highlightings-49.pb +606 -171
  244. package/.scannerwork/scanner-report/syntax-highlightings-50.pb +145 -57
  245. package/.scannerwork/scanner-report/syntax-highlightings-51.pb +263 -47
  246. package/.scannerwork/scanner-report/syntax-highlightings-52.pb +208 -16
  247. package/.scannerwork/scanner-report/syntax-highlightings-54.pb +119 -27
  248. package/.scannerwork/scanner-report/syntax-highlightings-55.pb +289 -3261
  249. package/.scannerwork/scanner-report/syntax-highlightings-56.pb +54 -0
  250. package/.scannerwork/scanner-report/syntax-highlightings-58.pb +178 -0
  251. package/.scannerwork/scanner-report/syntax-highlightings-59.pb +627 -0
  252. package/.scannerwork/scanner-report/syntax-highlightings-60.pb +48 -61
  253. package/.scannerwork/scanner-report/syntax-highlightings-62.pb +82 -0
  254. package/.scannerwork/scanner-report/syntax-highlightings-69.pb +62 -0
  255. package/.scannerwork/scanner-report/{syntax-highlightings-68.pb → syntax-highlightings-70.pb} +14 -13
  256. package/.scannerwork/scanner-report/syntax-highlightings-9.pb +3286 -226
  257. package/package.json +1 -1
  258. package/test-18-results.xml +147 -147
  259. package/test-20-results.xml +141 -141
  260. package/test-21-results.xml +143 -143
  261. package/test-iam-20-results.xml +49 -49
  262. package/.scannerwork/scanner-report/changesets-10.pb +0 -2
  263. package/.scannerwork/scanner-report/changesets-2.pb +0 -1
  264. package/.scannerwork/scanner-report/changesets-34.pb +0 -1
  265. package/.scannerwork/scanner-report/changesets-35.pb +0 -1
  266. package/.scannerwork/scanner-report/changesets-36.pb +0 -1
  267. package/.scannerwork/scanner-report/changesets-37.pb +0 -1
  268. package/.scannerwork/scanner-report/changesets-39.pb +0 -1
  269. package/.scannerwork/scanner-report/changesets-4.pb +0 -1
  270. package/.scannerwork/scanner-report/changesets-40.pb +0 -1
  271. package/.scannerwork/scanner-report/changesets-5.pb +0 -1
  272. package/.scannerwork/scanner-report/changesets-6.pb +0 -1
  273. package/.scannerwork/scanner-report/changesets-61.pb +0 -1
  274. package/.scannerwork/scanner-report/changesets-64.pb +0 -1
  275. package/.scannerwork/scanner-report/changesets-7.pb +0 -1
  276. package/.scannerwork/scanner-report/changesets-8.pb +0 -1
  277. package/.scannerwork/scanner-report/changesets-9.pb +0 -1
  278. package/.scannerwork/scanner-report/component-10.pb +0 -2
  279. package/.scannerwork/scanner-report/component-2.pb +0 -1
  280. package/.scannerwork/scanner-report/component-34.pb +0 -1
  281. package/.scannerwork/scanner-report/component-35.pb +0 -1
  282. package/.scannerwork/scanner-report/component-36.pb +0 -1
  283. package/.scannerwork/scanner-report/component-37.pb +0 -1
  284. package/.scannerwork/scanner-report/component-38.pb +0 -1
  285. package/.scannerwork/scanner-report/component-39.pb +0 -1
  286. package/.scannerwork/scanner-report/component-4.pb +0 -1
  287. package/.scannerwork/scanner-report/component-40.pb +0 -1
  288. package/.scannerwork/scanner-report/component-5.pb +0 -1
  289. package/.scannerwork/scanner-report/component-6.pb +0 -1
  290. package/.scannerwork/scanner-report/component-61.pb +0 -1
  291. package/.scannerwork/scanner-report/component-64.pb +0 -1
  292. package/.scannerwork/scanner-report/component-68.pb +0 -1
  293. package/.scannerwork/scanner-report/component-7.pb +0 -1
  294. package/.scannerwork/scanner-report/component-8.pb +0 -1
  295. package/.scannerwork/scanner-report/coverages-10.pb +0 -0
  296. package/.scannerwork/scanner-report/coverages-36.pb +0 -0
  297. package/.scannerwork/scanner-report/coverages-37.pb +0 -0
  298. package/.scannerwork/scanner-report/coverages-39.pb +0 -0
  299. package/.scannerwork/scanner-report/coverages-5.pb +0 -0
  300. package/.scannerwork/scanner-report/coverages-6.pb +0 -0
  301. package/.scannerwork/scanner-report/coverages-8.pb +0 -0
  302. package/.scannerwork/scanner-report/coverages-9.pb +0 -0
  303. package/.scannerwork/scanner-report/duplications-9.pb +0 -2
  304. package/.scannerwork/scanner-report/measures-10.pb +0 -0
  305. package/.scannerwork/scanner-report/measures-36.pb +0 -15
  306. package/.scannerwork/scanner-report/measures-37.pb +0 -0
  307. package/.scannerwork/scanner-report/measures-39.pb +0 -0
  308. package/.scannerwork/scanner-report/measures-4.pb +0 -0
  309. package/.scannerwork/scanner-report/measures-5.pb +0 -0
  310. package/.scannerwork/scanner-report/measures-6.pb +0 -0
  311. package/.scannerwork/scanner-report/measures-8.pb +0 -0
  312. package/.scannerwork/scanner-report/source-10.txt +0 -37
  313. package/.scannerwork/scanner-report/source-36.txt +0 -151
  314. package/.scannerwork/scanner-report/source-37.txt +0 -75
  315. package/.scannerwork/scanner-report/source-39.txt +0 -129
  316. package/.scannerwork/scanner-report/source-4.txt +0 -187
  317. package/.scannerwork/scanner-report/source-6.txt +0 -329
  318. package/.scannerwork/scanner-report/source-8.txt +0 -62
  319. package/.scannerwork/scanner-report/symbols-10.pb +0 -9
  320. package/.scannerwork/scanner-report/symbols-36.pb +0 -93
  321. package/.scannerwork/scanner-report/symbols-37.pb +0 -39
  322. package/.scannerwork/scanner-report/symbols-39.pb +0 -33
  323. package/.scannerwork/scanner-report/symbols-5.pb +0 -8
  324. package/.scannerwork/scanner-report/symbols-6.pb +0 -353
  325. package/.scannerwork/scanner-report/symbols-8.pb +0 -24
  326. package/.scannerwork/scanner-report/symbols-9.pb +0 -203
  327. package/.scannerwork/scanner-report/syntax-highlightings-10.pb +0 -61
  328. package/.scannerwork/scanner-report/syntax-highlightings-36.pb +0 -237
  329. package/.scannerwork/scanner-report/syntax-highlightings-37.pb +0 -101
  330. package/.scannerwork/scanner-report/syntax-highlightings-39.pb +0 -129
  331. package/.scannerwork/scanner-report/syntax-highlightings-4.pb +0 -368
  332. package/.scannerwork/scanner-report/syntax-highlightings-5.pb +0 -49
  333. package/.scannerwork/scanner-report/syntax-highlightings-6.pb +0 -620
  334. package/.scannerwork/scanner-report/syntax-highlightings-8.pb +0 -97
  335. /package/.scannerwork/scanner-report/{coverages-40.pb → coverages-23.pb} +0 -0
  336. /package/.scannerwork/scanner-report/{coverages-2.pb → coverages-26.pb} +0 -0
  337. /package/.scannerwork/scanner-report/{coverages-34.pb → coverages-29.pb} +0 -0
  338. /package/.scannerwork/scanner-report/{coverages-7.pb → coverages-53.pb} +0 -0
  339. /package/.scannerwork/scanner-report/{coverages-4.pb → coverages-55.pb} +0 -0
  340. /package/.scannerwork/scanner-report/{coverages-35.pb → coverages-57.pb} +0 -0
  341. /package/.scannerwork/scanner-report/{coverages-61.pb → coverages-63.pb} +0 -0
  342. /package/.scannerwork/scanner-report/{coverages-64.pb → coverages-67.pb} +0 -0
  343. /package/.scannerwork/scanner-report/{duplications-10.pb → duplications-23.pb} +0 -0
  344. /package/.scannerwork/scanner-report/{duplications-2.pb → duplications-26.pb} +0 -0
  345. /package/.scannerwork/scanner-report/{duplications-34.pb → duplications-27.pb} +0 -0
  346. /package/.scannerwork/scanner-report/{duplications-35.pb → duplications-28.pb} +0 -0
  347. /package/.scannerwork/scanner-report/{duplications-36.pb → duplications-29.pb} +0 -0
  348. /package/.scannerwork/scanner-report/{duplications-37.pb → duplications-53.pb} +0 -0
  349. /package/.scannerwork/scanner-report/{duplications-4.pb → duplications-55.pb} +0 -0
  350. /package/.scannerwork/scanner-report/{duplications-39.pb → duplications-56.pb} +0 -0
  351. /package/.scannerwork/scanner-report/{duplications-40.pb → duplications-57.pb} +0 -0
  352. /package/.scannerwork/scanner-report/{duplications-46.pb → duplications-58.pb} +0 -0
  353. /package/.scannerwork/scanner-report/{duplications-6.pb → duplications-59.pb} +0 -0
  354. /package/.scannerwork/scanner-report/{duplications-61.pb → duplications-62.pb} +0 -0
  355. /package/.scannerwork/scanner-report/{duplications-7.pb → duplications-63.pb} +0 -0
  356. /package/.scannerwork/scanner-report/{duplications-64.pb → duplications-67.pb} +0 -0
  357. /package/.scannerwork/scanner-report/{duplications-8.pb → duplications-69.pb} +0 -0
  358. /package/.scannerwork/scanner-report/{issues-6.pb → issues-41.pb} +0 -0
  359. /package/.scannerwork/scanner-report/{issues-14.pb → issues-45.pb} +0 -0
  360. /package/.scannerwork/scanner-report/{issues-12.pb → issues-51.pb} +0 -0
  361. /package/.scannerwork/scanner-report/{issues-35.pb → issues-57.pb} +0 -0
  362. /package/.scannerwork/scanner-report/{measures-40.pb → measures-23.pb} +0 -0
  363. /package/.scannerwork/scanner-report/{measures-38.pb → measures-25.pb} +0 -0
  364. /package/.scannerwork/scanner-report/{measures-2.pb → measures-26.pb} +0 -0
  365. /package/.scannerwork/scanner-report/{measures-34.pb → measures-29.pb} +0 -0
  366. /package/.scannerwork/scanner-report/{measures-7.pb → measures-53.pb} +0 -0
  367. /package/.scannerwork/scanner-report/{measures-35.pb → measures-57.pb} +0 -0
  368. /package/.scannerwork/scanner-report/{measures-61.pb → measures-63.pb} +0 -0
  369. /package/.scannerwork/scanner-report/{measures-64.pb → measures-67.pb} +0 -0
  370. /package/.scannerwork/scanner-report/{measures-68.pb → measures-70.pb} +0 -0
  371. /package/.scannerwork/scanner-report/{source-40.txt → source-23.txt} +0 -0
  372. /package/.scannerwork/scanner-report/{source-2.txt → source-26.txt} +0 -0
  373. /package/.scannerwork/scanner-report/{source-34.txt → source-29.txt} +0 -0
  374. /package/.scannerwork/scanner-report/{source-7.txt → source-53.txt} +0 -0
  375. /package/.scannerwork/scanner-report/{source-35.txt → source-57.txt} +0 -0
  376. /package/.scannerwork/scanner-report/{source-61.txt → source-63.txt} +0 -0
  377. /package/.scannerwork/scanner-report/{source-64.txt → source-67.txt} +0 -0
  378. /package/.scannerwork/scanner-report/{symbols-40.pb → symbols-23.pb} +0 -0
  379. /package/.scannerwork/scanner-report/{symbols-2.pb → symbols-26.pb} +0 -0
  380. /package/.scannerwork/scanner-report/{symbols-34.pb → symbols-29.pb} +0 -0
  381. /package/.scannerwork/scanner-report/{symbols-7.pb → symbols-53.pb} +0 -0
  382. /package/.scannerwork/scanner-report/{symbols-4.pb → symbols-55.pb} +0 -0
  383. /package/.scannerwork/scanner-report/{symbols-35.pb → symbols-57.pb} +0 -0
  384. /package/.scannerwork/scanner-report/{symbols-61.pb → symbols-63.pb} +0 -0
  385. /package/.scannerwork/scanner-report/{symbols-64.pb → symbols-67.pb} +0 -0
  386. /package/.scannerwork/scanner-report/{syntax-highlightings-40.pb → syntax-highlightings-23.pb} +0 -0
  387. /package/.scannerwork/scanner-report/{syntax-highlightings-2.pb → syntax-highlightings-26.pb} +0 -0
  388. /package/.scannerwork/scanner-report/{syntax-highlightings-34.pb → syntax-highlightings-29.pb} +0 -0
  389. /package/.scannerwork/scanner-report/{syntax-highlightings-7.pb → syntax-highlightings-53.pb} +0 -0
  390. /package/.scannerwork/scanner-report/{syntax-highlightings-35.pb → syntax-highlightings-57.pb} +0 -0
  391. /package/.scannerwork/scanner-report/{syntax-highlightings-61.pb → syntax-highlightings-63.pb} +0 -0
  392. /package/.scannerwork/scanner-report/{syntax-highlightings-64.pb → syntax-highlightings-67.pb} +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2023 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2018 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,124 +11,49 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it beforeEach */
16
14
  'use strict';
17
15
 
18
- const assert = require('assert');
19
- const fs = require('fs');
20
- const nock = require('nock');
21
- const request = require('../includes/request.js');
22
- const writer = require('../includes/writer.js');
23
- const noopEmitter = new (require('events')).EventEmitter();
24
- const liner = require('../includes/liner.js');
25
- const { once } = require('node:events');
26
- const { pipeline } = require('node:stream/promises');
27
- const longTestTimeout = 3000;
28
-
29
- describe('#unit Check database restore writer', function() {
30
- const dbUrl = 'http://localhost:5984/animaldb';
31
- const db = request.client(dbUrl, { parallelism: 1 });
32
-
33
- beforeEach('Reset nocks', function() {
34
- nock.cleanAll();
35
- });
36
-
37
- it('should complete successfully', async function() {
38
- nock(dbUrl)
39
- .post('/_bulk_docs')
40
- .reply(200, []); // success
41
-
42
- const w = writer(db, 500, 1, noopEmitter);
43
- return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
44
- once(w, 'finished').then((data) => {
45
- assert.strictEqual(data[0].total, 15);
46
- assert.ok(nock.isDone());
47
- })]);
48
- });
49
-
50
- it('should terminate on a fatal error', async function() {
51
- nock(dbUrl)
52
- .post('/_bulk_docs')
53
- .reply(401, { error: 'Unauthorized' }); // fatal error
54
-
55
- const w = writer(db, 500, 1, noopEmitter);
56
- return assert.rejects(
57
- pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
58
- (err) => {
59
- assert.strictEqual(err.name, 'Unauthorized');
60
- assert.strictEqual(err.message, 'Access is denied due to invalid credentials.');
61
- assert.ok(nock.isDone());
62
- return true;
63
- }
64
- );
65
- });
66
-
67
- it('should retry on transient errors', async function() {
68
- nock(dbUrl)
69
- .post('/_bulk_docs')
70
- .reply(429, { error: 'Too Many Requests' }) // transient error
71
- .post('/_bulk_docs')
72
- .reply(500, { error: 'Internal Server Error' }) // transient error
73
- .post('/_bulk_docs')
74
- .reply(200, { ok: true }); // third time lucky success
75
-
76
- const w = writer(db, 500, 1, noopEmitter);
77
- return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
78
- once(w, 'finished').then((data) => {
79
- assert.strictEqual(data[0].total, 15);
80
- assert.ok(nock.isDone());
81
- })]);
82
- }).timeout(longTestTimeout);
83
-
84
- it('should fail after 3 transient errors', async function() {
85
- nock(dbUrl)
86
- .post('/_bulk_docs')
87
- .reply(429, { error: 'Too Many Requests' }) // transient error
88
- .post('/_bulk_docs')
89
- .reply(500, { error: 'Internal Server Error' }) // transient error
90
- .post('/_bulk_docs')
91
- .reply(503, { error: 'Service Unavailable' }); // Final transient error
92
-
93
- const w = writer(db, 500, 1, noopEmitter);
94
- return assert.rejects(
95
- pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
96
- (err) => {
97
- assert.strictEqual(err.name, 'HTTPFatalError');
98
- assert.strictEqual(err.message, `503 : post ${dbUrl}/_bulk_docs - Error: Service Unavailable`);
99
- assert.ok(nock.isDone());
100
- return true;
101
- }
102
- );
103
- }).timeout(longTestTimeout);
104
-
105
- it('should restore shallow backups without rev info successfully', async function() {
106
- nock(dbUrl)
107
- .post('/_bulk_docs')
108
- .reply(200, [{ ok: true, id: 'foo', rev: '1-abc' }]); // success
109
-
110
- const w = writer(db, 500, 1, noopEmitter);
111
- return Promise.all([pipeline(fs.createReadStream('./test/fixtures/animaldb_old_shallow.json'), liner(), w),
112
- once(w, 'finished').then((data) => {
113
- assert.strictEqual(data[0].total, 11);
114
- assert.ok(nock.isDone());
115
- })]);
116
- });
117
-
118
- it('should get a batch error for non-empty array response with new_edits false', async function() {
119
- nock(dbUrl)
120
- .post('/_bulk_docs')
121
- .reply(200, [{ id: 'foo', error: 'foo', reason: 'bar' }]);
122
-
123
- const w = writer(db, 500, 1, noopEmitter);
124
- return assert.rejects(
125
- pipeline(fs.createReadStream('./test/fixtures/animaldb_expected.json'), liner(), w),
126
- (err) => {
127
- assert.strictEqual(err.name, 'Error');
128
- assert.strictEqual(err.message, 'Error writing batch with new_edits:false and 1 items');
129
- assert.ok(nock.isDone());
130
- return true;
131
- }
132
- );
133
- });
134
- });
16
+ /**
17
+ * Utility methods for the command line interface.
18
+ * @module cliutils
19
+ * @see module:cliutils
20
+ */
21
+
22
+ const url = require('url');
23
+ const error = require('./error.js');
24
+
25
+ module.exports = {
26
+
27
+ /**
28
+ * Combine a base URL and a database name, ensuring at least single slash
29
+ * between root and database name. This allows users to have Couch behind
30
+ * proxies that mount Couch's / endpoint at some other mount point.
31
+ * @param {string} root - root URL
32
+ * @param {string} databaseName - database name
33
+ * @return concatenated URL.
34
+ *
35
+ * @private
36
+ */
37
+ databaseUrl: function databaseUrl(root, databaseName) {
38
+ if (!root.endsWith('/')) {
39
+ root = root + '/';
40
+ }
41
+ try {
42
+ return new url.URL(encodeURIComponent(databaseName), root).toString();
43
+ } catch (err) {
44
+ throw error.wrapPossibleInvalidUrlError(err);
45
+ }
46
+ },
47
+
48
+ /**
49
+ * Generate CLI argument usage text.
50
+ *
51
+ * @param {string} description - argument description.
52
+ * @param {string} defaultValue - default argument value.
53
+ *
54
+ * @private
55
+ */
56
+ getUsage: function getUsage(description, defaultValue) {
57
+ return `${description} ${defaultValue !== undefined ? ` (default: ${defaultValue})` : ''}`;
58
+ }
59
+ };
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2023 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2021 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,55 +11,103 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global beforeEach afterEach */
16
14
  'use strict';
17
15
 
18
- const { CloudantV1 } = require('@ibm-cloud/cloudant');
19
- const url = new URL((process.env.COUCH_BACKEND_URL) ? process.env.COUCH_BACKEND_URL : 'https://no-couch-backend-url-set.test');
20
- const { BasicAuthenticator, NoAuthAuthenticator } = require('ibm-cloud-sdk-core');
21
- const authenticator = (url.username) ? new BasicAuthenticator({ username: url.username, password: decodeURIComponent(url.password) }) : new NoAuthAuthenticator();
22
- const serviceOpts = {
23
- authenticator: authenticator
16
+ // fatal errors
17
+ const codes = {
18
+ Error: 1,
19
+ InvalidOption: 2,
20
+ DatabaseNotFound: 10,
21
+ Unauthorized: 11,
22
+ Forbidden: 12,
23
+ DatabaseNotEmpty: 13,
24
+ NoLogFileName: 20,
25
+ LogDoesNotExist: 21,
26
+ IncompleteChangesInLogFile: 22,
27
+ SpoolChangesError: 30,
28
+ HTTPFatalError: 40,
29
+ BulkGetError: 50
24
30
  };
25
- const cloudant = new CloudantV1(serviceOpts);
26
- // Remove auth from URL before using for service
27
- cloudant.setServiceUrl(new URL(url.pathname, url.origin).toString());
28
- const uuid = require('uuid').v4;
29
- const fs = require('fs');
30
31
 
31
- // Mocha hooks that will be at the root context so run for all tests
32
+ class BackupError extends Error {
33
+ constructor(name, message) {
34
+ super(message);
35
+ this.name = name;
36
+ }
37
+ }
32
38
 
33
- beforeEach('Create test database', async function() {
34
- // Don't run hook for unit tests, just for CI
35
- if (!this.currentTest.fullTitle().includes('#unit')) {
36
- // Allow 10 seconds to create the DB
37
- this.timeout(10 * 1000);
38
- const unique = uuid();
39
- this.fileName = `${unique}`;
40
- this.dbName = 'couchbackup_test_' + unique;
39
+ class HTTPError extends BackupError {
40
+ constructor(responseError, name) {
41
+ // Special case some names for more useful error messages
42
+ switch (responseError.status) {
43
+ case 401:
44
+ name = 'Unauthorized';
45
+ break;
46
+ case 403:
47
+ name = 'Forbidden';
48
+ break;
49
+ default:
50
+ name = name || 'HTTPFatalError';
51
+ }
52
+ super(name, responseError.message);
53
+ }
54
+ }
41
55
 
42
- return cloudant.putDatabase({ db: this.dbName });
56
+ // Default function to return an error for HTTP status codes
57
+ // < 400 -> OK
58
+ // 4XX (except 429) -> Fatal
59
+ // 429 & >=500 -> Transient
60
+ function checkResponse(err) {
61
+ if (err) {
62
+ // Construct an HTTPError if there is request information on the error
63
+ // Codes < 400 are considered OK
64
+ if (err.status >= 400) {
65
+ return new HTTPError(err);
66
+ } else {
67
+ // Send it back again if there was no status code, e.g. a cxn error
68
+ return augmentMessage(err);
69
+ }
43
70
  }
44
- });
71
+ }
45
72
 
46
- afterEach('Delete test database', async function() {
47
- // Don't run hook for unit tests, just for CI
48
- if (!this.currentTest.fullTitle().includes('#unit')) {
49
- // Allow 10 seconds to delete the DB
50
- this.timeout(10 * 1000);
51
- deleteIfExists(this.fileName);
52
- deleteIfExists(`${this.fileName}.log`);
53
- return cloudant.deleteDatabase({ db: this.dbName });
73
+ function convertResponseError(responseError, errorFactory) {
74
+ if (!errorFactory) {
75
+ errorFactory = checkResponse;
54
76
  }
55
- });
77
+ return errorFactory(responseError);
78
+ }
56
79
 
57
- function deleteIfExists(fileName) {
58
- fs.unlink(fileName, function(err) {
80
+ function augmentMessage(err) {
81
+ // For errors that don't have a status code, we are likely looking at a cxn
82
+ // error.
83
+ // Try to augment the message with more detail (core puts the code in statusText)
84
+ if (err && err.statusText) {
85
+ err.message = `${err.message} ${err.statusText}`;
86
+ }
87
+ if (err && err.description) {
88
+ err.message = `${err.message} ${err.description}`;
89
+ }
90
+ return err;
91
+ }
92
+
93
+ function wrapPossibleInvalidUrlError(err) {
94
+ if (err.code === 'ERR_INVALID_URL') {
95
+ // Wrap ERR_INVALID_URL in our own InvalidOption
96
+ return new BackupError('InvalidOption', err.message);
97
+ }
98
+ return err;
99
+ }
100
+
101
+ module.exports = {
102
+ BackupError,
103
+ HTTPError,
104
+ wrapPossibleInvalidUrlError,
105
+ convertResponseError,
106
+ terminationCallback: function terminationCallback(err, data) {
59
107
  if (err) {
60
- if (err.code !== 'ENOENT') {
61
- console.error(`${err.code} ${err.message}`);
62
- }
108
+ console.error(`ERROR: ${err.message}`);
109
+ process.exitCode = codes[err.name] || 1;
110
+ process.exit();
63
111
  }
64
- });
65
- }
112
+ }
113
+ };
@@ -1,4 +1,4 @@
1
- // Copyright © 2017, 2023 IBM Corp. All rights reserved.
1
+ // Copyright © 2017, 2021 IBM Corp. All rights reserved.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -11,30 +11,154 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
-
15
- /* global describe it */
16
14
  'use strict';
17
15
 
18
- const assert = require('assert');
19
- const logfilesummary = require('../includes/logfilesummary.js');
20
-
21
- describe('#unit Fetching summary from the log file', function() {
22
- it('should fetch a summary correctly', function() {
23
- return new Promise((resolve, reject) => {
24
- logfilesummary('./test/fixtures/test.log', function(err, data) {
25
- try {
26
- assert.ok(!err);
27
- assert.ok(data);
28
- assert.strictEqual(data.changesComplete, true);
29
- assert.strictEqual(typeof data.batches, 'object');
30
- assert.strictEqual(Object.keys(data.batches).length, 2);
31
- assert.deepStrictEqual(data.batches['1'], true);
32
- assert.deepStrictEqual(data.batches['4'], true);
33
- resolve();
34
- } catch (err) {
35
- reject(err);
16
+ const async = require('async');
17
+ const stream = require('stream');
18
+ const error = require('./error.js');
19
+ const debug = require('debug')('couchbackup:writer');
20
+
21
+ module.exports = function(db, bufferSize, parallelism, ee) {
22
+ const writer = new stream.Transform({ objectMode: true });
23
+ let buffer = [];
24
+ let written = 0;
25
+ let linenumber = 0;
26
+
27
+ // this is the queue of chunks that are written to the database
28
+ // the queue's payload will be an array of documents to be written,
29
+ // the size of the array will be bufferSize. The variable parallelism
30
+ // determines how many HTTP requests will occur at any one time.
31
+ const q = async.queue(function(payload, cb) {
32
+ // if we are restoring known revisions, we need to supply new_edits=false
33
+ if (payload.docs && payload.docs[0] && payload.docs[0]._rev) {
34
+ payload.new_edits = false;
35
+ debug('Using new_edits false mode.');
36
+ }
37
+
38
+ if (!didError) {
39
+ db.service.postBulkDocs({
40
+ db: db.db,
41
+ bulkDocs: payload
42
+ }).then(response => {
43
+ if (!response.result || (payload.new_edits === false && response.result.length > 0)) {
44
+ throw new Error(`Error writing batch with new_edits:${payload.new_edits !== false}` +
45
+ ` and ${response.result ? response.result.length : 'unavailable'} items`);
36
46
  }
47
+ written += payload.docs.length;
48
+ writer.emit('restored', { documents: payload.docs.length, total: written });
49
+ cb();
50
+ }).catch(err => {
51
+ err = error.convertResponseError(err);
52
+ debug(`Error writing docs ${err.name} ${err.message}`);
53
+ cb(err, payload);
37
54
  });
38
- });
39
- });
40
- });
55
+ }
56
+ }, parallelism);
57
+
58
+ let didError = false;
59
+
60
+ // write the contents of the buffer to CouchDB in blocks of bufferSize
61
+ function processBuffer(flush, callback) {
62
+ function taskCallback(err, payload) {
63
+ if (err && !didError) {
64
+ debug(`Queue task failed with error ${err.name}`);
65
+ didError = true;
66
+ q.kill();
67
+ writer.emit('error', err);
68
+ }
69
+ }
70
+
71
+ if (flush || buffer.length >= bufferSize) {
72
+ // work through the buffer to break off bufferSize chunks
73
+ // and feed the chunks to the queue
74
+ do {
75
+ // split the buffer into bufferSize chunks
76
+ const toSend = buffer.splice(0, bufferSize);
77
+
78
+ // and add the chunk to the queue
79
+ debug(`Adding ${toSend.length} to the write queue.`);
80
+ q.push({ docs: toSend }, taskCallback);
81
+ } while (buffer.length >= bufferSize);
82
+
83
+ // send any leftover documents to the queue
84
+ if (flush && buffer.length > 0) {
85
+ debug(`Adding remaining ${buffer.length} to the write queue.`);
86
+ q.push({ docs: buffer }, taskCallback);
87
+ }
88
+
89
+ // wait until the queue size falls to a reasonable level
90
+ async.until(
91
+ // wait until the queue length drops to twice the paralellism
92
+ // or until empty on the last write
93
+ function(callback) {
94
+ // if we encountered an error, stop this until loop
95
+ if (didError) {
96
+ return callback(null, true);
97
+ }
98
+ if (flush) {
99
+ callback(null, q.idle() && q.length() === 0);
100
+ } else {
101
+ callback(null, q.length() <= parallelism * 2);
102
+ }
103
+ },
104
+ function(cb) {
105
+ setTimeout(cb, 20);
106
+ },
107
+
108
+ function() {
109
+ if (flush && !didError) {
110
+ writer.emit('finished', { total: written });
111
+ }
112
+ // callback when we're happy with the queue size
113
+ callback();
114
+ });
115
+ } else {
116
+ callback();
117
+ }
118
+ }
119
+
120
+ // take an object
121
+ writer._transform = function(obj, encoding, done) {
122
+ // each obj that arrives here is a line from the backup file
123
+ // it should contain an array of objects. The length of the array
124
+ // depends on the bufferSize at backup time.
125
+ linenumber++;
126
+ if (!didError && obj !== '') {
127
+ // see if it parses as JSON
128
+ try {
129
+ const arr = JSON.parse(obj);
130
+
131
+ // if it's an array with a length
132
+ if (typeof arr === 'object' && arr.length > 0) {
133
+ // push each document into a buffer
134
+ buffer = buffer.concat(arr);
135
+
136
+ // pause the stream
137
+ // it's likely that the speed with which data can be read from disk
138
+ // may exceed the rate it can be written to CouchDB. To prevent
139
+ // the whole file being buffered in memory, we pause the stream here.
140
+ // it is resumed, when processBuffer calls back and we call done()
141
+ this.pause();
142
+
143
+ // break the buffer in to bufferSize chunks to be written to the database
144
+ processBuffer(false, done);
145
+ } else {
146
+ ee.emit('error', new error.BackupError('BackupFileJsonError', `Error on line ${linenumber} of backup file - not an array`));
147
+ done();
148
+ }
149
+ } catch (e) {
150
+ ee.emit('error', new error.BackupError('BackupFileJsonError', `Error on line ${linenumber} of backup file - cannot parse as JSON`));
151
+ // Could be an incomplete write that was subsequently resumed
152
+ done();
153
+ }
154
+ } else {
155
+ done();
156
+ }
157
+ };
158
+
159
+ // called when we need to flush everything
160
+ writer._flush = function(done) {
161
+ processBuffer(true, done);
162
+ };
163
+ return writer;
164
+ };