node-hp-scan-to 1.2.2 → 1.3.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 (235) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -10
  3. package/dist/Destination.js +36 -84
  4. package/dist/Destination.js.map +1 -1
  5. package/dist/DeviceCapabilities.d.ts +4 -0
  6. package/dist/DeviceCapabilities.js +3 -0
  7. package/dist/DeviceCapabilities.js.map +1 -0
  8. package/dist/DiscoveryTree.d.ts +16 -0
  9. package/dist/DiscoveryTree.js +38 -0
  10. package/dist/DiscoveryTree.js.map +1 -0
  11. package/dist/Event.d.ts +1 -1
  12. package/dist/Event.js +24 -39
  13. package/dist/Event.js.map +1 -1
  14. package/dist/EventTable.d.ts +5 -0
  15. package/dist/EventTable.js +24 -18
  16. package/dist/EventTable.js.map +1 -1
  17. package/dist/HPApi.d.ts +26 -18
  18. package/dist/HPApi.js +386 -461
  19. package/dist/HPApi.js.map +1 -1
  20. package/dist/Job.d.ts +8 -7
  21. package/dist/Job.js +69 -86
  22. package/dist/Job.js.map +1 -1
  23. package/dist/JpegUtil.js +73 -82
  24. package/dist/JpegUtil.js.map +1 -1
  25. package/dist/KnownShortcut.d.ts +1 -0
  26. package/dist/KnownShortcut.js +3 -0
  27. package/dist/KnownShortcut.js.map +1 -0
  28. package/dist/PathHelper.d.ts +2 -1
  29. package/dist/PathHelper.js +41 -68
  30. package/dist/PathHelper.js.map +1 -1
  31. package/dist/ScanCaps.d.ts +7 -0
  32. package/dist/ScanCaps.js +17 -0
  33. package/dist/ScanCaps.js.map +1 -0
  34. package/dist/ScanContent.js +18 -73
  35. package/dist/ScanContent.js.map +1 -1
  36. package/dist/ScanJobManifest.d.ts +23 -0
  37. package/dist/ScanJobManifest.js +24 -0
  38. package/dist/ScanJobManifest.js.map +1 -0
  39. package/dist/ScanJobSettings.d.ts +3 -1
  40. package/dist/ScanJobSettings.js +48 -88
  41. package/dist/ScanJobSettings.js.map +1 -1
  42. package/dist/ScanStatus.d.ts +1 -0
  43. package/dist/ScanStatus.js +27 -28
  44. package/dist/ScanStatus.js.map +1 -1
  45. package/dist/WalkupScanDestination.d.ts +11 -13
  46. package/dist/WalkupScanDestination.js +32 -35
  47. package/dist/WalkupScanDestination.js.map +1 -1
  48. package/dist/WalkupScanDestinations.d.ts +1 -0
  49. package/dist/WalkupScanDestinations.js +21 -18
  50. package/dist/WalkupScanDestinations.js.map +1 -1
  51. package/dist/WalkupScanManifest.d.ts +23 -0
  52. package/dist/WalkupScanManifest.js +25 -0
  53. package/dist/WalkupScanManifest.js.map +1 -0
  54. package/dist/WalkupScanToCompCaps.d.ts +12 -0
  55. package/dist/WalkupScanToCompCaps.js +20 -0
  56. package/dist/WalkupScanToCompCaps.js.map +1 -0
  57. package/dist/WalkupScanToCompDestination.d.ts +10 -14
  58. package/dist/WalkupScanToCompDestination.js +32 -38
  59. package/dist/WalkupScanToCompDestination.js.map +1 -1
  60. package/dist/WalkupScanToCompDestinations.d.ts +1 -0
  61. package/dist/WalkupScanToCompDestinations.js +21 -18
  62. package/dist/WalkupScanToCompDestinations.js.map +1 -1
  63. package/dist/WalkupScanToCompEvent.d.ts +2 -1
  64. package/dist/WalkupScanToCompEvent.js +14 -11
  65. package/dist/WalkupScanToCompEvent.js.map +1 -1
  66. package/dist/WalkupScanToCompManifest.d.ts +23 -0
  67. package/dist/WalkupScanToCompManifest.js +25 -0
  68. package/dist/WalkupScanToCompManifest.js.map +1 -0
  69. package/dist/delay.d.ts +1 -0
  70. package/dist/delay.js +10 -0
  71. package/dist/delay.js.map +1 -0
  72. package/dist/fixJpegSize.d.ts +19 -0
  73. package/dist/fixJpegSize.js +292 -0
  74. package/dist/fixJpegSize.js.map +1 -0
  75. package/dist/index.js +209 -607
  76. package/dist/index.js.map +1 -1
  77. package/dist/listening.d.ts +9 -0
  78. package/dist/listening.js +108 -0
  79. package/dist/listening.js.map +1 -0
  80. package/dist/readDeviceCapabilities.d.ts +2 -0
  81. package/dist/readDeviceCapabilities.js +41 -0
  82. package/dist/readDeviceCapabilities.js.map +1 -0
  83. package/dist/scanProcess.d.ts +19 -0
  84. package/dist/scanProcess.js +292 -0
  85. package/dist/scanProcess.js.map +1 -0
  86. package/dist/scanProcessing.d.ts +20 -0
  87. package/dist/scanProcessing.js +320 -0
  88. package/dist/scanProcessing.js.map +1 -0
  89. package/dist/src/Destination.d.ts +8 -0
  90. package/dist/src/Destination.js +68 -0
  91. package/dist/src/Destination.js.map +1 -0
  92. package/dist/src/DiscoveryTree.d.ts +16 -0
  93. package/dist/src/DiscoveryTree.js +38 -0
  94. package/dist/src/DiscoveryTree.js.map +1 -0
  95. package/dist/src/Event.d.ts +21 -0
  96. package/dist/src/Event.js +32 -0
  97. package/dist/src/Event.js.map +1 -0
  98. package/dist/src/EventTable.d.ts +16 -0
  99. package/dist/src/EventTable.js +33 -0
  100. package/dist/src/EventTable.js.map +1 -0
  101. package/dist/src/HPApi.d.ts +50 -0
  102. package/dist/src/HPApi.js +454 -0
  103. package/dist/src/HPApi.js.map +1 -0
  104. package/dist/src/Job.d.ts +37 -0
  105. package/dist/src/Job.js +78 -0
  106. package/dist/src/Job.js.map +1 -0
  107. package/dist/src/JpegUtil.d.ts +26 -0
  108. package/dist/src/JpegUtil.js +229 -0
  109. package/dist/src/JpegUtil.js.map +1 -0
  110. package/dist/src/KnownShortcut.d.ts +1 -0
  111. package/dist/src/KnownShortcut.js +3 -0
  112. package/dist/src/KnownShortcut.js.map +1 -0
  113. package/dist/src/PathHelper.d.ts +6 -0
  114. package/dist/src/PathHelper.js +52 -0
  115. package/dist/src/PathHelper.js.map +1 -0
  116. package/dist/src/ScanCaps.d.ts +7 -0
  117. package/dist/src/ScanCaps.js +17 -0
  118. package/dist/src/ScanCaps.js.map +1 -0
  119. package/dist/src/ScanJobManifest.d.ts +23 -0
  120. package/dist/src/ScanJobManifest.js +24 -0
  121. package/dist/src/ScanJobManifest.js.map +1 -0
  122. package/dist/src/ScanJobSettings.d.ts +8 -0
  123. package/dist/src/ScanJobSettings.js +56 -0
  124. package/dist/src/ScanJobSettings.js.map +1 -0
  125. package/dist/src/ScanStatus.d.ts +19 -0
  126. package/dist/src/ScanStatus.js +35 -0
  127. package/dist/src/ScanStatus.js.map +1 -0
  128. package/dist/src/WalkupScanDestination.d.ts +22 -0
  129. package/dist/src/WalkupScanDestination.js +38 -0
  130. package/dist/src/WalkupScanDestination.js.map +1 -0
  131. package/dist/src/WalkupScanDestinations.d.ts +12 -0
  132. package/dist/src/WalkupScanDestinations.js +30 -0
  133. package/dist/src/WalkupScanDestinations.js.map +1 -0
  134. package/dist/src/WalkupScanManifest.d.ts +23 -0
  135. package/dist/src/WalkupScanManifest.js +25 -0
  136. package/dist/src/WalkupScanManifest.js.map +1 -0
  137. package/dist/src/WalkupScanToCompCaps.d.ts +12 -0
  138. package/dist/src/WalkupScanToCompCaps.js +20 -0
  139. package/dist/src/WalkupScanToCompCaps.js.map +1 -0
  140. package/dist/src/WalkupScanToCompDestination.d.ts +22 -0
  141. package/dist/src/WalkupScanToCompDestination.js +38 -0
  142. package/dist/src/WalkupScanToCompDestination.js.map +1 -0
  143. package/dist/src/WalkupScanToCompDestinations.d.ts +12 -0
  144. package/dist/src/WalkupScanToCompDestinations.js +30 -0
  145. package/dist/src/WalkupScanToCompDestinations.js.map +1 -0
  146. package/dist/src/WalkupScanToCompEvent.d.ts +11 -0
  147. package/dist/src/WalkupScanToCompEvent.js +20 -0
  148. package/dist/src/WalkupScanToCompEvent.js.map +1 -0
  149. package/dist/src/WalkupScanToCompManifest.d.ts +23 -0
  150. package/dist/src/WalkupScanToCompManifest.js +25 -0
  151. package/dist/src/WalkupScanToCompManifest.js.map +1 -0
  152. package/dist/src/delay.d.ts +1 -0
  153. package/dist/src/delay.js +10 -0
  154. package/dist/src/delay.js.map +1 -0
  155. package/dist/test/DiscoveryTree.test.d.ts +1 -0
  156. package/dist/test/DiscoveryTree.test.js +68 -0
  157. package/dist/test/DiscoveryTree.test.js.map +1 -0
  158. package/dist/test/EtagEventTable.test.d.ts +1 -0
  159. package/dist/test/EtagEventTable.test.js +93 -0
  160. package/dist/test/EtagEventTable.test.js.map +1 -0
  161. package/dist/test/Job.test.d.ts +1 -0
  162. package/dist/test/Job.test.js +104 -0
  163. package/dist/test/Job.test.js.map +1 -0
  164. package/dist/test/JpegUtil.test.d.ts +1 -0
  165. package/dist/test/JpegUtil.test.js +51 -0
  166. package/dist/test/JpegUtil.test.js.map +1 -0
  167. package/dist/test/PathHelper.test.d.ts +1 -0
  168. package/dist/test/PathHelper.test.js +99 -0
  169. package/dist/test/PathHelper.test.js.map +1 -0
  170. package/dist/test/ScanJobManifest.test.d.ts +1 -0
  171. package/dist/test/ScanJobManifest.test.js +56 -0
  172. package/dist/test/ScanJobManifest.test.js.map +1 -0
  173. package/dist/test/ScanJobSettings.test.d.ts +1 -0
  174. package/dist/test/ScanJobSettings.test.js +53 -0
  175. package/dist/test/ScanJobSettings.test.js.map +1 -0
  176. package/dist/test/ScanStatus.test.d.ts +1 -0
  177. package/dist/test/ScanStatus.test.js +75 -0
  178. package/dist/test/ScanStatus.test.js.map +1 -0
  179. package/dist/test/WalkupScanDestination.test.d.ts +1 -0
  180. package/dist/test/WalkupScanDestination.test.js +80 -0
  181. package/dist/test/WalkupScanDestination.test.js.map +1 -0
  182. package/dist/test/WalkupScanDestinations.test.d.ts +1 -0
  183. package/dist/test/WalkupScanDestinations.test.js +68 -0
  184. package/dist/test/WalkupScanDestinations.test.js.map +1 -0
  185. package/dist/test/WalkupScanManifest.test.d.ts +1 -0
  186. package/dist/test/WalkupScanManifest.test.js +46 -0
  187. package/dist/test/WalkupScanManifest.test.js.map +1 -0
  188. package/dist/test/WalkupScanToCompCaps.test.d.ts +1 -0
  189. package/dist/test/WalkupScanToCompCaps.test.js +56 -0
  190. package/dist/test/WalkupScanToCompCaps.test.js.map +1 -0
  191. package/dist/test/WalkupScanToCompDestination.test.d.ts +1 -0
  192. package/dist/test/WalkupScanToCompDestination.test.js +58 -0
  193. package/dist/test/WalkupScanToCompDestination.test.js.map +1 -0
  194. package/dist/test/WalkupScanToCompDestinations.test.d.ts +1 -0
  195. package/dist/test/WalkupScanToCompDestinations.test.js +58 -0
  196. package/dist/test/WalkupScanToCompDestinations.test.js.map +1 -0
  197. package/dist/test/WalkupScanToCompEvent.test.d.ts +1 -0
  198. package/dist/test/WalkupScanToCompEvent.test.js +46 -0
  199. package/dist/test/WalkupScanToCompEvent.test.js.map +1 -0
  200. package/dist/test/WalkupScanToCompManifest.test.d.ts +1 -0
  201. package/dist/test/WalkupScanToCompManifest.test.js +46 -0
  202. package/dist/test/WalkupScanToCompManifest.test.js.map +1 -0
  203. package/dist/test/clean.d.ts +1 -0
  204. package/dist/test/clean.js +21 -0
  205. package/dist/test/clean.js.map +1 -0
  206. package/package.json +27 -18
  207. package/src/Destination.ts +1 -1
  208. package/src/DeviceCapabilities.ts +4 -0
  209. package/src/DiscoveryTree.ts +56 -0
  210. package/src/Event.ts +17 -7
  211. package/src/EventTable.ts +20 -0
  212. package/src/HPApi.ts +245 -103
  213. package/src/Job.ts +51 -29
  214. package/src/JpegUtil.ts +8 -4
  215. package/src/KnownShortcut.ts +6 -0
  216. package/src/PathHelper.ts +47 -13
  217. package/src/ScanCaps.ts +19 -0
  218. package/src/ScanContent.ts +4 -1
  219. package/src/ScanJobManifest.ts +55 -0
  220. package/src/ScanJobSettings.ts +18 -3
  221. package/src/ScanStatus.ts +9 -0
  222. package/src/WalkupScanDestination.ts +42 -18
  223. package/src/WalkupScanDestinations.ts +12 -0
  224. package/src/WalkupScanManifest.ts +59 -0
  225. package/src/WalkupScanToCompCaps.ts +36 -0
  226. package/src/WalkupScanToCompDestination.ts +38 -24
  227. package/src/WalkupScanToCompDestinations.ts +12 -0
  228. package/src/WalkupScanToCompEvent.ts +15 -3
  229. package/src/WalkupScanToCompManifest.ts +59 -0
  230. package/src/delay.ts +5 -0
  231. package/src/index.ts +267 -465
  232. package/src/listening.ts +145 -0
  233. package/src/readDeviceCapabilities.ts +46 -0
  234. package/src/scanProcessing.ts +535 -0
  235. package/tsconfig.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,sDAAsD;AAEtD,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,0CAAoB;AACpB,yDAA6B;AAC7B,uCAAoC;AACpC,oDAA8B;AAE9B,8DAAwC;AACxC,sEAAgD;AAEhD,kDAA4B;AAI5B,wDAAkC;AAClC,4DAAsC;AACtC,6CAAqE;AAErE,IAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO;QAClC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAe,gBAAgB,CAC7B,WAAmB,EACnB,SAA+B;IAA/B,0BAAA,EAAA,gBAA+B;;;;;;oBAE/B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;oBAEhC,qBAAM,eAAK,CAAC,SAAS,CAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,EAAA;;oBAAnD,UAAU,GAAG,SAAsC;oBACnD,iBAAiB,GAAG,IAAI,CAAC;oBACzB,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;;;yBAC3B,CAAA,iBAAiB,IAAI,IAAI,CAAA;oBACjB,qBAAM,eAAK,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,EAAA;;oBAArD,UAAU,GAAG,SAAwC,CAAC;oBACtD,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;oBAE9B,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CACnD,UAAC,EAAE;wBACD,OAAA,EAAE,CAAC,WAAW;4BACd,EAAE,CAAC,cAAc;4BACjB,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;oBAF3C,CAE2C,CAC9C,CAAC;;wBAEJ,sBAAO,iBAAiB,EAAC;;;;CAC1B;AAED,SAAe,4CAA4C,CACzD,MAAc;;;;;;oBAEV,GAAG,GAAG,IAAI,CAAC;oBACX,eAAe,GAAG,KAAK,CAAC;;wBAEpB,qBAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAA;;oBAAhC,GAAG,GAAG,SAA0B,CAAC;oBACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE;wBAC/B,sBAAO,GAAG,EAAC;qBACZ;yBAAM,IACL,GAAG,CAAC,SAAS,KAAK,eAAe;wBACjC,GAAG,CAAC,QAAQ,KAAK,WAAW,EAC5B;wBACA,eAAe,GAAG,IAAI,CAAC;qBACxB;yBAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,YAAY,EAAE;wBACvC,eAAe,GAAG,KAAK,CAAC;qBACzB;yBAAM;wBACL,OAAO,CAAC,GAAG,CAAC,4BAAqB,GAAG,CAAC,QAAQ,CAAE,CAAC,CAAC;qBAClD;oBACD,qBAAM,KAAK,CAAC,GAAG,CAAC,EAAA;;oBAAhB,SAAgB,CAAC;;;wBACV,CAAC,eAAe;;wBACzB,sBAAO,GAAG,EAAC;;;;CACZ;AAED,SAAe,QAAQ;;;;;;oBAEf,QAAQ,GAAG,YAAE,CAAC,QAAQ,EAAE,CAAC;oBAChB,qBAAM,eAAK,CAAC,uBAAuB,EAAE,EAAA;;oBAA9C,MAAM,GAAG,SAAqC;yBAEhD,MAAM,EAAN,wBAAM;oBAEN,qBAAM,eAAK,CAAC,+BAA+B,EAAE,EAAA;;oBADzC,sBAAsB,GAC1B,SAA6C;oBACzC,YAAY,GAAG,sBAAsB,CAAC,YAAY,CAAC;oBAEzD,OAAO,CAAC,GAAG,CACT,4BAA4B,EAC5B,YAAY,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,EAAN,CAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3C,CAAC;oBAEF,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAnB,CAAmB,CAAC,CAAC;;wBAE7B,qBAAM,eAAK,CAAC,yBAAyB,EAAE,EAAA;;oBAAhE,sBAAsB,GAAG,SAAuC;oBAChE,YAAY,GAAG,sBAAsB,CAAC,YAAY,CAAC;oBAEzD,OAAO,CAAC,GAAG,CACT,4BAA4B,EAC5B,YAAY,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,EAAN,CAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3C,CAAC;oBAEF,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAnB,CAAmB,CAAC,CAAC;;;yBAI1D,WAAW,EAAX,wBAAW;oBACb,OAAO,CAAC,GAAG,CACT,yCAAkC,QAAQ,gBAAM,WAAW,CAAC,WAAW,CAAE,CAC1E,CAAC;oBACF,WAAW,GAAG,WAAW,CAAC,WAAW,CAAC;;wBAExB,qBAAM,eAAK,CAAC,mBAAmB,CAC3C,IAAI,qBAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAC3C,MAAM,CACP,EAAA;;oBAHD,WAAW,GAAG,SAGb,CAAC;oBACF,OAAO,CAAC,GAAG,CAAC,sCAA+B,QAAQ,gBAAM,WAAW,CAAE,CAAC,CAAC;;wBAE1E,sBAAO,WAAW,EAAC;;;;CACpB;AAED,SAAe,iBAAiB,CAAC,KAAY;;;;;;oBAGvC,WAAW,GACb,IAAI,CAAC;oBAEE,CAAC,GAAG,CAAC;;;yBAAE,CAAA,CAAC,GAAG,EAAE,CAAA;oBACd,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;yBACxC,cAAc,EAAd,wBAAc;oBACF,qBAAM,eAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAA;;oBAAxD,WAAW,GAAG,SAA0C,CAAC;oBAEnD,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;oBACtC,IAAI,QAAQ,KAAK,EAAE,EAAE;wBACnB,sBAAO,WAAW,EAAC;qBACpB;;;oBAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;;;oBAG1C,OAAO,CAAC,GAAG,CAAC,8CAAuC,CAAC,GAAG,CAAC,QAAK,CAAC,CAAC;oBAC/D,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAzB,CAAyB,CAAC,EAAA;;oBAAzD,SAAyD,CAAC,CAAC,SAAS;;;oBAd9C,CAAC,EAAE,CAAA;;;oBAiB3B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;oBACzC,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAe,WAAW,CAAC,QAAgB;;;;;wBAClB,qBAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAA;;oBAA5C,MAAM,GAAW,SAA2B;oBAE9C,MAAM,GAAG,kBAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;yBACzC,CAAA,MAAM,IAAI,IAAI,CAAA,EAAd,wBAAc;oBAChB,yBAAyB;oBACzB,qBAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAA;;oBADpC,yBAAyB;oBACzB,SAAoC,CAAC;oBACrC,sBAAO,MAAM,EAAC;wBAEhB,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAS,cAAc,CACrB,GAAQ,EACR,iBAAyB,EACzB,QAAgB,EAChB,SAAwB;IAExB,IAAI,MAAM,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,GAAG,CAAC,WAAW,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,iBAAiB;QAC7B,KAAK,EAAE,GAAG,CAAC,UAAU;QACrB,MAAM,QAAA;QACN,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC;AAED,SAAe,qBAAqB,CAClC,GAAQ,EACR,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,iBAAyB;;;;;;yBAGvB,CAAA,GAAG,CAAC,SAAS,IAAI,eAAe;wBAChC,GAAG,CAAC,SAAS,IAAI,IAAI;wBACrB,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAA,EAF7B,wBAE6B;oBAE7B,OAAO,CAAC,GAAG,CACT,0CAAmC,GAAG,CAAC,iBAAiB,SAAM,EAC9D,GAAG,CAAC,SAAS,CACd,CAAC;oBAEI,mBAAmB,GAAG,oBAAU,CAAC,cAAc,CACnD,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,EACtB,KAAK,CACN,CAAC;oBACe,qBAAM,eAAK,CAAC,YAAY,CACvC,GAAG,CAAC,SAAS,EACb,mBAAmB,CACpB,EAAA;;oBAHK,QAAQ,GAAG,SAGhB;oBACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;oBAEzC,SAAS,GAAkB,IAAI,CAAC;yBAChC,CAAA,WAAW,IAAI,KAAK,CAAA,EAApB,wBAAoB;oBACV,qBAAM,WAAW,CAAC,QAAQ,CAAC,EAAA;;oBAAvC,SAAS,GAAG,SAA2B,CAAC;oBACxC,IAAI,SAAS,IAAI,IAAI,EAAE;wBACrB,OAAO,CAAC,GAAG,CACT,+FAAwF,GAAG,CAAC,WAAW,CAAE,CAC1G,CAAC;qBACH;;wBAEH,sBAAO,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAC;;oBAEnE,OAAO,CAAC,GAAG,CAAC,6BAAsB,GAAG,CAAC,SAAS,CAAE,CAAC,CAAC;oBACnD,qBAAM,KAAK,CAAC,GAAG,CAAC,EAAA;;oBAAhB,SAAgB,CAAC;oBACjB,sBAAO,IAAI,EAAC;;;;CAEf;AAED,SAAe,eAAe,CAAC,YAAoB;;;;;;oBAC3C,OAAO,GAAG,EAAE,CAAC;oBACV,CAAC,GAAG,CAAC;;;yBAAE,CAAA,CAAC,GAAG,OAAO,CAAA;oBACG,qBAAM,eAAK,CAAC,wBAAwB,CAC9D,YAAY,CACb,EAAA;;oBAFG,qBAAqB,GAAG,SAE3B;oBACG,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC;oBAC9C,IAAI,OAAO,KAAK,cAAc,EAAE;wBAC9B,kBAAkB;qBACnB;yBAAM,IAAI,OAAO,KAAK,eAAe,EAAE;wBACtC,wBAAM;qBACP;yBAAM,IAAI,OAAO,KAAK,sBAAsB,EAAE;wBAC7C,wBAAM;qBACP;yBAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE;wBAC1C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;wBACtD,sBAAO,KAAK,EAAC;qBACd;yBAAM;wBACL,OAAO,CAAC,GAAG,CAAC,6BAAsB,OAAO,CAAE,CAAC,CAAC;wBAC7C,sBAAO,KAAK,EAAC;qBACd;oBAED,OAAO,CAAC,GAAG,CAAC,8BAAuB,CAAC,GAAG,CAAC,cAAI,OAAO,CAAE,CAAC,CAAC;oBACvD,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAzB,CAAyB,CAAC,EAAA;;oBAAzD,SAAyD,CAAC,CAAC,SAAS;;;oBApBzC,CAAC,EAAE,CAAA;;wBAsBhC,sBAAO,IAAI,EAAC;;;;CACb;AAED,SAAe,cAAc,CAC3B,eAAgC,EAChC,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,cAA2B;;;;;wBAEZ,qBAAM,eAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAA;;oBAA7C,MAAM,GAAG,SAAoC;oBAEnD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;oBAE9B,qBAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAA;;oBAAhC,GAAG,GAAG,SAA0B;;;yBAC7B,CAAA,GAAG,CAAC,QAAQ,KAAK,WAAW,CAAA;oBAC3B,qBAAM,4CAA4C,CAAC,MAAM,CAAC,EAAA;;oBAAhE,GAAG,GAAG,SAA0D,CAAC;oBAEjE,IAAI,GAAG,CAAC,QAAQ,IAAI,WAAW,EAAE;wBAC/B,wBAAS;qBACV;yBAEG,CAAA,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA,EAA7B,wBAA6B;oBAClB,qBAAM,qBAAqB,CACtC,GAAG,EACH,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CACnC,EAAA;;oBANK,IAAI,GAAG,SAMZ;oBACD,IAAI,IAAI,IAAI,IAAI,EAAE;wBAChB,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACpC;;;yBACQ,CAAA,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAA,EAA3B,wBAA2B;oBACpC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACvC,yBAAM;;oBAEN,OAAO,CAAC,GAAG,CAAC,8BAAuB,GAAG,CAAC,QAAQ,CAAE,CAAC,CAAC;oBACnD,qBAAM,KAAK,CAAC,GAAG,CAAC,EAAA;;oBAAhB,SAAgB,CAAC;;;;oBAGrB,OAAO,CAAC,GAAG,CACT,qBAAc,GAAG,CAAC,QAAQ,2BAAiB,GAAG,CAAC,eAAe,MAAG,CAClE,CAAC;;;;;CACH;AAED,SAAe,sBAAsB,CAAC,YAAoB;;;;;;oBACpD,eAAe,GAAG,KAAK,CAAC;oBACxB,IAAI,GAAG,IAAI,CAAC;;;yBACT,IAAI;oBACT,qBAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAzB,CAAyB,CAAC,EAAA;;oBAAzD,SAAyD,CAAC,CAAC,SAAS;oBAExC,qBAAM,eAAK,CAAC,wBAAwB,CAC9D,YAAY,CACb,EAAA;;oBAFG,qBAAqB,GAAG,SAE3B;oBACG,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC;oBAE9C,IAAI,OAAO,KAAK,sBAAsB,EAAE;wBACtC,eAAe,GAAG,IAAI,CAAC;wBACvB,IAAI,GAAG,KAAK,CAAC;qBACd;yBAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE;wBAC1C,IAAI,GAAG,KAAK,CAAC;qBACd;yBAAM,IAAI,OAAO,KAAK,eAAe,EAAE;wBACtC,mBAAmB;qBACpB;yBAAM;wBACL,IAAI,GAAG,KAAK,CAAC;wBACb,OAAO,CAAC,GAAG,CAAC,6BAAsB,OAAO,CAAE,CAAC,CAAC;qBAC9C;;wBAEH,sBAAO,eAAe,EAAC;;;;CACxB;AAED,SAAe,eAAe,CAC5B,eAAgC,EAChC,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,UAAiB;;;;;wBAEjB,qBAAM,cAAc,CAClB,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,CACf,EAAA;;oBAND,SAMC,CAAC;oBACE,SAAS,GAAG,UAAU,CAAC;yBAEzB,CAAA,SAAS,CAAC,YAAY;wBACtB,WAAW,KAAK,KAAK;wBACrB,SAAS,CAAC,cAAc,CAAA,EAFxB,wBAEwB;oBAEZ,qBAAM,gBAAgB,CAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,EAAA;;oBAHD,SAAS,GAAG,SAGX,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;wBAC3B,sBAAO;qBACR;oBACqB,qBAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAA;;oBAAtE,eAAe,GAAG,SAAoD;;;yBACnE,eAAe;oBACpB,qBAAM,cAAc,CAClB,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,CACf,EAAA;;oBAND,SAMC,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;wBAC7B,wBAAM;qBACP;oBACW,qBAAM,gBAAgB,CAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,EAAA;;oBAHD,SAAS,GAAG,SAGX,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;wBAC3B,sBAAO;qBACR;oBACiB,qBAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,EAAA;;oBAAtE,eAAe,GAAG,SAAoD,CAAC;;;;;;CAG5E;AAED,SAAe,UAAU,CAAC,MAAc,EAAE,SAAiB,EAAE,cAA2B;;;;;;oBAChF,WAAW,GAAG,oBAAU,CAAC,cAAc,CAC3C,MAAM,EACN,SAAS,EACT,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,EACtB,KAAK,CACN,CAAC;oBACF,qBAAM,IAAA,2BAAa,EAAC,cAAc,EAAE,WAAW,CAAC,EAAA;;oBAAhD,SAAgD,CAAC;oBACjD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAC,CAAC,IAAK,OAAA,kBAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAjB,CAAiB,CAAC,CAAC;oBAC1D,sBAAO,WAAW,EAAC;;;;CACpB;AAED,SAAS,cAAc,CAAC,WAAmB,EAAE,cAA2B;IACtE,OAAO,CAAC,GAAG,CACT,2DAAoD,WAAW,QAAK,CACrE,CAAC;IACF,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAC,CAAC;QAChC,OAAA,OAAO,CAAC,GAAG,CACT,mBAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAM,CAAC,CAAC,KAAK,cAC/D,CAAC,CAAC,MAAM,CACR,CACH;IAJD,CAIC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,cAA2B;IAClD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAC,CAAC;QAChC,OAAA,OAAO,CAAC,GAAG,CACT,mBAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,gBAAM,CAAC,CAAC,KAAK,cAC/D,CAAC,CAAC,MAAM,gBACJ,CAAC,CAAC,IAAI,CAAE,CACf;IAJD,CAIC,CACF,CAAC;AACJ,CAAC;AAED,SAAe,QAAQ,CACrB,KAAY,EACZ,MAAc,EACd,SAAiB;;;;;;yBAEb,KAAK,CAAC,YAAY,EAAlB,wBAAkB;oBACE,qBAAM,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,EAAA;;oBAAzD,aAAa,GAAG,SAAyC;oBAC/D,IAAI,CAAC,aAAa,EAAE;wBAClB,sBAAO;qBACR;;wBAGiB,qBAAM,iBAAiB,CAAC,KAAK,CAAC,EAAA;;oBAA5C,WAAW,GAAG,SAA8B;oBAClD,IAAI,CAAC,WAAW,EAAE;wBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;wBACrC,sBAAO;qBACR;oBACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAEpD,WAAW,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;oBAC3C,KAAK,GACT,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,KAAK,UAAU,CAAC;oBAEzD,qBAAM,eAAK,CAAC,aAAa,EAAE,EAAA;;oBAAxC,UAAU,GAAG,SAA2B;oBAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAE3C,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;oBAE1C,eAAe,GAAG,IAAI,yBAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAEhE,cAAc,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;oBAEnD,qBAAM,eAAe,CACnB,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,EACd,KAAK,CACN,EAAA;;oBAPD,SAOC,CAAC;oBAEF,OAAO,CAAC,GAAG,CACT,gDAAyC,cAAc,CAAC,QAAQ,CAAC,MAAM,MAAG,CAC3E,CAAC;yBAEE,KAAK,EAAL,wBAAK;oBACa,qBAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,CAAC,EAAA;;oBAAjE,WAAW,GAAG,SAAmD;oBACvE,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;;;oBAE5C,eAAe,CAAC,cAAc,CAAC,CAAC;;;;;;CAEnC;AAED,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,SAAe,IAAI;;;;;wBACF,qBAAM,oBAAU,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAA;;oBAAnE,MAAM,GAAG,SAA0D;oBACzE,OAAO,CAAC,GAAG,CAAC,yBAAkB,MAAM,CAAE,CAAC,CAAC;oBAEpC,SAAS,GAAG,CAAC,CAAC;oBAEd,UAAU,GAAG,IAAI,CAAC;oBAClB,UAAU,GAAG,CAAC,CAAC;;;yBACZ,UAAU;oBACf,OAAO,CAAC,GAAG,CAAC,6BAAsB,SAAS,4BAAkB,UAAU,CAAE,CAAC,CAAC;;;;oBAEvD,qBAAM,QAAQ,EAAE,EAAA;;oBAA9B,WAAW,GAAG,SAAgB;oBAElC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,WAAW,CAAC,CAAC;oBACtC,qBAAM,gBAAgB,CAAC,WAAW,CAAC,EAAA;;oBAA3C,UAAQ,SAAmC;oBAEjD,SAAS,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,4CAAqC,SAAS,CAAE,CAAC,CAAC;oBAC9D,qBAAM,QAAQ,CAAC,OAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAA;;oBAAxC,SAAwC,CAAC;;;;oBAEzC,UAAU,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,GAAC,CAAC,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,GAAC,CAAC,CAAC;;;oBAGjB,IAAI,UAAU,KAAK,EAAE,EAAE;wBACrB,UAAU,GAAG,KAAK,CAAC;qBACpB;oBAED,qBAAM,KAAK,CAAC,IAAI,CAAC,EAAA;;oBAAjB,SAAiB,CAAC;;;;;;CAErB;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO;QACzB,IAAM,OAAO,GAAG,IAAA,iBAAO,GAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CACxB;YACE,IAAI,EAAE,MAAM;SACb,EACD,UAAC,OAAO;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,IACE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;gBAC5C,OAAO,CAAC,IAAI,KAAK,EAAE;gBACnB,OAAO,CAAC,IAAI,KAAK,MAAM;gBACvB,OAAO,CAAC,SAAS,IAAI,IAAI,EACzB;gBACA,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,iBAAU,OAAO,CAAC,IAAI,CAAE,CAAC,CAAC;gBACtC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/B;QACH,CAAC,CACF,CAAC;QACF,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAe,IAAI;;;;;;oBACjB,OAAO,CAAC,MAAM,CACZ,qBAAqB,EACrB,+CAA+C,CAChD,CAAC;oBACF,OAAO,CAAC,MAAM,CACZ,mBAAmB,EACnB,2CAA2C,EAC3C,+BAA+B,CAChC,CAAC,CAAC,+BAA+B;oBAClC,OAAO,CAAC,MAAM,CACZ,uBAAuB,EACvB,uEAAuE,CACxE,CAAC;oBACF,OAAO,CAAC,MAAM,CACZ,yBAAyB,EACzB,2FAA2F,CAC5F,CAAC;oBACF,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;oBAC9C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAExB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,cAAc,CAAC;yBAC9C,CAAC,EAAE,EAAH,wBAAG;oBACA,qBAAM,eAAe,EAAE,EAAA;;oBAA5B,EAAE,GAAG,SAAuB,CAAC;;;oBAGzB,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC;oBAE3C,eAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACtB,eAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBACvB,qBAAM,IAAI,EAAE,EAAA;;oBAAZ,SAAY,CAAC;;;;;CACd;AAED,IAAI,EAAE,CAAC","sourcesContent":["#!/usr/bin/env node\n// noinspection XmlDeprecatedElement,HtmlDeprecatedTag\n\n\"use strict\";\n\nimport os from \"os\";\nimport fs from \"fs/promises\";\nimport { Command } from \"commander\";\nimport Bonjour from \"bonjour\";\n\nimport Destination from \"./Destination\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport Event from \"./Event\";\nimport HPApi from \"./HPApi\";\nimport Job from \"./Job\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport JpegUtil from \"./JpegUtil\";\nimport PathHelper from \"./PathHelper\";\nimport { createPdfFrom, ScanContent, ScanPage } from \"./ScanContent\";\n\nconst program = new Command();\n\nfunction delay(t: number): Promise<void> {\n return new Promise(function (resolve) {\n setTimeout(resolve, t);\n });\n}\n\nasync function waitForScanEvent(\n resourceURI: string,\n afterEtag: string | null = null\n): Promise<Event> {\n console.log(\"Start listening for new ScanEvent\");\n\n let eventTable = await HPApi.getEvents(afterEtag ?? \"\");\n let acceptedScanEvent = null;\n let currentEtag = eventTable.etag;\n while (acceptedScanEvent == null) {\n eventTable = await HPApi.getEvents(currentEtag, 1200);\n currentEtag = eventTable.etag;\n\n acceptedScanEvent = eventTable.eventTable.events.find(\n (ev) =>\n ev.isScanEvent &&\n ev.destinationURI &&\n ev.destinationURI.indexOf(resourceURI) >= 0\n );\n }\n return acceptedScanEvent;\n}\n\nasync function waitPrinterUntilItIsReadyToUploadOrCompleted(\n jobUrl: string\n): Promise<Job> {\n let job = null;\n let isReadyToUpload = false;\n do {\n job = await HPApi.getJob(jobUrl);\n if (job.jobState === \"Canceled\") {\n return job;\n } else if (\n job.pageState === \"ReadyToUpload\" ||\n job.jobState === \"Completed\"\n ) {\n isReadyToUpload = true;\n } else if (job.jobState == \"Processing\") {\n isReadyToUpload = false;\n } else {\n console.log(`Unknown jobState: ${job.jobState}`);\n }\n await delay(300);\n } while (!isReadyToUpload);\n return job;\n}\n\nasync function register(): Promise<string> {\n let destination;\n const hostname = os.hostname();\n const toComp = await HPApi.getWalkupScanToCompCaps();\n\n if (toComp) {\n const walkupScanDestinations =\n await HPApi.getWalkupScanToCompDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \")\n );\n\n destination = destinations.find((x) => x.name === hostname);\n } else {\n const walkupScanDestinations = await HPApi.getWalkupScanDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \")\n );\n\n destination = destinations.find((x) => x.name === hostname);\n }\n\n let resourceURI;\n if (destination) {\n console.log(\n `Re-using existing destination: ${hostname} - ${destination.resourceURI}`\n );\n resourceURI = destination.resourceURI;\n } else {\n resourceURI = await HPApi.registerDestination(\n new Destination(hostname, hostname, toComp),\n toComp\n );\n console.log(`New Destination registered: ${hostname} - ${resourceURI}`);\n }\n return resourceURI;\n}\n\nasync function TryGetDestination(event: Event) {\n //this code can in some cases be executed before the user actually chooses between Document or Photo\n //so lets fetch the contentType (Document or Photo) until we get a value\n let destination: WalkupScanDestination | WalkupScanToCompDestination | null =\n null;\n\n for (let i = 0; i < 20; i++) {\n const destinationURI = event.destinationURI;\n if (destinationURI) {\n destination = await HPApi.getDestination(destinationURI);\n\n const shortcut = destination.shortcut;\n if (shortcut !== \"\") {\n return destination;\n }\n } else {\n console.log(`No destination URI found`);\n }\n\n console.log(`No shortcut yet available, attempt: ${i + 1}/20`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n\n console.log(\"Failing to detect destination shortcut\");\n console.log(JSON.stringify(destination));\n return null;\n}\n\nasync function fixJpegSize(filePath: string): Promise<number | null> {\n const buffer: Buffer = await fs.readFile(filePath);\n\n let height = JpegUtil.fixSizeWithDNL(buffer);\n if (height != null) {\n // rewrite the fixed file\n await fs.writeFile(filePath, buffer);\n return height;\n }\n return null;\n}\n\nfunction createScanPage(\n job: Job,\n currentPageNumber: number,\n filePath: string,\n sizeFixed: number | null\n): ScanPage {\n let height = sizeFixed ?? job.imageHeight;\n return {\n path: filePath,\n pageNumber: currentPageNumber,\n width: job.imageWidth,\n height,\n xResolution: job.xResolution,\n yResolution: job.yResolution,\n };\n}\n\nasync function handleProcessingState(\n job: Job,\n inputSource: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n currentPageNumber: number\n): Promise<ScanPage | null> {\n if (\n job.pageState == \"ReadyToUpload\" &&\n job.binaryURL != null &&\n job.currentPageNumber != null\n ) {\n console.log(\n `Ready to download page job page ${job.currentPageNumber} at:`,\n job.binaryURL\n );\n\n const destinationFilePath = PathHelper.getFileForPage(\n folder,\n scanCount,\n currentPageNumber,\n program.opts().pattern,\n \"jpg\"\n );\n const filePath = await HPApi.downloadPage(\n job.binaryURL,\n destinationFilePath\n );\n console.log(\"Page downloaded to:\", filePath);\n\n let sizeFixed: null | number = null;\n if (inputSource == \"Adf\") {\n sizeFixed = await fixJpegSize(filePath);\n if (sizeFixed == null) {\n console.log(\n `File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`\n );\n }\n }\n return createScanPage(job, currentPageNumber, filePath, sizeFixed);\n } else {\n console.log(`Unknown pageState: ${job.pageState}`);\n await delay(200);\n return null;\n }\n}\n\nasync function waitScanRequest(compEventURI: string): Promise<boolean> {\n const waitMax = 50;\n for (let i = 0; i < waitMax; i++) {\n let walkupScanToCompEvent = await HPApi.getWalkupScanToCompEvent(\n compEventURI\n );\n let message = walkupScanToCompEvent.eventType;\n if (message === \"HostSelected\") {\n // this ok to wait\n } else if (message === \"ScanRequested\") {\n break;\n } else if (message === \"ScanNewPageRequested\") {\n break;\n } else if (message === \"ScanPagesComplete\") {\n console.log(\"no more page to scan, scan is finished\");\n return false;\n } else {\n console.log(`Unknown eventType: ${message}`);\n return false;\n }\n\n console.log(`Waiting user input: ${i + 1}/${waitMax}`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n return true;\n}\n\nasync function executeScanJob(\n scanJobSettings: ScanJobSettings,\n inputSource: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent\n) {\n const jobUrl = await HPApi.postJob(scanJobSettings);\n\n console.log(\"New job created:\", jobUrl);\n\n let job = await HPApi.getJob(jobUrl);\n while (job.jobState !== \"Completed\") {\n job = await waitPrinterUntilItIsReadyToUploadOrCompleted(jobUrl);\n\n if (job.jobState == \"Completed\") {\n continue;\n }\n\n if (job.jobState === \"Processing\") {\n const page = await handleProcessingState(\n job,\n inputSource,\n folder,\n scanCount,\n scanJobContent.elements.length + 1\n );\n if (page != null) {\n scanJobContent.elements.push(page);\n }\n } else if (job.jobState === \"Canceled\") {\n console.log(\"Job cancelled by device\");\n break;\n } else {\n console.log(`Unhandled jobState: ${job.jobState}`);\n await delay(200);\n }\n }\n console.log(\n `Job state: ${job.jobState}, totalPages: ${job.totalPageNumber}:`\n );\n}\n\nasync function waitScanNewPageRequest(compEventURI: string): Promise<boolean> {\n let startNewScanJob = false;\n let wait = true;\n while (wait) {\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n\n let walkupScanToCompEvent = await HPApi.getWalkupScanToCompEvent(\n compEventURI\n );\n let message = walkupScanToCompEvent.eventType;\n\n if (message === \"ScanNewPageRequested\") {\n startNewScanJob = true;\n wait = false;\n } else if (message === \"ScanPagesComplete\") {\n wait = false;\n } else if (message === \"ScanRequested\") {\n // continue waiting\n } else {\n wait = false;\n console.log(`Unknown eventType: ${message}`);\n }\n }\n return startNewScanJob;\n}\n\nasync function executeScanJobs(\n scanJobSettings: ScanJobSettings,\n inputSource: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n firstEvent: Event\n) {\n await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent\n );\n let lastEvent = firstEvent;\n if (\n lastEvent.compEventURI &&\n inputSource !== \"Adf\" &&\n lastEvent.destinationURI\n ) {\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n while (startNewScanJob) {\n await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent\n );\n if (!lastEvent.destinationURI) {\n break;\n }\n lastEvent = await waitForScanEvent(\n lastEvent.destinationURI,\n lastEvent.agingStamp\n );\n if (!lastEvent.compEventURI) {\n return;\n }\n startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);\n }\n }\n}\n\nasync function mergeToPdf(folder: string, scanCount: number, scanJobContent: ScanContent) {\n const pdfFilePath = PathHelper.getFileForScan(\n folder,\n scanCount,\n program.opts().pattern,\n \"pdf\"\n );\n await createPdfFrom(scanJobContent, pdfFilePath);\n scanJobContent.elements.forEach((e) => fs.unlink(e.path));\n return pdfFilePath;\n}\n\nfunction displayPdfScan(pdfFilePath: string, scanJobContent: ScanContent) {\n console.log(\n `The following page(s) have been rendered inside '${pdfFilePath}': `\n );\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n }`\n )\n );\n}\n\nfunction displayJpegScan(scanJobContent: ScanContent) {\n scanJobContent.elements.forEach((e) =>\n console.log(\n `\\t- page ${e.pageNumber.toString().padStart(3, \" \")} - ${e.width}x${\n e.height\n } - ${e.path}`\n )\n );\n}\n\nasync function saveScan(\n event: Event,\n folder: string,\n scanCount: number\n): Promise<void> {\n if (event.compEventURI) {\n const proceedToScan = await waitScanRequest(event.compEventURI);\n if (!proceedToScan) {\n return;\n }\n }\n\n const destination = await TryGetDestination(event);\n if (!destination) {\n console.log(\"No shortcut selected!\");\n return;\n }\n console.log(\"Selected shortcut: \" + destination.shortcut);\n\n const contentType = destination.getContentType();\n const toPdf =\n destination.shortcut === \"SavePDF\" || destination.shortcut === \"EmailPDF\";\n\n const scanStatus = await HPApi.getScanStatus();\n console.log(\"Afd is : \" + scanStatus.adfState);\n\n let inputSource = scanStatus.getInputSource();\n\n let scanJobSettings = new ScanJobSettings(inputSource, contentType);\n\n let scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJobs(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n event\n );\n\n console.log(\n `Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`\n );\n\n if (toPdf) {\n const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent);\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nlet iteration = 0;\nasync function init() {\n const folder = await PathHelper.getOutputFolder(program.opts().directory);\n console.log(`Target folder: ${folder}`);\n\n let scanCount = 0;\n\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n let resourceURI = await register();\n\n console.log(\"Waiting scan event for:\", resourceURI);\n const event = await waitForScanEvent(resourceURI);\n\n scanCount++;\n console.log(`Scan event captured, saving scan #${scanCount}`);\n await saveScan(event, folder, scanCount);\n } catch (e) {\n errorCount++;\n console.error(e);\n console.log(e);\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n await delay(1000);\n }\n}\n\nfunction findOfficejetIp(): Promise<string> {\n return new Promise((resolve) => {\n const bonjour = Bonjour();\n console.log(\"Searching printer...\");\n let browser = bonjour.find(\n {\n type: \"http\",\n },\n (service) => {\n console.log(\".\");\n if (\n service.name.startsWith(program.opts().name) &&\n service.port === 80 &&\n service.type === \"http\" &&\n service.addresses != null\n ) {\n browser.stop();\n bonjour.destroy();\n console.log(`Found: ${service.name}`);\n resolve(service.addresses[0]);\n }\n }\n );\n browser.start();\n });\n}\n\nasync function main() {\n program.option(\n \"-ip, --address <ip>\",\n \"IP address of the printer (this overrides -p)\"\n );\n program.option(\n \"-n, --name <name>\",\n \"Name of the printer for service discovery\",\n \"HP Smart Tank Plus 570 series\"\n ); //or i.e. 'Deskjet 3520 series'\n program.option(\n \"-d, --directory <dir>\",\n \"Directory where scans are saved (defaults to /tmp/scan-to-pc<random>)\"\n );\n program.option(\n \"-p, --pattern <pattern>\",\n 'Pattern for filename (i.e. \"scan\"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)'\n );\n program.option(\"-D, --debug\", \"Enable debug\");\n program.parse(process.argv);\n\n let ip = program.opts().address || \"192.168.1.53\";\n if (!ip) {\n ip = await findOfficejetIp();\n }\n\n const debug = program.opts().debug != null;\n\n HPApi.setDebug(debug);\n HPApi.setPrinterIP(ip);\n await init();\n}\n\nmain();\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\n// noinspection XmlDeprecatedElement,HtmlDeprecatedTag\n\n\"use strict\";\n\nimport os from \"os\";\nimport { Command, Option, OptionValues, program } from \"commander\";\nimport Bonjour from \"bonjour\";\nimport config from \"config\";\nimport HPApi from \"./HPApi\";\nimport PathHelper from \"./PathHelper\";\nimport { delay } from \"./delay\";\nimport { readDeviceCapabilities } from \"./readDeviceCapabilities\";\nimport { clearRegistrations, RegistrationConfig, waitScanEvent } from \"./listening\";\nimport { AdfAutoScanConfig, DirectoryConfig, saveScan, ScanConfig, scanFromAdf, waitAdfLoaded } from \"./scanProcessing\";\n\nlet iteration = 0;\n\nasync function listenCmd(\n registrationConfig: RegistrationConfig,\n scanConfig: ScanConfig,\n deviceUpPollingInterval: number\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.directory\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n scanConfig.directoryConfig.tempDirectory\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n const deviceCapabilities = await readDeviceCapabilities();\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n const event = await waitScanEvent(deviceCapabilities, registrationConfig);\n scanCount++;\n console.log(`Scan event captured, saving scan #${scanCount}`);\n await saveScan(\n event,\n folder,\n tempFolder,\n scanCount,\n deviceCapabilities,\n scanConfig\n );\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function adfAutoscanCmd(\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceUpPollingInterval: number\n) {\n // first make sure the device is reachable\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n let deviceUp = true;\n\n const folder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.directory\n );\n console.log(`Target folder: ${folder}`);\n\n const tempFolder = await PathHelper.getOutputFolder(\n adfAutoScanConfig.directoryConfig.tempDirectory\n );\n console.log(`Temp folder: ${tempFolder}`);\n\n let scanCount = 0;\n let keepActive = true;\n let errorCount = 0;\n while (keepActive) {\n console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);\n try {\n await waitAdfLoaded(\n adfAutoScanConfig.pollingInterval,\n adfAutoScanConfig.startScanDelay\n );\n\n scanCount++;\n\n console.log(`Scan event captured, saving scan #${scanCount}`);\n\n await scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig);\n } catch (e) {\n console.log(e);\n if (await HPApi.isAlive()) {\n errorCount++;\n } else {\n deviceUp = false;\n }\n }\n\n if (errorCount === 50) {\n keepActive = false;\n }\n\n if (!deviceUp) {\n await HPApi.waitDeviceUp(deviceUpPollingInterval);\n } else {\n await delay(1000);\n }\n }\n}\n\nasync function clearRegistrationsCmd(cmd: Command) {\n const parentOption = cmd.parent!.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n await clearRegistrations();\n}\n\nfunction findOfficejetIp(deviceNamePrefix: string): Promise<string> {\n return new Promise((resolve) => {\n const bonjour = Bonjour();\n console.log(\"Searching device...\");\n let browser = bonjour.find(\n {\n type: \"http\",\n },\n (service) => {\n console.log(\".\");\n if (\n service.name.startsWith(deviceNamePrefix) &&\n service.port === 80 &&\n service.type === \"http\" &&\n service.addresses != null\n ) {\n browser.stop();\n bonjour.destroy();\n console.log(`Found: ${service.name}`);\n resolve(service.addresses[0]);\n }\n }\n );\n browser.start();\n });\n}\n\nfunction getConfig<T>(name: string): T | undefined {\n return config.has(name) ? config.get<T>(name) : undefined;\n}\n\nfunction setupScanParameters(command: Command): Command {\n command.option(\n \"-d, --directory <dir>\",\n \"Directory where scans are saved (default: /tmp/scan-to-pc<random>)\"\n );\n command.option(\n \"-t, --temp-directory <dir>\",\n \"Temp directory used for processing (default: /tmp/scan-to-pc<random>)\"\n );\n command.option(\n \"-p, --pattern <pattern>\",\n 'Pattern for filename (i.e. \"scan\"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)'\n );\n command.option(\n \"-r, --resolution <dpi>\",\n \"Resolution in DPI of the scans (default: 200)\"\n );\n return command;\n}\n\nfunction setupParameterOpts(command: Command): Command {\n command.option(\n \"-ip, --address <ip>\",\n \"IP address of the device (this overrides -p)\"\n );\n command.option(\n \"--device-up-polling-interval <deviceUpPollingInterval>\",\n \"Device up polling interval in milliseconds\",\n parseFloat\n );\n command.option(\n \"-n, --name <name>\",\n \"Name of the device for service discovery\"\n ); // i.e. 'Deskjet 3520 series'\n\n command.option(\"-D, --debug\", \"Enable debug\");\n return command;\n}\n\nasync function getDeviceIp(options: OptionValues) {\n let ip = options.address || getConfig(\"ip\");\n if (!ip) {\n const name = options.name || getConfig(\"name\");\n ip = await findOfficejetIp(name || \"HP Smart Tank Plus 570 series\");\n }\n console.log(`Using device ip: ${ip}`);\n return ip;\n}\n\nfunction getIsDebug(options: OptionValues) {\n const debug =\n options.debug != null ? true : getConfig<boolean>(\"debug\") || false;\n\n if (debug) {\n console.log(`IsDebug: ${debug}`);\n }\n return debug;\n}\n\nfunction getScanConfiguration(parentOption: OptionValues) {\n const directoryConfig: DirectoryConfig = {\n directory: parentOption.directory || getConfig(\"directory\"),\n tempDirectory: parentOption.tempDirectory || getConfig(\"tempDirectory\"),\n filePattern: parentOption.pattern || getConfig(\"pattern\"),\n };\n\n const scanConfig: ScanConfig = {\n resolution: parseInt(\n parentOption.resolution || getConfig(\"resolution\") || 200,\n 10\n ),\n directoryConfig,\n };\n return scanConfig;\n}\n\nfunction getDeviceUpPollingInterval(parentOption: OptionValues) {\n return (\n parentOption.deviceUpPollingInterval ||\n getConfig(\"deviceUpPollingInterval\") ||\n 1000\n );\n}\n\n\nasync function main() {\n setupParameterOpts(program);\n const cmdListen = program.createCommand(\"listen\");\n setupScanParameters(cmdListen)\n .description(\"Listen the device for new scan job to save to this target\")\n .option(\n \"-l, --label <label>\",\n \"The label to display on the device (the default is the hostname)\"\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const registrationConfig: RegistrationConfig = {\n label: options.label || getConfig(\"label\") || os.hostname(),\n };\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(parentOption);\n\n await listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdListen, { isDefault: true });\n\n const cmdAdfAutoscan = program.createCommand(\"adf-autoscan\");\n setupScanParameters(cmdAdfAutoscan)\n .addOption(\n new Option(\"--duplex\", \"If specified, the scan will be in duplex\")\n )\n .addOption(\n new Option(\n \"--pdf\",\n \"If specified, the scan result will be a pdf document, the default is multiple jpeg files\"\n )\n )\n .addOption(\n new Option(\n \"--pollingInterval <pollingInterval>\",\n \"Time interval in millisecond between each lookup for content in the automatic document feeder\",\n )\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\"\n )\n .addOption(\n new Option(\n \"--start-scan-delay <startScanDelay>\",\n \"Once document are detected to be in the adf, this specify the wait delay in millisecond before triggering the scan\",\n )\n )\n .description(\n \"Automatically trigger a new scan job to this target once paper is detected in the automatic document feeder (adf)\"\n )\n .action(async (options, cmd) => {\n const parentOption = cmd.parent.opts();\n\n const ip = await getDeviceIp(parentOption);\n HPApi.setDeviceIP(ip);\n\n const isDebug = getIsDebug(parentOption);\n HPApi.setDebug(isDebug);\n\n const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);\n\n const scanConfig = getScanConfiguration(parentOption);\n\n const adfScanConfig: AdfAutoScanConfig = {\n ...scanConfig,\n isDuplex: options.isDuplex || getConfig(\"autoscan_duplex\") || false,\n generatePdf: options.pdf || getConfig(\"autoscan_pdf\") || false,\n pollingInterval:\n options.pollingInterval || getConfig(\"autoscan_pollingInterval\") || 1000,\n startScanDelay:\n options.startScanDelay || getConfig(\"autoscan_startScanDelay\") || 5000,\n };\n\n await adfAutoscanCmd(adfScanConfig, deviceUpPollingInterval);\n });\n program.addCommand(cmdAdfAutoscan);\n\n const cmdClearRegistrations = program.createCommand(\"clear-registrations\");\n cmdClearRegistrations\n .description(\"Clear the list or registered target on the device\")\n .action(async (options, cmd) => {\n await clearRegistrationsCmd(cmd);\n });\n program.addCommand(cmdClearRegistrations);\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => console.log(err));\n"]}
@@ -0,0 +1,9 @@
1
+ import Event from "./Event";
2
+ import { DeviceCapabilities } from "./DeviceCapabilities";
3
+ export declare function waitScanRequest(compEventURI: string): Promise<boolean>;
4
+ export declare function waitForScanEvent(resourceURI: string, afterEtag?: string | null): Promise<Event>;
5
+ export type RegistrationConfig = {
6
+ label: string;
7
+ };
8
+ export declare function waitScanEvent(deviceCapabilities: DeviceCapabilities, registrationConfig: RegistrationConfig): Promise<Event>;
9
+ export declare function clearRegistrations(): Promise<void>;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.clearRegistrations = exports.waitScanEvent = exports.waitForScanEvent = exports.waitScanRequest = void 0;
7
+ const HPApi_1 = __importDefault(require("./HPApi"));
8
+ const Destination_1 = __importDefault(require("./Destination"));
9
+ async function waitScanRequest(compEventURI) {
10
+ const waitMax = 50;
11
+ for (let i = 0; i < waitMax; i++) {
12
+ let walkupScanToCompEvent = await HPApi_1.default.getWalkupScanToCompEvent(compEventURI);
13
+ let message = walkupScanToCompEvent.eventType;
14
+ if (message === "HostSelected") {
15
+ // this ok to wait
16
+ }
17
+ else if (message === "ScanRequested") {
18
+ break;
19
+ }
20
+ else if (message === "ScanNewPageRequested") {
21
+ break;
22
+ }
23
+ else if (message === "ScanPagesComplete") {
24
+ console.log("no more page to scan, scan is finished");
25
+ return false;
26
+ }
27
+ else {
28
+ console.log(`Unknown eventType: ${message}`);
29
+ return false;
30
+ }
31
+ console.log(`Waiting user input: ${i + 1}/${waitMax}`);
32
+ await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s
33
+ }
34
+ return true;
35
+ }
36
+ exports.waitScanRequest = waitScanRequest;
37
+ async function waitForScanEvent(resourceURI, afterEtag = null) {
38
+ console.log("Start listening for new ScanEvent");
39
+ let eventTable = await HPApi_1.default.getEvents(afterEtag !== null && afterEtag !== void 0 ? afterEtag : "");
40
+ let acceptedScanEvent = null;
41
+ let currentEtag = eventTable.etag;
42
+ while (acceptedScanEvent == null) {
43
+ eventTable = await HPApi_1.default.getEvents(currentEtag, 1200);
44
+ currentEtag = eventTable.etag;
45
+ acceptedScanEvent = eventTable.eventTable.events.find((ev) => ev.isScanEvent &&
46
+ ev.destinationURI &&
47
+ ev.destinationURI.indexOf(resourceURI) >= 0);
48
+ }
49
+ return acceptedScanEvent;
50
+ }
51
+ exports.waitForScanEvent = waitForScanEvent;
52
+ async function registerWalkupScanToCompDestination(registrationConfig) {
53
+ const walkupScanDestinations = await HPApi_1.default.getWalkupScanToCompDestinations();
54
+ const destinations = walkupScanDestinations.destinations;
55
+ console.log("Host destinations fetched:", destinations.map((d) => d.name).join(", "));
56
+ const hostname = registrationConfig.label;
57
+ const destination = destinations.find((x) => x.name === hostname);
58
+ let resourceURI;
59
+ if (destination) {
60
+ console.log(`Re-using existing destination: ${hostname} - ${destination.resourceURI}`);
61
+ resourceURI = destination.resourceURI;
62
+ }
63
+ else {
64
+ resourceURI = await HPApi_1.default.registerWalkupScanToCompDestination(new Destination_1.default(hostname, hostname, true));
65
+ console.log(`New Destination registered: ${hostname} - ${resourceURI}`);
66
+ }
67
+ console.log(`Using: ${hostname}`);
68
+ return resourceURI;
69
+ }
70
+ async function registerWalkupScanDestination(registrationConfig) {
71
+ const walkupScanDestinations = await HPApi_1.default.getWalkupScanDestinations();
72
+ const destinations = walkupScanDestinations.destinations;
73
+ console.log("Host destinations fetched:", destinations.map((d) => d.name).join(", "));
74
+ const hostname = registrationConfig.label;
75
+ const destination = destinations.find((x) => x.name === hostname);
76
+ let resourceURI;
77
+ if (destination) {
78
+ console.log(`Re-using existing destination: ${hostname} - ${destination.resourceURI}`);
79
+ resourceURI = destination.resourceURI;
80
+ }
81
+ else {
82
+ resourceURI = await HPApi_1.default.registerWalkupScanDestination(new Destination_1.default(hostname, hostname, false));
83
+ console.log(`New Destination registered: ${hostname} - ${resourceURI}`);
84
+ }
85
+ console.log(`Using: ${hostname}`);
86
+ return resourceURI;
87
+ }
88
+ async function waitScanEvent(deviceCapabilities, registrationConfig) {
89
+ let resourceURI;
90
+ if (deviceCapabilities.useWalkupScanToComp) {
91
+ resourceURI = await registerWalkupScanToCompDestination(registrationConfig);
92
+ }
93
+ else {
94
+ resourceURI = await registerWalkupScanDestination(registrationConfig);
95
+ }
96
+ console.log("Waiting scan event for:", resourceURI);
97
+ return await waitForScanEvent(resourceURI);
98
+ }
99
+ exports.waitScanEvent = waitScanEvent;
100
+ async function clearRegistrations() {
101
+ const dests = await HPApi_1.default.getWalkupScanToCompDestinations();
102
+ for (let i = 0; i < dests.destinations.length; i++) {
103
+ console.log(`Removing: ${dests.destinations[i].name}`);
104
+ await HPApi_1.default.removeDestination(dests.destinations[i]);
105
+ }
106
+ }
107
+ exports.clearRegistrations = clearRegistrations;
108
+ //# sourceMappingURL=listening.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listening.js","sourceRoot":"","sources":["../src/listening.ts"],"names":[],"mappings":"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","sourcesContent":["import HPApi from \"./HPApi\";\nimport Event from \"./Event\";\nimport Destination from \"./Destination\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\n\nexport async function waitScanRequest(compEventURI: string): Promise<boolean> {\n const waitMax = 50;\n for (let i = 0; i < waitMax; i++) {\n let walkupScanToCompEvent = await HPApi.getWalkupScanToCompEvent(\n compEventURI\n );\n let message = walkupScanToCompEvent.eventType;\n if (message === \"HostSelected\") {\n // this ok to wait\n } else if (message === \"ScanRequested\") {\n break;\n } else if (message === \"ScanNewPageRequested\") {\n break;\n } else if (message === \"ScanPagesComplete\") {\n console.log(\"no more page to scan, scan is finished\");\n return false;\n } else {\n console.log(`Unknown eventType: ${message}`);\n return false;\n }\n\n console.log(`Waiting user input: ${i + 1}/${waitMax}`);\n await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s\n }\n return true;\n}\n\nexport async function waitForScanEvent(\n resourceURI: string,\n afterEtag: string | null = null\n): Promise<Event> {\n console.log(\"Start listening for new ScanEvent\");\n\n let eventTable = await HPApi.getEvents(afterEtag ?? \"\");\n let acceptedScanEvent = null;\n let currentEtag = eventTable.etag;\n while (acceptedScanEvent == null) {\n eventTable = await HPApi.getEvents(currentEtag, 1200);\n currentEtag = eventTable.etag;\n\n acceptedScanEvent = eventTable.eventTable.events.find(\n (ev) =>\n ev.isScanEvent &&\n ev.destinationURI &&\n ev.destinationURI.indexOf(resourceURI) >= 0\n );\n }\n return acceptedScanEvent;\n}\n\nasync function registerWalkupScanToCompDestination(\n registrationConfig: RegistrationConfig\n): Promise<string> {\n const walkupScanDestinations = await HPApi.getWalkupScanToCompDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \")\n );\n\n const hostname = registrationConfig.label;\n const destination = destinations.find((x) => x.name === hostname);\n\n let resourceURI;\n if (destination) {\n console.log(\n `Re-using existing destination: ${hostname} - ${destination.resourceURI}`\n );\n resourceURI = destination.resourceURI;\n } else {\n resourceURI = await HPApi.registerWalkupScanToCompDestination(\n new Destination(hostname, hostname, true)\n );\n console.log(`New Destination registered: ${hostname} - ${resourceURI}`);\n }\n\n console.log(`Using: ${hostname}`);\n\n return resourceURI;\n}\n\nasync function registerWalkupScanDestination(\n registrationConfig: RegistrationConfig\n): Promise<string> {\n const walkupScanDestinations = await HPApi.getWalkupScanDestinations();\n const destinations = walkupScanDestinations.destinations;\n\n console.log(\n \"Host destinations fetched:\",\n destinations.map((d) => d.name).join(\", \")\n );\n\n const hostname = registrationConfig.label;\n const destination = destinations.find((x) => x.name === hostname);\n\n let resourceURI;\n if (destination) {\n console.log(\n `Re-using existing destination: ${hostname} - ${destination.resourceURI}`\n );\n resourceURI = destination.resourceURI;\n } else {\n resourceURI = await HPApi.registerWalkupScanDestination(\n new Destination(hostname, hostname, false)\n );\n console.log(`New Destination registered: ${hostname} - ${resourceURI}`);\n }\n\n console.log(`Using: ${hostname}`);\n\n return resourceURI;\n}\n\nexport type RegistrationConfig = {\n label: string;\n};\n\nexport async function waitScanEvent(\n deviceCapabilities: DeviceCapabilities,\n registrationConfig: RegistrationConfig\n): Promise<Event> {\n let resourceURI: string;\n if (deviceCapabilities.useWalkupScanToComp) {\n resourceURI = await registerWalkupScanToCompDestination(registrationConfig);\n } else {\n resourceURI = await registerWalkupScanDestination(registrationConfig);\n }\n\n console.log(\"Waiting scan event for:\", resourceURI);\n return await waitForScanEvent(resourceURI);\n}\n\nexport async function clearRegistrations() {\n const dests = await HPApi.getWalkupScanToCompDestinations();\n for (let i = 0; i < dests.destinations.length; i++) {\n console.log(`Removing: ${dests.destinations[i].name}`);\n await HPApi.removeDestination(dests.destinations[i]);\n }\n}"]}
@@ -0,0 +1,2 @@
1
+ import { DeviceCapabilities } from "./DeviceCapabilities";
2
+ export declare function readDeviceCapabilities(): Promise<DeviceCapabilities>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.readDeviceCapabilities = void 0;
7
+ const HPApi_1 = __importDefault(require("./HPApi"));
8
+ async function readDeviceCapabilities() {
9
+ let supportsMultiItemScanFromPlaten = true;
10
+ const discoveryTree = await HPApi_1.default.getDiscoveryTree();
11
+ let walkupScanToCompCaps = null;
12
+ if (discoveryTree.WalkupScanToCompManifestURI != null) {
13
+ const walkupScanToCompManifest = await HPApi_1.default.getWalkupScanToCompManifest(discoveryTree.WalkupScanToCompManifestURI);
14
+ if (walkupScanToCompManifest.WalkupScanToCompCapsURI != null) {
15
+ walkupScanToCompCaps = await HPApi_1.default.getWalkupScanToCompCaps(walkupScanToCompManifest.WalkupScanToCompCapsURI);
16
+ supportsMultiItemScanFromPlaten =
17
+ walkupScanToCompCaps.supportsMultiItemScanFromPlaten;
18
+ }
19
+ }
20
+ else if (discoveryTree.WalkupScanManifestURI != null) {
21
+ const walkupScanManifest = await HPApi_1.default.getWalkupScanManifest(discoveryTree.WalkupScanManifestURI);
22
+ if (walkupScanManifest.walkupScanDestinationsURI != null) {
23
+ await HPApi_1.default.getWalkupScanDestinations(walkupScanManifest.walkupScanDestinationsURI);
24
+ }
25
+ }
26
+ else {
27
+ console.log("Unknown device!");
28
+ }
29
+ if (discoveryTree.ScanJobManifestURI != null) {
30
+ const scanJobManifest = await HPApi_1.default.getScanJobManifest(discoveryTree.ScanJobManifestURI);
31
+ if (scanJobManifest.ScanCapsURI != null) {
32
+ await HPApi_1.default.getScanCaps(scanJobManifest.ScanCapsURI);
33
+ }
34
+ }
35
+ return {
36
+ supportsMultiItemScanFromPlaten,
37
+ useWalkupScanToComp: walkupScanToCompCaps != null,
38
+ };
39
+ }
40
+ exports.readDeviceCapabilities = readDeviceCapabilities;
41
+ //# sourceMappingURL=readDeviceCapabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readDeviceCapabilities.js","sourceRoot":"","sources":["../src/readDeviceCapabilities.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAGrB,KAAK,UAAU,sBAAsB;IAC1C,IAAI,+BAA+B,GAAG,IAAI,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,eAAK,CAAC,gBAAgB,EAAE,CAAC;IACrD,IAAI,oBAAoB,GAAgC,IAAI,CAAC;IAC7D,IAAI,aAAa,CAAC,2BAA2B,IAAI,IAAI,EAAE;QACrD,MAAM,wBAAwB,GAAG,MAAM,eAAK,CAAC,2BAA2B,CACtE,aAAa,CAAC,2BAA2B,CAC1C,CAAC;QACF,IAAI,wBAAwB,CAAC,uBAAuB,IAAI,IAAI,EAAE;YAC5D,oBAAoB,GAAG,MAAM,eAAK,CAAC,uBAAuB,CACxD,wBAAwB,CAAC,uBAAuB,CACjD,CAAC;YACF,+BAA+B;gBAC7B,oBAAoB,CAAC,+BAA+B,CAAC;SACxD;KACF;SAAM,IAAI,aAAa,CAAC,qBAAqB,IAAI,IAAI,EAAE;QACtD,MAAM,kBAAkB,GAAG,MAAM,eAAK,CAAC,qBAAqB,CAC1D,aAAa,CAAC,qBAAqB,CACpC,CAAC;QACF,IAAI,kBAAkB,CAAC,yBAAyB,IAAI,IAAI,EAAE;YACxD,MAAM,eAAK,CAAC,yBAAyB,CACnC,kBAAkB,CAAC,yBAAyB,CAC7C,CAAC;SACH;KACF;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;KAChC;IAED,IAAI,aAAa,CAAC,kBAAkB,IAAI,IAAI,EAAE;QAC5C,MAAM,eAAe,GAAG,MAAM,eAAK,CAAC,kBAAkB,CACpD,aAAa,CAAC,kBAAkB,CACjC,CAAC;QACF,IAAI,eAAe,CAAC,WAAW,IAAI,IAAI,EAAE;YACvC,MAAM,eAAK,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;SACtD;KACF;IAED,OAAO;QACL,+BAA+B;QAC/B,mBAAmB,EAAE,oBAAoB,IAAI,IAAI;KAClD,CAAC;AACJ,CAAC;AAzCD,wDAyCC","sourcesContent":["import { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport HPApi from \"./HPApi\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\n\nexport async function readDeviceCapabilities(): Promise<DeviceCapabilities> {\n let supportsMultiItemScanFromPlaten = true;\n const discoveryTree = await HPApi.getDiscoveryTree();\n let walkupScanToCompCaps: WalkupScanToCompCaps | null = null;\n if (discoveryTree.WalkupScanToCompManifestURI != null) {\n const walkupScanToCompManifest = await HPApi.getWalkupScanToCompManifest(\n discoveryTree.WalkupScanToCompManifestURI\n );\n if (walkupScanToCompManifest.WalkupScanToCompCapsURI != null) {\n walkupScanToCompCaps = await HPApi.getWalkupScanToCompCaps(\n walkupScanToCompManifest.WalkupScanToCompCapsURI\n );\n supportsMultiItemScanFromPlaten =\n walkupScanToCompCaps.supportsMultiItemScanFromPlaten;\n }\n } else if (discoveryTree.WalkupScanManifestURI != null) {\n const walkupScanManifest = await HPApi.getWalkupScanManifest(\n discoveryTree.WalkupScanManifestURI\n );\n if (walkupScanManifest.walkupScanDestinationsURI != null) {\n await HPApi.getWalkupScanDestinations(\n walkupScanManifest.walkupScanDestinationsURI\n );\n }\n } else {\n console.log(\"Unknown device!\");\n }\n\n if (discoveryTree.ScanJobManifestURI != null) {\n const scanJobManifest = await HPApi.getScanJobManifest(\n discoveryTree.ScanJobManifestURI\n );\n if (scanJobManifest.ScanCapsURI != null) {\n await HPApi.getScanCaps(scanJobManifest.ScanCapsURI);\n }\n }\n\n return {\n supportsMultiItemScanFromPlaten,\n useWalkupScanToComp: walkupScanToCompCaps != null,\n };\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import Event from "./Event";
2
+ import { DeviceCapabilities } from "./DeviceCapabilities";
3
+ export declare function saveScan(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
4
+ export type DirectoryConfig = {
5
+ directory: string | undefined;
6
+ tempDirectory: string | undefined;
7
+ filePattern: string | undefined;
8
+ };
9
+ export type ScanConfig = {
10
+ resolution: number;
11
+ directoryConfig: DirectoryConfig;
12
+ };
13
+ export type AdfAutoScanConfig = ScanConfig & {
14
+ isDuplex: boolean;
15
+ generatePdf: boolean;
16
+ pollingInterval: number;
17
+ startScanDelay: number;
18
+ };
19
+ export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig): Promise<void>;
@@ -0,0 +1,292 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scanFromAdf = exports.saveScan = void 0;
7
+ const HPApi_1 = __importDefault(require("./HPApi"));
8
+ const promises_1 = __importDefault(require("fs/promises"));
9
+ const JpegUtil_1 = __importDefault(require("./JpegUtil"));
10
+ const listening_1 = require("./listening");
11
+ const ScanJobSettings_1 = __importDefault(require("./ScanJobSettings"));
12
+ const ScanContent_1 = require("./ScanContent");
13
+ const delay_1 = require("./delay");
14
+ const PathHelper_1 = __importDefault(require("./PathHelper"));
15
+ async function waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl) {
16
+ let job = null;
17
+ let isReadyToUpload = false;
18
+ do {
19
+ job = await HPApi_1.default.getJob(jobUrl);
20
+ if (job.jobState === "Canceled") {
21
+ return job;
22
+ }
23
+ else if (job.pageState === "ReadyToUpload" ||
24
+ job.jobState === "Completed") {
25
+ isReadyToUpload = true;
26
+ }
27
+ else if (job.jobState == "Processing") {
28
+ isReadyToUpload = false;
29
+ }
30
+ else {
31
+ console.log(`Unknown jobState: ${job.jobState}`);
32
+ }
33
+ await (0, delay_1.delay)(300);
34
+ } while (!isReadyToUpload);
35
+ return job;
36
+ }
37
+ async function TryGetDestination(event) {
38
+ //this code can in some cases be executed before the user actually chooses between Document or Photo
39
+ //so lets fetch the contentType (Document or Photo) until we get a value
40
+ let destination = null;
41
+ for (let i = 0; i < 20; i++) {
42
+ const destinationURI = event.destinationURI;
43
+ if (destinationURI) {
44
+ destination = await HPApi_1.default.getDestination(destinationURI);
45
+ const shortcut = destination.shortcut;
46
+ if (shortcut != null) {
47
+ return destination;
48
+ }
49
+ }
50
+ else {
51
+ console.log(`No destination URI found`);
52
+ }
53
+ console.log(`No shortcut yet available, attempt: ${i + 1}/20`);
54
+ await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s
55
+ }
56
+ console.log("Failing to detect destination shortcut");
57
+ console.log(JSON.stringify(destination));
58
+ return null;
59
+ }
60
+ async function scanProcess(filePath) {
61
+ const buffer = await promises_1.default.readFile(filePath);
62
+ let height = JpegUtil_1.default.fixSizeWithDNL(buffer);
63
+ if (height != null) {
64
+ // rewrite the fixed file
65
+ await promises_1.default.writeFile(filePath, buffer);
66
+ return height;
67
+ }
68
+ return null;
69
+ }
70
+ function createScanPage(job, currentPageNumber, filePath, sizeFixed) {
71
+ var _a, _b, _c;
72
+ let height = sizeFixed !== null && sizeFixed !== void 0 ? sizeFixed : job.imageHeight;
73
+ return {
74
+ path: filePath,
75
+ pageNumber: currentPageNumber,
76
+ width: (_a = job.imageWidth) !== null && _a !== void 0 ? _a : 0,
77
+ height: height !== null && height !== void 0 ? height : 0,
78
+ xResolution: (_b = job.xResolution) !== null && _b !== void 0 ? _b : 200,
79
+ yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200
80
+ };
81
+ }
82
+ async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern) {
83
+ if (job.pageState == "ReadyToUpload" &&
84
+ job.binaryURL != null &&
85
+ job.currentPageNumber != null) {
86
+ console.log(`Ready to download page job page ${job.currentPageNumber} at:`, job.binaryURL);
87
+ const destinationFilePath = PathHelper_1.default.getFileForPage(folder, scanCount, currentPageNumber, filePattern, "jpg");
88
+ const filePath = await HPApi_1.default.downloadPage(job.binaryURL, destinationFilePath);
89
+ console.log("Page downloaded to:", filePath);
90
+ let sizeFixed = null;
91
+ if (inputSource == "Adf") {
92
+ sizeFixed = await scanProcess(filePath);
93
+ if (sizeFixed == null) {
94
+ console.log(`File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`);
95
+ }
96
+ }
97
+ return createScanPage(job, currentPageNumber, filePath, sizeFixed);
98
+ }
99
+ else {
100
+ console.log(`Unknown pageState: ${job.pageState}`);
101
+ await (0, delay_1.delay)(200);
102
+ return null;
103
+ }
104
+ }
105
+ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern) {
106
+ const jobUrl = await HPApi_1.default.postJob(scanJobSettings);
107
+ console.log("New job created:", jobUrl);
108
+ let job = await HPApi_1.default.getJob(jobUrl);
109
+ while (job.jobState !== "Completed") {
110
+ job = await waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl);
111
+ if (job.jobState == "Completed") {
112
+ continue;
113
+ }
114
+ if (job.jobState === "Processing") {
115
+ const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern);
116
+ job = await HPApi_1.default.getJob(jobUrl);
117
+ if (page != null && job.jobState != "Canceled") {
118
+ scanJobContent.elements.push(page);
119
+ }
120
+ }
121
+ else if (job.jobState === "Canceled") {
122
+ console.log("Job cancelled by device");
123
+ break;
124
+ }
125
+ else {
126
+ console.log(`Unhandled jobState: ${job.jobState}`);
127
+ await (0, delay_1.delay)(200);
128
+ }
129
+ }
130
+ console.log(`Job state: ${job.jobState}, totalPages: ${scanJobContent.elements.length}:`);
131
+ return job.jobState;
132
+ }
133
+ async function waitScanNewPageRequest(compEventURI) {
134
+ let startNewScanJob = false;
135
+ let wait = true;
136
+ while (wait) {
137
+ await new Promise((resolve) => setTimeout(resolve, 1000)); //wait 1s
138
+ let walkupScanToCompEvent = await HPApi_1.default.getWalkupScanToCompEvent(compEventURI);
139
+ let message = walkupScanToCompEvent.eventType;
140
+ if (message === "ScanNewPageRequested") {
141
+ startNewScanJob = true;
142
+ wait = false;
143
+ }
144
+ else if (message === "ScanPagesComplete") {
145
+ wait = false;
146
+ }
147
+ else if (message === "ScanRequested") {
148
+ // continue waiting
149
+ }
150
+ else {
151
+ wait = false;
152
+ console.log(`Unknown eventType: ${message}`);
153
+ }
154
+ }
155
+ return startNewScanJob;
156
+ }
157
+ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern) {
158
+ let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
159
+ let lastEvent = firstEvent;
160
+ if (jobState === "Completed" &&
161
+ lastEvent.compEventURI &&
162
+ inputSource !== "Adf" &&
163
+ lastEvent.destinationURI &&
164
+ deviceCapabilities.supportsMultiItemScanFromPlaten) {
165
+ lastEvent = await (0, listening_1.waitForScanEvent)(lastEvent.destinationURI, lastEvent.agingStamp);
166
+ if (!lastEvent.compEventURI) {
167
+ return;
168
+ }
169
+ let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);
170
+ while (startNewScanJob) {
171
+ jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
172
+ if (jobState !== "Completed") {
173
+ return;
174
+ }
175
+ if (!lastEvent.destinationURI) {
176
+ break;
177
+ }
178
+ lastEvent = await (0, listening_1.waitForScanEvent)(lastEvent.destinationURI, lastEvent.agingStamp);
179
+ if (!lastEvent.compEventURI) {
180
+ return;
181
+ }
182
+ startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);
183
+ }
184
+ }
185
+ }
186
+ async function mergeToPdf(folder, scanCount, scanJobContent, filePattern) {
187
+ if (scanJobContent.elements.length > 0) {
188
+ const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf");
189
+ await (0, ScanContent_1.createPdfFrom)(scanJobContent, pdfFilePath);
190
+ scanJobContent.elements.forEach((e) => promises_1.default.unlink(e.path));
191
+ return pdfFilePath;
192
+ }
193
+ console.log(`No page available to build a pdf file`);
194
+ return null;
195
+ }
196
+ function displayPdfScan(pdfFilePath, scanJobContent) {
197
+ if (pdfFilePath === null) {
198
+ console.log(`Pdf generated has not been generated`);
199
+ return;
200
+ }
201
+ console.log(`The following page(s) have been rendered inside '${pdfFilePath}': `);
202
+ scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height}`));
203
+ }
204
+ function displayJpegScan(scanJobContent) {
205
+ scanJobContent.elements.forEach((e) => console.log(`\t- page ${e.pageNumber.toString().padStart(3, " ")} - ${e.width}x${e.height} - ${e.path}`));
206
+ }
207
+ function isPdf(destination) {
208
+ if (destination.shortcut === "SavePDF" ||
209
+ destination.shortcut === "EmailPDF" ||
210
+ destination.shortcut == "SaveDocument1") {
211
+ return true;
212
+ }
213
+ else if (destination.shortcut === "SaveJPEG" ||
214
+ destination.shortcut === "SavePhoto1") {
215
+ return false;
216
+ }
217
+ else {
218
+ console.log(`Unexpected shortcut received: ${destination.shortcut}, considering it as non pdf target!`);
219
+ return false;
220
+ }
221
+ }
222
+ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig) {
223
+ if (event.compEventURI) {
224
+ const proceedToScan = await (0, listening_1.waitScanRequest)(event.compEventURI);
225
+ if (!proceedToScan) {
226
+ return;
227
+ }
228
+ }
229
+ const destination = await TryGetDestination(event);
230
+ if (!destination) {
231
+ console.log("No shortcut selected!");
232
+ return;
233
+ }
234
+ console.log("Selected shortcut: " + destination.shortcut);
235
+ let toPdf;
236
+ let destinationFolder;
237
+ let contentType;
238
+ if (isPdf(destination)) {
239
+ toPdf = true;
240
+ contentType = "Document";
241
+ destinationFolder = tempFolder;
242
+ console.log(`Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`);
243
+ }
244
+ else {
245
+ toPdf = false;
246
+ contentType = "Photo";
247
+ destinationFolder = folder;
248
+ }
249
+ const isDuplex = destination.scanPlexMode != null && destination.scanPlexMode != "Simplex";
250
+ console.log("ScanPlexMode is : " + destination.scanPlexMode);
251
+ const scanStatus = await HPApi_1.default.getScanStatus();
252
+ console.log("Afd is : " + scanStatus.adfState);
253
+ const inputSource = scanStatus.getInputSource();
254
+ const scanJobSettings = new ScanJobSettings_1.default(inputSource, contentType, scanConfig.resolution, isDuplex);
255
+ const scanJobContent = { elements: [] };
256
+ await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern);
257
+ console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
258
+ if (toPdf) {
259
+ const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern);
260
+ displayPdfScan(pdfFilePath, scanJobContent);
261
+ }
262
+ else {
263
+ displayJpegScan(scanJobContent);
264
+ }
265
+ }
266
+ exports.saveScan = saveScan;
267
+ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig) {
268
+ let destinationFolder;
269
+ let contentType;
270
+ if (adfAutoScanConfig.generatePdf) {
271
+ contentType = "Document";
272
+ destinationFolder = tempFolder;
273
+ console.log(`Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`);
274
+ }
275
+ else {
276
+ contentType = "Photo";
277
+ destinationFolder = folder;
278
+ }
279
+ const scanJobSettings = new ScanJobSettings_1.default("Adf", contentType, adfAutoScanConfig.resolution, adfAutoScanConfig.isDuplex);
280
+ const scanJobContent = { elements: [] };
281
+ await executeScanJob(scanJobSettings, "Adf", destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
282
+ console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
283
+ if (adfAutoScanConfig.generatePdf) {
284
+ const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
285
+ displayPdfScan(pdfFilePath, scanJobContent);
286
+ }
287
+ else {
288
+ displayJpegScan(scanJobContent);
289
+ }
290
+ }
291
+ exports.scanFromAdf = scanFromAdf;
292
+ //# sourceMappingURL=scanProcess.js.map