node-hp-scan-to 1.4.1 → 1.4.2
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.
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 {\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
|
+
{"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"]}
|
package/dist/scanProcessing.js
CHANGED
|
@@ -103,7 +103,7 @@ async function handleProcessingState(job, inputSource, folder, scanCount, curren
|
|
|
103
103
|
return null;
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
|
-
async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern
|
|
106
|
+
async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern) {
|
|
107
107
|
const jobUrl = await HPApi_1.default.postJob(scanJobSettings);
|
|
108
108
|
console.log("New job created:", jobUrl);
|
|
109
109
|
let job = await HPApi_1.default.getJob(jobUrl);
|
|
@@ -113,7 +113,7 @@ async function executeScanJob(scanJobSettings, inputSource, folder, scanCount, s
|
|
|
113
113
|
continue;
|
|
114
114
|
}
|
|
115
115
|
if (job.jobState === "Processing") {
|
|
116
|
-
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, new Date());
|
|
117
117
|
job = await HPApi_1.default.getJob(jobUrl);
|
|
118
118
|
if (page != null && job.jobState != "Canceled") {
|
|
119
119
|
scanJobContent.elements.push(page);
|
|
@@ -155,8 +155,8 @@ async function waitScanNewPageRequest(compEventURI) {
|
|
|
155
155
|
}
|
|
156
156
|
return startNewScanJob;
|
|
157
157
|
}
|
|
158
|
-
async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern
|
|
159
|
-
let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern
|
|
158
|
+
async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount, scanJobContent, firstEvent, deviceCapabilities, filePattern) {
|
|
159
|
+
let jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
|
|
160
160
|
let lastEvent = firstEvent;
|
|
161
161
|
if (jobState === "Completed" &&
|
|
162
162
|
lastEvent.compEventURI &&
|
|
@@ -169,7 +169,7 @@ async function executeScanJobs(scanJobSettings, inputSource, folder, scanCount,
|
|
|
169
169
|
}
|
|
170
170
|
let startNewScanJob = await waitScanNewPageRequest(lastEvent.compEventURI);
|
|
171
171
|
while (startNewScanJob) {
|
|
172
|
-
jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern
|
|
172
|
+
jobState = await executeScanJob(scanJobSettings, inputSource, folder, scanCount, scanJobContent, filePattern);
|
|
173
173
|
if (jobState !== "Completed") {
|
|
174
174
|
return;
|
|
175
175
|
}
|
|
@@ -291,7 +291,7 @@ async function saveScan(event, folder, tempFolder, scanCount, deviceCapabilities
|
|
|
291
291
|
const scanJobSettings = new ScanJobSettings_1.default(inputSource, contentType, scanConfig.resolution, scanWidth, scanHeight, isDuplex);
|
|
292
292
|
const scanJobContent = { elements: [] };
|
|
293
293
|
const scanDate = new Date();
|
|
294
|
-
await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern
|
|
294
|
+
await executeScanJobs(scanJobSettings, inputSource, destinationFolder, scanCount, scanJobContent, event, deviceCapabilities, scanConfig.directoryConfig.filePattern);
|
|
295
295
|
console.log(`Scan of page(s) completed totalPages: ${scanJobContent.elements.length}:`);
|
|
296
296
|
if (toPdf) {
|
|
297
297
|
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, scanConfig.directoryConfig.filePattern, scanDate);
|
|
@@ -318,7 +318,7 @@ async function scanFromAdf(scanCount, folder, tempFolder, adfAutoScanConfig, dev
|
|
|
318
318
|
const scanHeight = getScanHeight(adfAutoScanConfig, InputSource_1.InputSource.Adf, deviceCapabilities);
|
|
319
319
|
const scanJobSettings = new ScanJobSettings_1.default(InputSource_1.InputSource.Adf, contentType, adfAutoScanConfig.resolution, scanWidth, scanHeight, adfAutoScanConfig.isDuplex);
|
|
320
320
|
const scanJobContent = { elements: [] };
|
|
321
|
-
await executeScanJob(scanJobSettings, InputSource_1.InputSource.Adf, destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern
|
|
321
|
+
await executeScanJob(scanJobSettings, InputSource_1.InputSource.Adf, destinationFolder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern);
|
|
322
322
|
console.log(`Scan of page(s) completed, total pages: ${scanJobContent.elements.length}:`);
|
|
323
323
|
if (adfAutoScanConfig.generatePdf) {
|
|
324
324
|
const pdfFilePath = await mergeToPdf(folder, scanCount, scanJobContent, adfAutoScanConfig.directoryConfig.filePattern, date);
|
|
@@ -1 +1 @@
|
|
|
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: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n inputSource === 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: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n inputSource === 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, InputSource.Adf, deviceCapabilities);\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n InputSource.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"]}
|
|
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): 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 new 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) {\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 !== 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 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: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.width && scanConfig.width > 0) {\n const maxWidth =\n inputSource === 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: InputSource,\n deviceCapabilities: DeviceCapabilities,\n) {\n if (scanConfig.height && scanConfig.height > 0) {\n const maxHeight =\n inputSource === 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 );\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(\n adfAutoScanConfig,\n InputSource.Adf,\n deviceCapabilities,\n );\n const scanHeight = getScanHeight(\n adfAutoScanConfig,\n InputSource.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 );\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"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PathHelper.test.js","sourceRoot":"","sources":["../../test/PathHelper.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport chai from \"chai\";\nimport chaiString from \"chai-string\";\nimport PathHelper from \"../src/PathHelper\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nchai.use(chaiString);\n\nconst now: Date = new Date();\n\ndescribe(\"PathHelper\", () => {\n describe(\"getFileForPage\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.jpg`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n undefined,\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2_page1.jpg`);\n });\n });\n describe(\"getFileForScan\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.pdf`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n undefined,\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2.pdf`);\n });\n });\n describe(\"getOutputFolder\", () => {\n describe(\"A folder given\", () => {\n it(\"it is returned\", async () => {\n const folder = await PathHelper.getOutputFolder(\"someFolder\");\n expect(folder).to.be.eq(\"someFolder\");\n });\n });\n describe(\"No folder given\", () => {\n it(\"it return a temp folder\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.startWith(os.tmpdir());\n });\n it(\"it return a folder that exist\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(fs.existsSync(folder)).to.be.true;\n });\n it(\"it return a different folder for every call\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.be.not.eq(await PathHelper.getOutputFolder());\n });\n });\n });\n describe(\"makeUnique\", () => {\n it(\"return the file if it does not exist first\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.eq(uniqueFile);\n });\n\n it(\"return another file in case of conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n });\n\n it(\"return another two conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n expect(another).to.be.not.eq(uniqueFile);\n });\n\n it(\"conflict resolution terminate with error\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n expect(() => {\n for (let i = 0; i < 50; ++i) {\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n }\n }).to.throw(/Can not create unique file:/);\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"PathHelper.test.js","sourceRoot":"","sources":["../../test/PathHelper.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport chai from \"chai\";\nimport chaiString from \"chai-string\";\nimport PathHelper from \"../src/PathHelper\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nchai.use(chaiString);\n\nconst now: Date = new Date();\n\ndescribe(\"PathHelper\", () => {\n describe(\"getFileForPage\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.jpg`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForPage(\n \"someFolder\",\n 2,\n 1,\n undefined,\n \"jpg\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2_page1.jpg`);\n });\n });\n describe(\"getFileForScan\", () => {\n it(\"Can format a file with formatted timestamp\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n '\"scan\"_dd.mm.yyyy_HH:MM:ss',\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(\n `someFolder${path.sep}scan_${(\"\" + now.getDate()).padStart(2, \"0\")}.${(\n \"\" +\n (now.getMonth() + 1)\n ).padStart(2, \"0\")}.${(\"\" + now.getFullYear()).padStart(4, \"0\")}_${(\n \"\" + now.getHours()\n ).padStart(2, \"0\")}:${(\"\" + now.getMinutes()).padStart(2, \"0\")}:${(\n \"\" + now.getSeconds()\n ).padStart(2, \"0\")}.pdf`,\n );\n });\n it(\"Can format a file based on scan count and page number\", async () => {\n const nextFileName = PathHelper.getFileForScan(\n \"someFolder\",\n 2,\n undefined,\n \"pdf\",\n now,\n );\n expect(nextFileName).to.be.eq(`someFolder${path.sep}scan2.pdf`);\n });\n });\n describe(\"getOutputFolder\", () => {\n describe(\"A folder given\", () => {\n it(\"it is returned\", async () => {\n const folder = await PathHelper.getOutputFolder(\"someFolder\");\n expect(folder).to.be.eq(\"someFolder\");\n });\n });\n describe(\"No folder given\", () => {\n it(\"it return a temp folder\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.startWith(os.tmpdir());\n });\n it(\"it return a folder that exist\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(fs.existsSync(folder)).to.be.true;\n });\n it(\"it return a different folder for every call\", async () => {\n const folder = await PathHelper.getOutputFolder();\n expect(folder).to.be.not.eq(await PathHelper.getOutputFolder());\n });\n });\n });\n describe(\"makeUnique\", () => {\n it(\"return the file if it does not exist first\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.eq(uniqueFile);\n });\n\n it(\"return another file in case of conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n const filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n });\n\n it(\"return another two conflict\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n\n const uniqueFile = PathHelper.makeUnique(filePath, now);\n\n expect(filePath).to.be.not.eq(uniqueFile);\n expect(another).to.be.not.eq(uniqueFile);\n });\n\n it(\"conflict resolution terminate with error\", async () => {\n const folder = await PathHelper.getOutputFolder();\n let filePath = path.join(folder, \"someFolder.pdf\");\n fs.openSync(filePath, \"w\");\n\n expect(() => {\n for (let i = 0; i < 50; ++i) {\n const another = PathHelper.makeUnique(filePath, now);\n fs.openSync(another, \"w\");\n }\n }).to.throw(/Can not create unique file:/);\n });\n });\n});\n"]}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
package/src/scanProcessing.ts
CHANGED
|
@@ -154,7 +154,6 @@ async function executeScanJob(
|
|
|
154
154
|
scanCount: number,
|
|
155
155
|
scanJobContent: ScanContent,
|
|
156
156
|
filePattern: string | undefined,
|
|
157
|
-
date: Date,
|
|
158
157
|
): Promise<"Completed" | "Canceled"> {
|
|
159
158
|
const jobUrl = await HPApi.postJob(scanJobSettings);
|
|
160
159
|
|
|
@@ -176,7 +175,7 @@ async function executeScanJob(
|
|
|
176
175
|
scanCount,
|
|
177
176
|
scanJobContent.elements.length + 1,
|
|
178
177
|
filePattern,
|
|
179
|
-
|
|
178
|
+
new Date(),
|
|
180
179
|
);
|
|
181
180
|
job = await HPApi.getJob(jobUrl);
|
|
182
181
|
if (page != null && job.jobState != "Canceled") {
|
|
@@ -230,7 +229,6 @@ async function executeScanJobs(
|
|
|
230
229
|
firstEvent: Event,
|
|
231
230
|
deviceCapabilities: DeviceCapabilities,
|
|
232
231
|
filePattern: string | undefined,
|
|
233
|
-
date: Date,
|
|
234
232
|
) {
|
|
235
233
|
let jobState = await executeScanJob(
|
|
236
234
|
scanJobSettings,
|
|
@@ -239,7 +237,6 @@ async function executeScanJobs(
|
|
|
239
237
|
scanCount,
|
|
240
238
|
scanJobContent,
|
|
241
239
|
filePattern,
|
|
242
|
-
date,
|
|
243
240
|
);
|
|
244
241
|
let lastEvent = firstEvent;
|
|
245
242
|
if (
|
|
@@ -265,7 +262,6 @@ async function executeScanJobs(
|
|
|
265
262
|
scanCount,
|
|
266
263
|
scanJobContent,
|
|
267
264
|
filePattern,
|
|
268
|
-
new Date(),
|
|
269
265
|
);
|
|
270
266
|
if (jobState !== "Completed") {
|
|
271
267
|
return;
|
|
@@ -473,7 +469,6 @@ export async function saveScan(
|
|
|
473
469
|
event,
|
|
474
470
|
deviceCapabilities,
|
|
475
471
|
scanConfig.directoryConfig.filePattern,
|
|
476
|
-
scanDate,
|
|
477
472
|
);
|
|
478
473
|
|
|
479
474
|
console.log(
|
|
@@ -533,7 +528,11 @@ export async function scanFromAdf(
|
|
|
533
528
|
destinationFolder = folder;
|
|
534
529
|
}
|
|
535
530
|
|
|
536
|
-
const scanWidth = getScanWidth(
|
|
531
|
+
const scanWidth = getScanWidth(
|
|
532
|
+
adfAutoScanConfig,
|
|
533
|
+
InputSource.Adf,
|
|
534
|
+
deviceCapabilities,
|
|
535
|
+
);
|
|
537
536
|
const scanHeight = getScanHeight(
|
|
538
537
|
adfAutoScanConfig,
|
|
539
538
|
InputSource.Adf,
|
|
@@ -558,7 +557,6 @@ export async function scanFromAdf(
|
|
|
558
557
|
scanCount,
|
|
559
558
|
scanJobContent,
|
|
560
559
|
adfAutoScanConfig.directoryConfig.filePattern,
|
|
561
|
-
date,
|
|
562
560
|
);
|
|
563
561
|
|
|
564
562
|
console.log(
|