node-hp-scan-to 1.3.0 → 1.4.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 (202) hide show
  1. package/README.md +76 -15
  2. package/dist/Destination.js.map +1 -1
  3. package/dist/DeviceCapabilities.d.ts +4 -0
  4. package/dist/DeviceCapabilities.js.map +1 -1
  5. package/dist/DiscoveryTree.js.map +1 -1
  6. package/dist/Event.js +2 -2
  7. package/dist/Event.js.map +1 -1
  8. package/dist/EventTable.js.map +1 -1
  9. package/dist/HPApi.js.map +1 -1
  10. package/dist/InputSource.d.ts +4 -0
  11. package/dist/InputSource.js +9 -0
  12. package/dist/InputSource.js.map +1 -0
  13. package/dist/Job.d.ts +2 -0
  14. package/dist/Job.js +2 -2
  15. package/dist/Job.js.map +1 -1
  16. package/dist/JpegUtil.js +1 -1
  17. package/dist/JpegUtil.js.map +1 -1
  18. package/dist/PathHelper.d.ts +4 -3
  19. package/dist/PathHelper.js +28 -13
  20. package/dist/PathHelper.js.map +1 -1
  21. package/dist/ScanCaps.d.ts +18 -0
  22. package/dist/ScanCaps.js +14 -0
  23. package/dist/ScanCaps.js.map +1 -1
  24. package/dist/ScanContent.js.map +1 -1
  25. package/dist/ScanJobManifest.js.map +1 -1
  26. package/dist/ScanJobSettings.d.ts +4 -1
  27. package/dist/ScanJobSettings.js +19 -8
  28. package/dist/ScanJobSettings.js.map +1 -1
  29. package/dist/ScanStatus.d.ts +2 -1
  30. package/dist/ScanStatus.js +3 -2
  31. package/dist/ScanStatus.js.map +1 -1
  32. package/dist/WalkupScanDestination.js +2 -2
  33. package/dist/WalkupScanDestination.js.map +1 -1
  34. package/dist/WalkupScanDestinations.js +1 -1
  35. package/dist/WalkupScanDestinations.js.map +1 -1
  36. package/dist/WalkupScanManifest.js.map +1 -1
  37. package/dist/WalkupScanToCompCaps.js.map +1 -1
  38. package/dist/WalkupScanToCompDestination.js +2 -2
  39. package/dist/WalkupScanToCompDestination.js.map +1 -1
  40. package/dist/WalkupScanToCompDestinations.js +1 -1
  41. package/dist/WalkupScanToCompDestinations.js.map +1 -1
  42. package/dist/WalkupScanToCompEvent.js.map +1 -1
  43. package/dist/WalkupScanToCompManifest.js.map +1 -1
  44. package/dist/index.js +28 -7
  45. package/dist/index.js.map +1 -1
  46. package/dist/listening.js.map +1 -1
  47. package/dist/readDeviceCapabilities.js +6 -1
  48. package/dist/readDeviceCapabilities.js.map +1 -1
  49. package/dist/scanProcessing.d.ts +5 -1
  50. package/dist/scanProcessing.js +61 -21
  51. package/dist/scanProcessing.js.map +1 -1
  52. package/package.json +7 -7
  53. package/src/Destination.ts +1 -1
  54. package/src/DeviceCapabilities.ts +4 -0
  55. package/src/DiscoveryTree.ts +1 -1
  56. package/src/Event.ts +4 -4
  57. package/src/EventTable.ts +1 -1
  58. package/src/HPApi.ts +19 -19
  59. package/src/InputSource.ts +4 -0
  60. package/src/Job.ts +19 -7
  61. package/src/JpegUtil.ts +18 -14
  62. package/src/PathHelper.ts +48 -20
  63. package/src/ScanCaps.ts +43 -1
  64. package/src/ScanContent.ts +1 -1
  65. package/src/ScanJobManifest.ts +3 -2
  66. package/src/ScanJobSettings.ts +23 -9
  67. package/src/ScanStatus.ts +6 -3
  68. package/src/WalkupScanDestination.ts +9 -5
  69. package/src/WalkupScanDestinations.ts +9 -4
  70. package/src/WalkupScanManifest.ts +3 -3
  71. package/src/WalkupScanToCompCaps.ts +2 -2
  72. package/src/WalkupScanToCompDestination.ts +15 -5
  73. package/src/WalkupScanToCompDestinations.ts +5 -4
  74. package/src/WalkupScanToCompEvent.ts +1 -1
  75. package/src/WalkupScanToCompManifest.ts +3 -3
  76. package/src/index.ts +92 -35
  77. package/src/listening.ts +14 -15
  78. package/src/readDeviceCapabilities.ts +12 -6
  79. package/src/scanProcessing.ts +129 -52
  80. package/dist/fixJpegSize.d.ts +0 -19
  81. package/dist/fixJpegSize.js +0 -292
  82. package/dist/fixJpegSize.js.map +0 -1
  83. package/dist/scanProcess.d.ts +0 -19
  84. package/dist/scanProcess.js +0 -292
  85. package/dist/scanProcess.js.map +0 -1
  86. package/dist/src/Destination.d.ts +0 -8
  87. package/dist/src/Destination.js +0 -68
  88. package/dist/src/Destination.js.map +0 -1
  89. package/dist/src/DiscoveryTree.d.ts +0 -16
  90. package/dist/src/DiscoveryTree.js +0 -38
  91. package/dist/src/DiscoveryTree.js.map +0 -1
  92. package/dist/src/Event.d.ts +0 -21
  93. package/dist/src/Event.js +0 -32
  94. package/dist/src/Event.js.map +0 -1
  95. package/dist/src/EventTable.d.ts +0 -16
  96. package/dist/src/EventTable.js +0 -33
  97. package/dist/src/EventTable.js.map +0 -1
  98. package/dist/src/HPApi.d.ts +0 -50
  99. package/dist/src/HPApi.js +0 -454
  100. package/dist/src/HPApi.js.map +0 -1
  101. package/dist/src/Job.d.ts +0 -37
  102. package/dist/src/Job.js +0 -78
  103. package/dist/src/Job.js.map +0 -1
  104. package/dist/src/JpegUtil.d.ts +0 -26
  105. package/dist/src/JpegUtil.js +0 -229
  106. package/dist/src/JpegUtil.js.map +0 -1
  107. package/dist/src/KnownShortcut.d.ts +0 -1
  108. package/dist/src/KnownShortcut.js +0 -3
  109. package/dist/src/KnownShortcut.js.map +0 -1
  110. package/dist/src/PathHelper.d.ts +0 -6
  111. package/dist/src/PathHelper.js +0 -52
  112. package/dist/src/PathHelper.js.map +0 -1
  113. package/dist/src/ScanCaps.d.ts +0 -7
  114. package/dist/src/ScanCaps.js +0 -17
  115. package/dist/src/ScanCaps.js.map +0 -1
  116. package/dist/src/ScanJobManifest.d.ts +0 -23
  117. package/dist/src/ScanJobManifest.js +0 -24
  118. package/dist/src/ScanJobManifest.js.map +0 -1
  119. package/dist/src/ScanJobSettings.d.ts +0 -8
  120. package/dist/src/ScanJobSettings.js +0 -56
  121. package/dist/src/ScanJobSettings.js.map +0 -1
  122. package/dist/src/ScanStatus.d.ts +0 -19
  123. package/dist/src/ScanStatus.js +0 -35
  124. package/dist/src/ScanStatus.js.map +0 -1
  125. package/dist/src/WalkupScanDestination.d.ts +0 -22
  126. package/dist/src/WalkupScanDestination.js +0 -38
  127. package/dist/src/WalkupScanDestination.js.map +0 -1
  128. package/dist/src/WalkupScanDestinations.d.ts +0 -12
  129. package/dist/src/WalkupScanDestinations.js +0 -30
  130. package/dist/src/WalkupScanDestinations.js.map +0 -1
  131. package/dist/src/WalkupScanManifest.d.ts +0 -23
  132. package/dist/src/WalkupScanManifest.js +0 -25
  133. package/dist/src/WalkupScanManifest.js.map +0 -1
  134. package/dist/src/WalkupScanToCompCaps.d.ts +0 -12
  135. package/dist/src/WalkupScanToCompCaps.js +0 -20
  136. package/dist/src/WalkupScanToCompCaps.js.map +0 -1
  137. package/dist/src/WalkupScanToCompDestination.d.ts +0 -22
  138. package/dist/src/WalkupScanToCompDestination.js +0 -38
  139. package/dist/src/WalkupScanToCompDestination.js.map +0 -1
  140. package/dist/src/WalkupScanToCompDestinations.d.ts +0 -12
  141. package/dist/src/WalkupScanToCompDestinations.js +0 -30
  142. package/dist/src/WalkupScanToCompDestinations.js.map +0 -1
  143. package/dist/src/WalkupScanToCompEvent.d.ts +0 -11
  144. package/dist/src/WalkupScanToCompEvent.js +0 -20
  145. package/dist/src/WalkupScanToCompEvent.js.map +0 -1
  146. package/dist/src/WalkupScanToCompManifest.d.ts +0 -23
  147. package/dist/src/WalkupScanToCompManifest.js +0 -25
  148. package/dist/src/WalkupScanToCompManifest.js.map +0 -1
  149. package/dist/src/delay.d.ts +0 -1
  150. package/dist/src/delay.js +0 -10
  151. package/dist/src/delay.js.map +0 -1
  152. package/dist/test/DiscoveryTree.test.d.ts +0 -1
  153. package/dist/test/DiscoveryTree.test.js +0 -68
  154. package/dist/test/DiscoveryTree.test.js.map +0 -1
  155. package/dist/test/EtagEventTable.test.d.ts +0 -1
  156. package/dist/test/EtagEventTable.test.js +0 -93
  157. package/dist/test/EtagEventTable.test.js.map +0 -1
  158. package/dist/test/Job.test.d.ts +0 -1
  159. package/dist/test/Job.test.js +0 -104
  160. package/dist/test/Job.test.js.map +0 -1
  161. package/dist/test/JpegUtil.test.d.ts +0 -1
  162. package/dist/test/JpegUtil.test.js +0 -51
  163. package/dist/test/JpegUtil.test.js.map +0 -1
  164. package/dist/test/PathHelper.test.d.ts +0 -1
  165. package/dist/test/PathHelper.test.js +0 -99
  166. package/dist/test/PathHelper.test.js.map +0 -1
  167. package/dist/test/ScanJobManifest.test.d.ts +0 -1
  168. package/dist/test/ScanJobManifest.test.js +0 -56
  169. package/dist/test/ScanJobManifest.test.js.map +0 -1
  170. package/dist/test/ScanJobSettings.test.d.ts +0 -1
  171. package/dist/test/ScanJobSettings.test.js +0 -53
  172. package/dist/test/ScanJobSettings.test.js.map +0 -1
  173. package/dist/test/ScanStatus.test.d.ts +0 -1
  174. package/dist/test/ScanStatus.test.js +0 -75
  175. package/dist/test/ScanStatus.test.js.map +0 -1
  176. package/dist/test/WalkupScanDestination.test.d.ts +0 -1
  177. package/dist/test/WalkupScanDestination.test.js +0 -80
  178. package/dist/test/WalkupScanDestination.test.js.map +0 -1
  179. package/dist/test/WalkupScanDestinations.test.d.ts +0 -1
  180. package/dist/test/WalkupScanDestinations.test.js +0 -68
  181. package/dist/test/WalkupScanDestinations.test.js.map +0 -1
  182. package/dist/test/WalkupScanManifest.test.d.ts +0 -1
  183. package/dist/test/WalkupScanManifest.test.js +0 -46
  184. package/dist/test/WalkupScanManifest.test.js.map +0 -1
  185. package/dist/test/WalkupScanToCompCaps.test.d.ts +0 -1
  186. package/dist/test/WalkupScanToCompCaps.test.js +0 -56
  187. package/dist/test/WalkupScanToCompCaps.test.js.map +0 -1
  188. package/dist/test/WalkupScanToCompDestination.test.d.ts +0 -1
  189. package/dist/test/WalkupScanToCompDestination.test.js +0 -58
  190. package/dist/test/WalkupScanToCompDestination.test.js.map +0 -1
  191. package/dist/test/WalkupScanToCompDestinations.test.d.ts +0 -1
  192. package/dist/test/WalkupScanToCompDestinations.test.js +0 -58
  193. package/dist/test/WalkupScanToCompDestinations.test.js.map +0 -1
  194. package/dist/test/WalkupScanToCompEvent.test.d.ts +0 -1
  195. package/dist/test/WalkupScanToCompEvent.test.js +0 -46
  196. package/dist/test/WalkupScanToCompEvent.test.js.map +0 -1
  197. package/dist/test/WalkupScanToCompManifest.test.d.ts +0 -1
  198. package/dist/test/WalkupScanToCompManifest.test.js +0 -46
  199. package/dist/test/WalkupScanToCompManifest.test.js.map +0 -1
  200. package/dist/test/clean.d.ts +0 -1
  201. package/dist/test/clean.js +0 -21
  202. package/dist/test/clean.js.map +0 -1
package/dist/index.js CHANGED
@@ -32,7 +32,7 @@ async function listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval
32
32
  console.log(`Running iteration: ${iteration} - errorCount: ${errorCount}`);
33
33
  try {
34
34
  const event = await (0, listening_1.waitScanEvent)(deviceCapabilities, registrationConfig);
35
- scanCount++;
35
+ scanCount = await PathHelper_1.default.getNextScanNumber(folder, scanCount, scanConfig.directoryConfig.filePattern);
36
36
  console.log(`Scan event captured, saving scan #${scanCount}`);
37
37
  await (0, scanProcessing_1.saveScan)(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig);
38
38
  }
@@ -64,6 +64,7 @@ async function adfAutoscanCmd(adfAutoScanConfig, deviceUpPollingInterval) {
64
64
  console.log(`Target folder: ${folder}`);
65
65
  const tempFolder = await PathHelper_1.default.getOutputFolder(adfAutoScanConfig.directoryConfig.tempDirectory);
66
66
  console.log(`Temp folder: ${tempFolder}`);
67
+ const deviceCapabilities = await (0, readDeviceCapabilities_1.readDeviceCapabilities)();
67
68
  let scanCount = 0;
68
69
  let keepActive = true;
69
70
  let errorCount = 0;
@@ -73,7 +74,7 @@ async function adfAutoscanCmd(adfAutoScanConfig, deviceUpPollingInterval) {
73
74
  await (0, scanProcessing_1.waitAdfLoaded)(adfAutoScanConfig.pollingInterval, adfAutoScanConfig.startScanDelay);
74
75
  scanCount++;
75
76
  console.log(`Scan event captured, saving scan #${scanCount}`);
76
- await (0, scanProcessing_1.scanFromAdf)(scanCount, folder, tempFolder, adfAutoScanConfig);
77
+ await (0, scanProcessing_1.scanFromAdf)(scanCount, folder, tempFolder, adfAutoScanConfig, deviceCapabilities, new Date());
77
78
  }
78
79
  catch (e) {
79
80
  console.log(e);
@@ -132,6 +133,8 @@ function setupScanParameters(command) {
132
133
  command.option("-t, --temp-directory <dir>", "Temp directory used for processing (default: /tmp/scan-to-pc<random>)");
133
134
  command.option("-p, --pattern <pattern>", 'Pattern for filename (i.e. "scan"_dd.mm.yyyy_hh:MM:ss, without this its scanPage<number>)');
134
135
  command.option("-r, --resolution <dpi>", "Resolution in DPI of the scans (default: 200)");
136
+ command.option("-w, --width <width>", "With in pixel of the scans (default: 2481)");
137
+ command.option("-h, --height <height>", "Height in pixel of the scans (default: 3507)");
135
138
  return command;
136
139
  }
137
140
  function setupParameterOpts(command) {
@@ -163,8 +166,22 @@ function getScanConfiguration(parentOption) {
163
166
  tempDirectory: parentOption.tempDirectory || getConfig("tempDirectory"),
164
167
  filePattern: parentOption.pattern || getConfig("pattern"),
165
168
  };
169
+ const configWidth = (parentOption.width ||
170
+ getConfig("width") ||
171
+ 0).toString();
172
+ const width = configWidth.toLowerCase() === "max"
173
+ ? Number.MAX_SAFE_INTEGER
174
+ : parseInt(configWidth, 10);
175
+ const configHeight = (parentOption.width ||
176
+ getConfig("height") ||
177
+ "0").toString();
178
+ const height = configWidth.toLowerCase() === "max"
179
+ ? Number.MAX_SAFE_INTEGER
180
+ : parseInt(configHeight, 10);
166
181
  const scanConfig = {
167
- resolution: parseInt(parentOption.resolution || getConfig("resolution") || 200, 10),
182
+ resolution: parseInt(parentOption.resolution || getConfig("resolution") || "200", 10),
183
+ width: width,
184
+ height: height,
168
185
  directoryConfig,
169
186
  };
170
187
  return scanConfig;
@@ -190,7 +207,7 @@ async function main() {
190
207
  label: options.label || getConfig("label") || os_1.default.hostname(),
191
208
  };
192
209
  const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);
193
- const scanConfig = getScanConfiguration(parentOption);
210
+ const scanConfig = getScanConfiguration(options);
194
211
  await listenCmd(registrationConfig, scanConfig, deviceUpPollingInterval);
195
212
  });
196
213
  commander_1.program.addCommand(cmdListen, { isDefault: true });
@@ -209,13 +226,17 @@ async function main() {
209
226
  const isDebug = getIsDebug(parentOption);
210
227
  HPApi_1.default.setDebug(isDebug);
211
228
  const deviceUpPollingInterval = getDeviceUpPollingInterval(parentOption);
212
- const scanConfig = getScanConfiguration(parentOption);
229
+ const scanConfig = getScanConfiguration(options);
213
230
  const adfScanConfig = {
214
231
  ...scanConfig,
215
232
  isDuplex: options.isDuplex || getConfig("autoscan_duplex") || false,
216
233
  generatePdf: options.pdf || getConfig("autoscan_pdf") || false,
217
- pollingInterval: options.pollingInterval || getConfig("autoscan_pollingInterval") || 1000,
218
- startScanDelay: options.startScanDelay || getConfig("autoscan_startScanDelay") || 5000,
234
+ pollingInterval: options.pollingInterval ||
235
+ getConfig("autoscan_pollingInterval") ||
236
+ 1000,
237
+ startScanDelay: options.startScanDelay ||
238
+ getConfig("autoscan_startScanDelay") ||
239
+ 5000,
219
240
  };
220
241
  await adfAutoscanCmd(adfScanConfig, deviceUpPollingInterval);
221
242
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"]}
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 {\n clearRegistrations,\n RegistrationConfig,\n waitScanEvent,\n} from \"./listening\";\nimport {\n AdfAutoScanConfig,\n DirectoryConfig,\n saveScan,\n ScanConfig,\n scanFromAdf,\n waitAdfLoaded,\n} 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 = await PathHelper.getNextScanNumber(\n folder,\n scanCount,\n scanConfig.directoryConfig.filePattern,\n );\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 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 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(\n scanCount,\n folder,\n tempFolder,\n adfAutoScanConfig,\n deviceCapabilities,\n new Date()\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 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 command.option(\n \"-w, --width <width>\",\n \"With in pixel of the scans (default: 2481)\",\n );\n command.option(\n \"-h, --height <height>\",\n \"Height in pixel of the scans (default: 3507)\",\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 configWidth = (\n parentOption.width ||\n getConfig(\"width\") ||\n 0\n ).toString();\n const width =\n configWidth.toLowerCase() === \"max\"\n ? Number.MAX_SAFE_INTEGER\n : parseInt(configWidth, 10);\n\n const configHeight = (\n parentOption.width ||\n getConfig(\"height\") ||\n \"0\"\n ).toString();\n const height =\n configWidth.toLowerCase() === \"max\"\n ? Number.MAX_SAFE_INTEGER\n : parseInt(configHeight, 10);\n\n const scanConfig: ScanConfig = {\n resolution: parseInt(\n parentOption.resolution || getConfig(\"resolution\") || \"200\",\n 10,\n ),\n width: width,\n height: height,\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\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(options);\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(options);\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 ||\n getConfig(\"autoscan_pollingInterval\") ||\n 1000,\n startScanDelay:\n options.startScanDelay ||\n getConfig(\"autoscan_startScanDelay\") ||\n 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"]}
@@ -1 +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}"]}
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 =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\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}\n"]}
@@ -26,15 +26,20 @@ async function readDeviceCapabilities() {
26
26
  else {
27
27
  console.log("Unknown device!");
28
28
  }
29
+ let scanCaps = null;
29
30
  if (discoveryTree.ScanJobManifestURI != null) {
30
31
  const scanJobManifest = await HPApi_1.default.getScanJobManifest(discoveryTree.ScanJobManifestURI);
31
32
  if (scanJobManifest.ScanCapsURI != null) {
32
- await HPApi_1.default.getScanCaps(scanJobManifest.ScanCapsURI);
33
+ scanCaps = await HPApi_1.default.getScanCaps(scanJobManifest.ScanCapsURI);
33
34
  }
34
35
  }
35
36
  return {
36
37
  supportsMultiItemScanFromPlaten,
37
38
  useWalkupScanToComp: walkupScanToCompCaps != null,
39
+ platenMaxWidth: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.PlatenMaxWidth) || null,
40
+ platenMaxHeight: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.PlatenMaxHeight) || null,
41
+ adfMaxWidth: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.AdfMaxWidth) || null,
42
+ adfMaxHeight: (scanCaps === null || scanCaps === void 0 ? void 0 : scanCaps.AdfMaxHeight) || null,
38
43
  };
39
44
  }
40
45
  exports.readDeviceCapabilities = readDeviceCapabilities;
@@ -1 +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"]}
1
+ {"version":3,"file":"readDeviceCapabilities.js","sourceRoot":"","sources":["../src/readDeviceCapabilities.ts"],"names":[],"mappings":";;;;;;AACA,oDAA4B;AAIrB,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,QAAQ,GAAoB,IAAI,CAAC;IACrC,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,QAAQ,GAAG,MAAM,eAAK,CAAC,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;SACjE;KACF;IAED,OAAO;QACL,+BAA+B;QAC/B,mBAAmB,EAAE,oBAAoB,IAAI,IAAI;QACjD,cAAc,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,cAAc,KAAI,IAAI;QAChD,eAAe,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe,KAAI,IAAI;QAClD,WAAW,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,KAAI,IAAI;QAC1C,YAAY,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,YAAY,KAAI,IAAI;KAC7C,CAAC;AACJ,CAAC;AA9CD,wDA8CC","sourcesContent":["import { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport HPApi from \"./HPApi\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\nimport ScanCaps from \"./ScanCaps\";\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 let scanCaps: ScanCaps | null = null;\n if (discoveryTree.ScanJobManifestURI != null) {\n const scanJobManifest = await HPApi.getScanJobManifest(\n discoveryTree.ScanJobManifestURI,\n );\n if (scanJobManifest.ScanCapsURI != null) {\n scanCaps = await HPApi.getScanCaps(scanJobManifest.ScanCapsURI);\n }\n }\n\n return {\n supportsMultiItemScanFromPlaten,\n useWalkupScanToComp: walkupScanToCompCaps != null,\n platenMaxWidth: scanCaps?.PlatenMaxWidth || null,\n platenMaxHeight: scanCaps?.PlatenMaxHeight || null,\n adfMaxWidth: scanCaps?.AdfMaxWidth || null,\n adfMaxHeight: scanCaps?.AdfMaxHeight || null,\n };\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import Event from "./Event";
2
2
  import { DeviceCapabilities } from "./DeviceCapabilities";
3
+ export declare function getScanWidth(scanConfig: ScanConfig, inputSource: "Adf" | "Platen", deviceCapabilities: DeviceCapabilities): number | null;
4
+ export declare function getScanHeight(scanConfig: ScanConfig, inputSource: "Adf" | "Platen", deviceCapabilities: DeviceCapabilities): number | null;
3
5
  export declare function saveScan(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
4
6
  export type DirectoryConfig = {
5
7
  directory: string | undefined;
@@ -8,6 +10,8 @@ export type DirectoryConfig = {
8
10
  };
9
11
  export type ScanConfig = {
10
12
  resolution: number;
13
+ width: number | null;
14
+ height: number | null;
11
15
  directoryConfig: DirectoryConfig;
12
16
  };
13
17
  export type AdfAutoScanConfig = ScanConfig & {
@@ -16,5 +20,5 @@ export type AdfAutoScanConfig = ScanConfig & {
16
20
  pollingInterval: number;
17
21
  startScanDelay: number;
18
22
  };
19
- export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig): Promise<void>;
23
+ export declare function scanFromAdf(scanCount: number, folder: string, tempFolder: string, adfAutoScanConfig: AdfAutoScanConfig, deviceCapabilities: DeviceCapabilities, date: Date): Promise<void>;
20
24
  export declare function waitAdfLoaded(pollingInterval: number, startScanDelay: number): Promise<void>;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.waitAdfLoaded = exports.scanFromAdf = exports.saveScan = void 0;
6
+ exports.waitAdfLoaded = exports.scanFromAdf = exports.saveScan = exports.getScanHeight = exports.getScanWidth = void 0;
7
7
  const HPApi_1 = __importDefault(require("./HPApi"));
8
8
  const promises_1 = __importDefault(require("fs/promises"));
9
9
  const JpegUtil_1 = __importDefault(require("./JpegUtil"));
@@ -12,6 +12,7 @@ const ScanJobSettings_1 = __importDefault(require("./ScanJobSettings"));
12
12
  const ScanContent_1 = require("./ScanContent");
13
13
  const delay_1 = require("./delay");
14
14
  const PathHelper_1 = __importDefault(require("./PathHelper"));
15
+ const InputSource_1 = require("./InputSource");
15
16
  async function waitDeviceUntilItIsReadyToUploadOrCompleted(jobUrl) {
16
17
  let job = null;
17
18
  let isReadyToUpload = false;
@@ -76,19 +77,19 @@ function createScanPage(job, currentPageNumber, filePath, sizeFixed) {
76
77
  width: (_a = job.imageWidth) !== null && _a !== void 0 ? _a : 0,
77
78
  height: height !== null && height !== void 0 ? height : 0,
78
79
  xResolution: (_b = job.xResolution) !== null && _b !== void 0 ? _b : 200,
79
- yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200
80
+ yResolution: (_c = job.yResolution) !== null && _c !== void 0 ? _c : 200,
80
81
  };
81
82
  }
82
- async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern) {
83
+ async function handleProcessingState(job, inputSource, folder, scanCount, currentPageNumber, filePattern, date) {
83
84
  if (job.pageState == "ReadyToUpload" &&
84
85
  job.binaryURL != null &&
85
86
  job.currentPageNumber != null) {
86
87
  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 destinationFilePath = PathHelper_1.default.getFileForPage(folder, scanCount, currentPageNumber, filePattern, "jpg", date);
88
89
  const filePath = await HPApi_1.default.downloadPage(job.binaryURL, destinationFilePath);
89
90
  console.log("Page downloaded to:", filePath);
90
91
  let sizeFixed = null;
91
- if (inputSource == "Adf") {
92
+ if (inputSource == InputSource_1.InputSource.Adf) {
92
93
  sizeFixed = await scanProcessing(filePath);
93
94
  if (sizeFixed == null) {
94
95
  console.log(`File size has not been fixed, DNF may not have been found and approximate height is: ${job.imageHeight}`);
@@ -102,7 +103,7 @@ async function handleProcessingState(job, inputSource, folder, scanCount, curren
102
103
  return null;
103
104
  }
104
105
  }
105
- async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern) {
106
+ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, date) {
106
107
  const jobUrl = await HPApi_1.default.postJob(scanJobSettings);
107
108
  console.log("New job created:", jobUrl);
108
109
  let job = await HPApi_1.default.getJob(jobUrl);
@@ -112,7 +113,7 @@ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, s
112
113
  continue;
113
114
  }
114
115
  if (job.jobState === "Processing") {
115
- const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern);
116
+ const page = await handleProcessingState(job, inputSource, folder, scanCount, scanJobContent.elements.length + 1, filePattern, date);
116
117
  job = await HPApi_1.default.getJob(jobUrl);
117
118
  if (page != null && job.jobState != "Canceled") {
118
119
  scanJobContent.elements.push(page);
@@ -154,12 +155,12 @@ async function waitScanNewPageRequest(compEventURI) {
154
155
  }
155
156
  return startNewScanJob;
156
157
  }
157
- async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern) {
158
- let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
158
+ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern, date) {
159
+ let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, date);
159
160
  let lastEvent = firstEvent;
160
161
  if (jobState === "Completed" &&
161
162
  lastEvent.compEventURI &&
162
- inputSource !== "Adf" &&
163
+ inputSource !== InputSource_1.InputSource.Adf &&
163
164
  lastEvent.destinationURI &&
164
165
  deviceCapabilities.supportsMultiItemScanFromPlaten) {
165
166
  lastEvent = await (0, listening_1.waitForScanEvent)(lastEvent.destinationURI, lastEvent.agingStamp);
@@ -168,7 +169,7 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
168
169
  }
169
170
  let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);
170
171
  while (startNewScanJob) {
171
- jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
172
+ jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern, new Date());
172
173
  if (jobState !== "Completed") {
173
174
  return;
174
175
  }
@@ -183,9 +184,9 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
183
184
  }
184
185
  }
185
186
  }
186
- async function mergeToPdf(folder, scanCount, scanJobContent, filePattern) {
187
+ async function mergeToPdf(folder, scanCount, scanJobContent, filePattern, date) {
187
188
  if (scanJobContent.elements.length > 0) {
188
- const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf");
189
+ const pdfFilePath = PathHelper_1.default.getFileForScan(folder, scanCount, filePattern, "pdf", date);
189
190
  await (0, ScanContent_1.createPdfFrom)(scanJobContent, pdfFilePath);
190
191
  scanJobContent.elements.forEach((e) => promises_1.default.unlink(e.path));
191
192
  return pdfFilePath;
@@ -219,6 +220,40 @@ function isPdf(destination) {
219
220
  return false;
220
221
  }
221
222
  }
223
+ function getScanWidth(scanConfig, inputSource, deviceCapabilities) {
224
+ if (scanConfig.width && scanConfig.width > 0) {
225
+ const maxWidth = inputSource === "Adf"
226
+ ? deviceCapabilities.adfMaxWidth
227
+ : deviceCapabilities.platenMaxWidth;
228
+ if (maxWidth && scanConfig.width > maxWidth) {
229
+ return maxWidth;
230
+ }
231
+ else {
232
+ return scanConfig.width;
233
+ }
234
+ }
235
+ else {
236
+ return null;
237
+ }
238
+ }
239
+ exports.getScanWidth = getScanWidth;
240
+ function getScanHeight(scanConfig, inputSource, deviceCapabilities) {
241
+ if (scanConfig.height && scanConfig.height > 0) {
242
+ const maxHeight = inputSource === "Adf"
243
+ ? deviceCapabilities.adfMaxHeight
244
+ : deviceCapabilities.platenMaxHeight;
245
+ if (maxHeight && scanConfig.height > maxHeight) {
246
+ return maxHeight;
247
+ }
248
+ else {
249
+ return scanConfig.height;
250
+ }
251
+ }
252
+ else {
253
+ return null;
254
+ }
255
+ }
256
+ exports.getScanHeight = getScanHeight;
222
257
  async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities, scanConfig) {
223
258
  if (event.compEventURI) {
224
259
  const proceedToScan = await (0, listening_1.waitScanRequest)(event.compEventURI);
@@ -251,12 +286,15 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
251
286
  const scanStatus = await HPApi_1.default.getScanStatus();
252
287
  console.log("Afd is : " + scanStatus.adfState);
253
288
  const inputSource = scanStatus.getInputSource();
254
- const scanJobSettings = new ScanJobSettings_1.default(inputSource, contentType, scanConfig.resolution, isDuplex);
289
+ const scanWidth = getScanWidth(scanConfig, inputSource, deviceCapabilities);
290
+ const scanHeight = getScanHeight(scanConfig, inputSource, deviceCapabilities);
291
+ const scanJobSettings = new ScanJobSettings_1.default(inputSource, contentType, scanConfig.resolution, scanWidth, scanHeight, isDuplex);
255
292
  const scanJobContent = { elements: [] };
256
- await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern);
293
+ const scanDate = new Date();
294
+ await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern, scanDate);
257
295
  console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
258
296
  if (toPdf) {
259
- const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern);
297
+ const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern, scanDate);
260
298
  displayPdfScan(pdfFilePath, scanJobContent);
261
299
  }
262
300
  else {
@@ -264,7 +302,7 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
264
302
  }
265
303
  }
266
304
  exports.saveScan = saveScan;
267
- async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig) {
305
+ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig, deviceCapabilities, date) {
268
306
  let destinationFolder;
269
307
  let contentType;
270
308
  if (adfAutoScanConfig.generatePdf) {
@@ -276,12 +314,14 @@ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig) {
276
314
  contentType = "Photo";
277
315
  destinationFolder = folder;
278
316
  }
279
- const scanJobSettings = new ScanJobSettings_1.default("Adf", contentType, adfAutoScanConfig.resolution, adfAutoScanConfig.isDuplex);
317
+ const scanWidth = getScanWidth(adfAutoScanConfig, "Adf", deviceCapabilities);
318
+ const scanHeight = getScanHeight(adfAutoScanConfig, "Adf", deviceCapabilities);
319
+ const scanJobSettings = new ScanJobSettings_1.default(InputSource_1.InputSource.Adf, contentType, adfAutoScanConfig.resolution, scanWidth, scanHeight, adfAutoScanConfig.isDuplex);
280
320
  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}:`);
321
+ await executeScanJob(scanJobSettings, InputSource_1.InputSource.Adf, destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
322
+ console.log(`Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`);
283
323
  if (adfAutoScanConfig.generatePdf) {
284
- const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
324
+ const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
285
325
  displayPdfScan(pdfFilePath, scanJobContent);
286
326
  }
287
327
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"scanProcessing.js","sourceRoot":"","sources":["../src/scanProcessing.ts"],"names":[],"mappings":";;;;;;AAGA,oDAA4B;AAC5B,2DAA6B;AAC7B,0DAAkC;AAElC,2CAAgE;AAChE,wEAAgD;AAChD,+CAAqE;AAErE,mCAAgC;AAChC,8DAAsC;AAGtC,KAAK,UAAU,2CAA2C,CACxD,MAAc;IAEd,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,GAAG;QACD,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE;YAC/B,OAAO,GAAG,CAAC;SACZ;aAAM,IACL,GAAG,CAAC,SAAS,KAAK,eAAe;YACjC,GAAG,CAAC,QAAQ,KAAK,WAAW,EAC5B;YACA,eAAe,GAAG,IAAI,CAAC;SACxB;aAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,YAAY,EAAE;YACvC,eAAe,GAAG,KAAK,CAAC;SACzB;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;SAClD;QACD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;KAClB,QAAQ,CAAC,eAAe,EAAE;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAY;IAEZ,oGAAoG;IACpG,wEAAwE;IACxE,IAAI,WAAW,GACb,IAAI,CAAC;IAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,cAAc,EAAE;YAClB,WAAW,GAAG,MAAM,eAAK,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YAEzD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;YACtC,IAAI,QAAQ,IAAI,IAAI,EAAE;gBACpB,OAAO,WAAW,CAAC;aACpB;SACF;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;SACzC;QAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACrE;IAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,MAAM,GAAW,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEnD,IAAI,MAAM,GAAG,kBAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,IAAI,EAAE;QAClB,yBAAyB;QACzB,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC;KACf;IACD,OAAO,IAAI,CAAC;AACd,CAAC;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,MAAA,GAAG,CAAC,UAAU,mCAAI,CAAC;QAC1B,MAAM,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,CAAC;QACnB,WAAW,EAAE,MAAA,GAAG,CAAC,WAAW,mCAAI,GAAG;QACnC,WAAW,EAAE,MAAA,GAAG,CAAC,WAAW,mCAAI,GAAG;KACpC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAAQ,EACR,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,iBAAyB,EACzB,WAA+B;IAE/B,IACE,GAAG,CAAC,SAAS,IAAI,eAAe;QAChC,GAAG,CAAC,SAAS,IAAI,IAAI;QACrB,GAAG,CAAC,iBAAiB,IAAI,IAAI,EAC7B;QACA,OAAO,CAAC,GAAG,CACT,mCAAmC,GAAG,CAAC,iBAAiB,MAAM,EAC9D,GAAG,CAAC,SAAS,CACd,CAAC;QAEF,MAAM,mBAAmB,GAAG,oBAAU,CAAC,cAAc,CACnD,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,KAAK,CACN,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,YAAY,CACvC,GAAG,CAAC,SAAS,EACb,mBAAmB,CACpB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAE7C,IAAI,SAAS,GAAkB,IAAI,CAAC;QACpC,IAAI,WAAW,IAAI,KAAK,EAAE;YACxB,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,SAAS,IAAI,IAAI,EAAE;gBACrB,OAAO,CAAC,GAAG,CACT,wFAAwF,GAAG,CAAC,WAAW,EAAE,CAC1G,CAAC;aACH;SACF;QACD,OAAO,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KACpE;SAAM;QACL,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,eAAgC,EAChC,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,WAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,eAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE;QACnC,GAAG,GAAG,MAAM,2CAA2C,CAAC,MAAM,CAAC,CAAC;QAEhE,IAAI,GAAG,CAAC,QAAQ,IAAI,WAAW,EAAE;YAC/B,SAAS;SACV;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CACtC,GAAG,EACH,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAClC,WAAW,CACZ,CAAC;YACF,GAAG,GAAG,MAAM,eAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC,QAAQ,IAAI,UAAU,EAAE;gBAC9C,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACpC;SACF;aAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU,EAAE;YACtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;YACvC,MAAM;SACP;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnD,MAAM,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;SAClB;KACF;IACD,OAAO,CAAC,GAAG,CACT,cAAc,GAAG,CAAC,QAAQ,iBAAiB,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC7E,CAAC;IACF,OAAO,GAAG,CAAC,QAAQ,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,YAAoB;IACxD,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,EAAE;QACX,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAEpE,IAAI,qBAAqB,GAAG,MAAM,eAAK,CAAC,wBAAwB,CAC9D,YAAY,CACb,CAAC;QACF,IAAI,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC;QAE9C,IAAI,OAAO,KAAK,sBAAsB,EAAE;YACtC,eAAe,GAAG,IAAI,CAAC;YACvB,IAAI,GAAG,KAAK,CAAC;SACd;aAAM,IAAI,OAAO,KAAK,mBAAmB,EAAE;YAC1C,IAAI,GAAG,KAAK,CAAC;SACd;aAAM,IAAI,OAAO,KAAK,eAAe,EAAE;YACtC,mBAAmB;SACpB;aAAM;YACL,IAAI,GAAG,KAAK,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;SAC9C;KACF;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,eAAgC,EAChC,WAA6B,EAC7B,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,UAAiB,EACjB,kBAAsC,EACtC,WAA+B;IAE/B,IAAI,QAAQ,GAAG,MAAM,cAAc,CACjC,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,EACd,WAAW,CACZ,CAAC;IACF,IAAI,SAAS,GAAG,UAAU,CAAC;IAC3B,IACE,QAAQ,KAAK,WAAW;QACxB,SAAS,CAAC,YAAY;QACtB,WAAW,KAAK,KAAK;QACrB,SAAS,CAAC,cAAc;QACxB,kBAAkB,CAAC,+BAA+B,EAClD;QACA,SAAS,GAAG,MAAM,IAAA,4BAAgB,EAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;YAC3B,OAAO;SACR;QACD,IAAI,eAAe,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC3E,OAAO,eAAe,EAAE;YACtB,QAAQ,GAAG,MAAM,cAAc,CAC7B,eAAe,EACf,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAc,EACd,WAAW,CACZ,CAAC;YACF,IAAI,QAAQ,KAAK,WAAW,EAAE;gBAC5B,OAAO;aACR;YACD,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;gBAC7B,MAAM;aACP;YACD,SAAS,GAAG,MAAM,IAAA,4BAAgB,EAChC,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,UAAU,CACrB,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;gBAC3B,OAAO;aACR;YACD,eAAe,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;SACxE;KACF;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,SAAiB,EACjB,cAA2B,EAC3B,WAA+B;IAE/B,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;QACtC,MAAM,WAAW,GAAG,oBAAU,CAAC,cAAc,CAC3C,MAAM,EACN,SAAS,EACT,WAAW,EACX,KAAK,CACN,CAAC;QACF,MAAM,IAAA,2BAAa,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACjD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC;KACpB;IACD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACrB,WAA0B,EAC1B,cAA2B;IAE3B,IAAI,WAAW,KAAK,IAAI,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;KACR;IACD,OAAO,CAAC,GAAG,CACT,oDAAoD,WAAW,KAAK,CACrE,CAAC;IACF,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,EAAE,CACH,CACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,cAA2B;IAClD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACpC,OAAO,CAAC,GAAG,CACT,YAAY,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAC/D,CAAC,CAAC,MACJ,MAAM,CAAC,CAAC,IAAI,EAAE,CACf,CACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CACZ,WAAgE;IAEhE,IACE,WAAW,CAAC,QAAQ,KAAK,SAAS;QAClC,WAAW,CAAC,QAAQ,KAAK,UAAU;QACnC,WAAW,CAAC,QAAQ,IAAI,eAAe,EACvC;QACA,OAAO,IAAI,CAAC;KACb;SAAM,IACL,WAAW,CAAC,QAAQ,KAAK,UAAU;QACnC,WAAW,CAAC,QAAQ,KAAK,YAAY,EACrC;QACA,OAAO,KAAK,CAAC;KACd;SAAM;QACL,OAAO,CAAC,GAAG,CACT,iCAAiC,WAAW,CAAC,QAAQ,qCAAqC,CAC3F,CAAC;QACF,OAAO,KAAK,CAAC;KACd;AACH,CAAC;AAEM,KAAK,UAAU,QAAQ,CAC5B,KAAY,EACZ,MAAc,EACd,UAAkB,EAClB,SAAiB,EACjB,kBAAsC,EACtC,UAAsB;IAEtB,IAAI,KAAK,CAAC,YAAY,EAAE;QACtB,MAAM,aAAa,GAAG,MAAM,IAAA,2BAAe,EAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,EAAE;YAClB,OAAO;SACR;KACF;IAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO;KACR;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE1D,IAAI,KAAc,CAAC;IACnB,IAAI,iBAAyB,CAAC;IAC9B,IAAI,WAAiC,CAAC;IACtC,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE;QACtB,KAAK,GAAG,IAAI,CAAC;QACb,WAAW,GAAG,UAAU,CAAC;QACzB,iBAAiB,GAAG,UAAU,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,wCAAwC,iBAAiB,qDAAqD,CAC/G,CAAC;KACH;SAAM;QACL,KAAK,GAAG,KAAK,CAAC;QACd,WAAW,GAAG,OAAO,CAAC;QACtB,iBAAiB,GAAG,MAAM,CAAC;KAC5B;IAED,MAAM,QAAQ,GACZ,WAAW,CAAC,YAAY,IAAI,IAAI,IAAI,WAAW,CAAC,YAAY,IAAI,SAAS,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE7D,MAAM,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;IAEhD,MAAM,eAAe,GAAG,IAAI,yBAAe,CACzC,WAAW,EACX,WAAW,EACX,UAAU,CAAC,UAAU,EACrB,QAAQ,CACT,CAAC;IAEF,MAAM,cAAc,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,eAAe,CACnB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,KAAK,EACL,kBAAkB,EAClB,UAAU,CAAC,eAAe,CAAC,WAAW,CACvC,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,yCAAyC,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC3E,CAAC;IAEF,IAAI,KAAK,EAAE;QACT,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,MAAM,EACN,SAAS,EACT,cAAc,EACd,UAAU,CAAC,eAAe,CAAC,WAAW,CACvC,CAAC;QACF,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;KAC7C;SAAM;QACL,eAAe,CAAC,cAAc,CAAC,CAAC;KACjC;AACH,CAAC;AAlFD,4BAkFC;AAkBM,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,MAAc,EACd,UAAkB,EAClB,iBAAoC;IAEpC,IAAI,iBAAyB,CAAC;IAC9B,IAAI,WAAiC,CAAC;IACtC,IAAI,iBAAiB,CAAC,WAAW,EAAE;QACjC,WAAW,GAAG,UAAU,CAAC;QACzB,iBAAiB,GAAG,UAAU,CAAC;QAC/B,OAAO,CAAC,GAAG,CACT,wCAAwC,iBAAiB,qDAAqD,CAC/G,CAAC;KACH;SAAM;QACL,WAAW,GAAG,OAAO,CAAC;QACtB,iBAAiB,GAAG,MAAM,CAAC;KAC5B;IAED,MAAM,eAAe,GAAG,IAAI,yBAAe,CACzC,KAAK,EACL,WAAW,EACX,iBAAiB,CAAC,UAAU,EAC5B,iBAAiB,CAAC,QAAQ,CAC3B,CAAC;IAEF,MAAM,cAAc,GAAgB,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAErD,MAAM,cAAc,CAClB,eAAe,EACf,KAAK,EACL,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAC9C,CAAC;IAEF,OAAO,CAAC,GAAG,CACT,yCAAyC,cAAc,CAAC,QAAQ,CAAC,MAAM,GAAG,CAC3E,CAAC;IAEF,IAAI,iBAAiB,CAAC,WAAW,EAAE;QACjC,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,MAAM,EACN,SAAS,EACT,cAAc,EACd,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAC9C,CAAC;QACF,cAAc,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;KAC7C;SAAM;QACL,eAAe,CAAC,cAAc,CAAC,CAAC;KACjC;AACH,CAAC;AApDD,kCAoDC;AAEM,KAAK,UAAU,aAAa,CAAC,eAAuB,EAAE,cAAsB;IACjF,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO,CAAC,KAAK,EAAE;QACb,IAAI,UAAU,GAAe,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;QACzD,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,IAAA,aAAK,EAAC,eAAe,CAAC,CAAC;YAC7B,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;SAC1C;QACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEjC,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,oBAAoB,GAAG,GAAG,CAAC;QACjC,OAAO,MAAM,IAAI,OAAO,GAAG,cAAc,EAAE;YACzC,MAAM,IAAA,aAAK,EAAC,oBAAoB,CAAC,CAAC;YAClC,UAAU,GAAG,MAAM,eAAK,CAAC,aAAa,EAAE,CAAC;YACzC,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,IAAI,oBAAoB,CAAC;SACjC;QAED,IAAI,MAAM,IAAI,OAAO,IAAI,cAAc,EAAE;YACvC,KAAK,GAAG,IAAI,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;SAC7C;aAAM;YACL,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;SACnD;KACF;AACH,CAAC;AA3BD,sCA2BC","sourcesContent":["import Event from \"./Event\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport HPApi from \"./HPApi\";\nimport fs from \"fs/promises\";\nimport JpegUtil from \"./JpegUtil\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport { waitForScanEvent, waitScanRequest } from \"./listening\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport { createPdfFrom, ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\n\nasync function waitDeviceUntilItIsReadyToUploadOrCompleted(\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 TryGetDestination(\n event: Event\n): Promise<WalkupScanDestination | WalkupScanToCompDestination | null> {\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 != null) {\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 scanProcessing(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 ?? 0,\n height: height ?? 0,\n xResolution: job.xResolution ?? 200,\n yResolution: job.yResolution ?? 200\n };\n}\n\nasync function handleProcessingState(\n job: Job,\n inputSource: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern: string | undefined\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 filePattern,\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 scanProcessing(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 executeScanJob(\n scanJobSettings: ScanJobSettings,\n inputSource: \"Adf\" | \"Platen\",\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined\n): Promise<\"Completed\" | \"Canceled\"> {\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 waitDeviceUntilItIsReadyToUploadOrCompleted(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 filePattern\n );\n job = await HPApi.getJob(jobUrl);\n if (page != null && job.jobState != \"Canceled\") {\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: ${scanJobContent.elements.length}:`\n );\n return job.jobState;\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 deviceCapabilities: DeviceCapabilities,\n filePattern: string | undefined\n) {\n let jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern\n );\n let lastEvent = firstEvent;\n if (\n jobState === \"Completed\" &&\n lastEvent.compEventURI &&\n inputSource !== \"Adf\" &&\n lastEvent.destinationURI &&\n deviceCapabilities.supportsMultiItemScanFromPlaten\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 jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern\n );\n if (jobState !== \"Completed\") {\n return;\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(\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined\n): Promise<string | null> {\n if (scanJobContent.elements.length > 0) {\n const pdfFilePath = PathHelper.getFileForScan(\n folder,\n scanCount,\n filePattern,\n \"pdf\"\n );\n await createPdfFrom(scanJobContent, pdfFilePath);\n scanJobContent.elements.forEach((e) => fs.unlink(e.path));\n return pdfFilePath;\n }\n console.log(`No page available to build a pdf file`);\n return null;\n}\n\nfunction displayPdfScan(\n pdfFilePath: string | null,\n scanJobContent: ScanContent\n) {\n if (pdfFilePath === null) {\n console.log(`Pdf generated has not been generated`);\n return;\n }\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\nfunction isPdf(\n destination: WalkupScanDestination | WalkupScanToCompDestination\n) {\n if (\n destination.shortcut === \"SavePDF\" ||\n destination.shortcut === \"EmailPDF\" ||\n destination.shortcut == \"SaveDocument1\"\n ) {\n return true;\n } else if (\n destination.shortcut === \"SaveJPEG\" ||\n destination.shortcut === \"SavePhoto1\"\n ) {\n return false;\n } else {\n console.log(\n `Unexpected shortcut received: ${destination.shortcut}, considering it as non pdf target!`\n );\n return false;\n }\n}\n\nexport async function saveScan(\n event: Event,\n folder: string,\n tempFolder: string,\n scanCount: number,\n deviceCapabilities: DeviceCapabilities,\n scanConfig: ScanConfig\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 let toPdf: boolean;\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (isPdf(destination)) {\n toPdf = true;\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`\n );\n } else {\n toPdf = false;\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const isDuplex =\n destination.scanPlexMode != null && destination.scanPlexMode != \"Simplex\";\n console.log(\"ScanPlexMode is : \" + destination.scanPlexMode);\n\n const scanStatus = await HPApi.getScanStatus();\n console.log(\"Afd is : \" + scanStatus.adfState);\n\n const inputSource = scanStatus.getInputSource();\n\n const scanJobSettings = new ScanJobSettings(\n inputSource,\n contentType,\n scanConfig.resolution,\n isDuplex\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJobs(\n scanJobSettings,\n inputSource,\n destinationFolder,\n scanCount,\n scanJobContent,\n event,\n deviceCapabilities,\n scanConfig.directoryConfig.filePattern\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(\n folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\nexport type ScanConfig = {\n resolution: number;\n directoryConfig: DirectoryConfig;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport async function scanFromAdf(\n scanCount: number,\n folder: string,\n tempFolder: string,\n adfAutoScanConfig: AdfAutoScanConfig\n) {\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (adfAutoScanConfig.generatePdf) {\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`\n );\n } else {\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const scanJobSettings = new ScanJobSettings(\n \"Adf\",\n contentType,\n adfAutoScanConfig.resolution,\n adfAutoScanConfig.isDuplex\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJob(\n scanJobSettings,\n \"Adf\",\n destinationFolder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern\n );\n\n console.log(\n `Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`\n );\n\n if (adfAutoScanConfig.generatePdf) {\n const pdfFilePath = await mergeToPdf(\n folder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport async function waitAdfLoaded(pollingInterval: number, startScanDelay: number) {\n let ready = false;\n while (!ready) {\n let scanStatus: ScanStatus = await HPApi.getScanStatus();\n while (!scanStatus.isLoaded()) {\n await delay(pollingInterval);\n scanStatus = await HPApi.getScanStatus();\n }\n console.log(`ADF load detected`);\n\n let loaded = true;\n let counter = 0;\n const shortPollingInterval = 500;\n while (loaded && counter < startScanDelay) {\n await delay(shortPollingInterval);\n scanStatus = await HPApi.getScanStatus();\n loaded = scanStatus.isLoaded();\n counter += shortPollingInterval;\n }\n\n if (loaded && counter >= startScanDelay) {\n ready = true;\n console.log(`ADF still loaded, proceeding`);\n } else {\n console.log(`ADF not loaded anymore, waiting...`);\n }\n }\n}"]}
1
+ {"version":3,"file":"scanProcessing.js","sourceRoot":"","sources":["../src/scanProcessing.ts"],"names":[],"mappings":"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","sourcesContent":["import Event from \"./Event\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport HPApi from \"./HPApi\";\nimport fs from \"fs/promises\";\nimport JpegUtil from \"./JpegUtil\";\nimport { DeviceCapabilities } from \"./DeviceCapabilities\";\nimport { waitForScanEvent, waitScanRequest } from \"./listening\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport { createPdfFrom, ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\nimport { InputSource } from \"./InputSource\";\n\nasync function waitDeviceUntilItIsReadyToUploadOrCompleted(\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 TryGetDestination(\n event: Event,\n): Promise<WalkupScanDestination | WalkupScanToCompDestination | null> {\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 != null) {\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 scanProcessing(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 ?? 0,\n height: height ?? 0,\n xResolution: job.xResolution ?? 200,\n yResolution: job.yResolution ?? 200,\n };\n}\n\nasync function handleProcessingState(\n job: Job,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n currentPageNumber: number,\n filePattern: string | undefined,\n date: Date,\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 filePattern,\n \"jpg\",\n date,\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 == InputSource.Adf) {\n sizeFixed = await scanProcessing(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 executeScanJob(\n scanJobSettings: ScanJobSettings,\n inputSource: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n date: Date,\n): Promise<\"Completed\" | \"Canceled\"> {\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 waitDeviceUntilItIsReadyToUploadOrCompleted(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 filePattern,\n date,\n );\n job = await HPApi.getJob(jobUrl);\n if (page != null && job.jobState != \"Canceled\") {\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: ${scanJobContent.elements.length}:`,\n );\n return job.jobState;\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 =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\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: InputSource,\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n firstEvent: Event,\n deviceCapabilities: DeviceCapabilities,\n filePattern: string | undefined,\n date: Date,\n) {\n let jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n date,\n );\n let lastEvent = firstEvent;\n if (\n jobState === \"Completed\" &&\n lastEvent.compEventURI &&\n inputSource !== InputSource.Adf &&\n lastEvent.destinationURI &&\n deviceCapabilities.supportsMultiItemScanFromPlaten\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 jobState = await executeScanJob(\n scanJobSettings,\n inputSource,\n folder,\n scanCount,\n scanJobContent,\n filePattern,\n new Date(),\n );\n if (jobState !== \"Completed\") {\n return;\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(\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n filePattern: string | undefined,\n date: Date,\n): Promise<string | null> {\n if (scanJobContent.elements.length > 0) {\n const pdfFilePath: string = PathHelper.getFileForScan(\n folder,\n scanCount,\n filePattern,\n \"pdf\",\n date,\n );\n await createPdfFrom(scanJobContent, pdfFilePath);\n scanJobContent.elements.forEach((e) => fs.unlink(e.path));\n return pdfFilePath;\n }\n console.log(`No page available to build a pdf file`);\n return null;\n}\n\nfunction displayPdfScan(\n pdfFilePath: string | null,\n scanJobContent: ScanContent,\n) {\n if (pdfFilePath === null) {\n console.log(`Pdf generated has not been generated`);\n return;\n }\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\nfunction isPdf(\n destination: WalkupScanDestination | WalkupScanToCompDestination,\n) {\n if (\n destination.shortcut === \"SavePDF\" ||\n destination.shortcut === \"EmailPDF\" ||\n destination.shortcut == \"SaveDocument1\"\n ) {\n return true;\n } else if (\n destination.shortcut === \"SaveJPEG\" ||\n destination.shortcut === \"SavePhoto1\"\n ) {\n return false;\n } else {\n console.log(\n `Unexpected shortcut received: ${destination.shortcut}, considering it as non pdf target!`,\n );\n return false;\n }\n}\n\nexport function getScanWidth(\n scanConfig: ScanConfig,\n inputSource: \"Adf\" | \"Platen\",\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n inputSource === \"Adf\"\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n\n if (maxWidth && scanConfig.width > maxWidth) {\n return maxWidth;\n } else {\n return scanConfig.width;\n }\n } else {\n return null;\n }\n}\n\nexport function getScanHeight(\n scanConfig: ScanConfig,\n inputSource: \"Adf\" | \"Platen\",\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n inputSource === \"Adf\"\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n\n if (maxHeight && scanConfig.height > maxHeight) {\n return maxHeight;\n } else {\n return scanConfig.height;\n }\n } else {\n return null;\n }\n}\n\nexport async function saveScan(\n event: Event,\n folder: string,\n tempFolder: string,\n scanCount: number,\n deviceCapabilities: DeviceCapabilities,\n scanConfig: ScanConfig,\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 let toPdf: boolean;\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (isPdf(destination)) {\n toPdf = true;\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n toPdf = false;\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const isDuplex =\n destination.scanPlexMode != null && destination.scanPlexMode != \"Simplex\";\n console.log(\"ScanPlexMode is : \" + destination.scanPlexMode);\n\n const scanStatus = await HPApi.getScanStatus();\n console.log(\"Afd is : \" + scanStatus.adfState);\n\n const inputSource = scanStatus.getInputSource();\n const scanWidth = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n const scanHeight = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n\n const scanJobSettings = new ScanJobSettings(\n inputSource,\n contentType,\n scanConfig.resolution,\n scanWidth,\n scanHeight,\n isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n const scanDate = new Date();\n\n await executeScanJobs(\n scanJobSettings,\n inputSource,\n destinationFolder,\n scanCount,\n scanJobContent,\n event,\n deviceCapabilities,\n scanConfig.directoryConfig.filePattern,\n scanDate,\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(\n folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern,\n scanDate,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\nexport type ScanConfig = {\n resolution: number;\n width: number | null;\n height: number | null;\n directoryConfig: DirectoryConfig;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport async function scanFromAdf(\n scanCount: number,\n folder: string,\n tempFolder: string,\n adfAutoScanConfig: AdfAutoScanConfig,\n deviceCapabilities: DeviceCapabilities,\n date: Date,\n) {\n let destinationFolder: string;\n let contentType: \"Document\" | \"Photo\";\n if (adfAutoScanConfig.generatePdf) {\n contentType = \"Document\";\n destinationFolder = tempFolder;\n console.log(\n `Scan will be converted to pdf, using ${destinationFolder} as temp scan output directory for individual pages`,\n );\n } else {\n contentType = \"Photo\";\n destinationFolder = folder;\n }\n\n const scanWidth = getScanWidth(adfAutoScanConfig, \"Adf\", deviceCapabilities);\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n \"Adf\",\n deviceCapabilities,\n );\n\n const scanJobSettings = new ScanJobSettings(\n InputSource.Adf,\n contentType,\n adfAutoScanConfig.resolution,\n scanWidth,\n scanHeight,\n adfAutoScanConfig.isDuplex,\n );\n\n const scanJobContent: ScanContent = { elements: [] };\n\n await executeScanJob(\n scanJobSettings,\n InputSource.Adf,\n destinationFolder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern,\n date,\n );\n\n console.log(\n `Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`,\n );\n\n if (adfAutoScanConfig.generatePdf) {\n const pdfFilePath = await mergeToPdf(\n folder,\n scanCount,\n scanJobContent,\n adfAutoScanConfig.directoryConfig.filePattern,\n date,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n } else {\n displayJpegScan(scanJobContent);\n }\n}\n\nexport async function waitAdfLoaded(\n pollingInterval: number,\n startScanDelay: number,\n) {\n let ready = false;\n while (!ready) {\n let scanStatus: ScanStatus = await HPApi.getScanStatus();\n while (!scanStatus.isLoaded()) {\n await delay(pollingInterval);\n scanStatus = await HPApi.getScanStatus();\n }\n console.log(`ADF load detected`);\n\n let loaded = true;\n let counter = 0;\n const shortPollingInterval = 500;\n while (loaded && counter < startScanDelay) {\n await delay(shortPollingInterval);\n scanStatus = await HPApi.getScanStatus();\n loaded = scanStatus.isLoaded();\n counter += shortPollingInterval;\n }\n\n if (loaded && counter >= startScanDelay) {\n ready = true;\n console.log(`ADF still loaded, proceeding`);\n } else {\n console.log(`ADF not loaded anymore, waiting...`);\n }\n }\n}\n"]}