node-hp-scan-to 1.5.0 → 1.6.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.
- package/README.md +18 -4
- package/dist/commitInfo.json +1 -1
- package/dist/index.js +41 -8
- package/dist/index.js.map +1 -1
- package/dist/nextcloud/NextcloudConfig.d.ts +7 -0
- package/dist/nextcloud/NextcloudConfig.js +3 -0
- package/dist/nextcloud/NextcloudConfig.js.map +1 -0
- package/dist/nextcloud/nextcloud.d.ts +4 -0
- package/dist/nextcloud/nextcloud.js +122 -0
- package/dist/nextcloud/nextcloud.js.map +1 -0
- package/dist/paperless/paperless.js +0 -8
- package/dist/paperless/paperless.js.map +1 -1
- package/dist/postProcessing.js +50 -17
- package/dist/postProcessing.js.map +1 -1
- package/dist/scanProcessing.d.ts +2 -0
- package/dist/scanProcessing.js.map +1 -1
- package/dist/test/nextcloud.test.d.ts +1 -0
- package/dist/test/nextcloud.test.js +165 -0
- package/dist/test/nextcloud.test.js.map +1 -0
- package/dist/test/scanProcessing.test.js +2 -1
- package/dist/test/scanProcessing.test.js.map +1 -1
- package/package.json +2 -1
- package/src/commitInfo.json +1 -1
- package/src/index.ts +73 -10
- package/src/nextcloud/NextcloudConfig.ts +7 -0
- package/src/nextcloud/nextcloud.ts +146 -0
- package/src/paperless/paperless.ts +0 -12
- package/src/postProcessing.ts +100 -28
- package/src/scanProcessing.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postProcessing.js","sourceRoot":"","sources":["../src/postProcessing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postProcessing.js","sourceRoot":"","sources":["../src/postProcessing.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScanContent } from \"./ScanContent\";\nimport { mergeToPdf } from \"./pdfProcessing\";\nimport {\n convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless,\n mergeToPdfAndUploadAsSingleDocumentToPaperless,\n uploadImagesAsSeparateDocumentsToPaperless,\n uploadPdfToPaperless,\n} from \"./paperless/paperless\";\nimport {\n uploadPdfToNextcloud,\n uploadImagesToNextcloud,\n} from \"./nextcloud/nextcloud\";\nimport { ScanConfig } from \"./scanProcessing\";\nimport fs from \"fs/promises\";\nimport { PaperlessConfig } from \"./paperless/PaperlessConfig\";\nimport { NextcloudConfig } from \"./nextcloud/NextcloudConfig\";\n\nexport async function postProcessing(\n scanConfig: ScanConfig,\n folder: string,\n tempFolder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n scanDate: Date,\n toPdf: boolean,\n) {\n if (toPdf) {\n await handlePdfProcessing(\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n scanDate,\n scanConfig,\n );\n } else {\n await handleImageProcessing(\n folder,\n scanCount,\n scanJobContent,\n scanDate,\n scanConfig,\n );\n }\n}\n\nasync function handlePdfProcessing(\n folder: string,\n tempFolder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n scanDate: Date,\n scanConfig: ScanConfig,\n) {\n const paperlessConfig = scanConfig.paperlessConfig;\n const nextcloudConfig = scanConfig.nextcloudConfig;\n\n const pdfFilePath = await mergeToPdf(\n paperlessConfig ? tempFolder : folder,\n scanCount,\n scanJobContent,\n scanConfig.directoryConfig.filePattern,\n scanDate,\n true,\n );\n displayPdfScan(pdfFilePath, scanJobContent);\n if (paperlessConfig) {\n await uploadPdfToPaperless(pdfFilePath, paperlessConfig);\n }\n if (nextcloudConfig) {\n await uploadPdfToNextcloud(pdfFilePath, nextcloudConfig);\n }\n await cleanUpFilesIfNeeded([pdfFilePath], paperlessConfig, nextcloudConfig);\n}\n\nasync function handleImageProcessing(\n folder: string,\n scanCount: number,\n scanJobContent: ScanContent,\n scanDate: Date,\n scanConfig: ScanConfig,\n) {\n const paperlessConfig = scanConfig.paperlessConfig;\n const nextcloudConfig = scanConfig.nextcloudConfig;\n\n displayJpegScan(scanJobContent);\n if (paperlessConfig) {\n if (paperlessConfig.groupMultiPageScanIntoAPdf) {\n await mergeToPdfAndUploadAsSingleDocumentToPaperless(\n folder,\n scanCount,\n scanJobContent,\n scanConfig,\n scanDate,\n paperlessConfig,\n );\n } else {\n if (paperlessConfig.alwaysSendAsPdfFile) {\n await convertImagesToPdfAndUploadAsSeparateDocumentsToPaperless(\n scanJobContent,\n paperlessConfig,\n );\n } else {\n await uploadImagesAsSeparateDocumentsToPaperless(\n scanJobContent,\n paperlessConfig,\n );\n }\n }\n }\n if (nextcloudConfig) {\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n }\n const filePaths = scanJobContent.elements.map((element) => element.path);\n await cleanUpFilesIfNeeded(filePaths, paperlessConfig, nextcloudConfig);\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\nasync function cleanUpFilesIfNeeded(\n filePaths: (string | null)[],\n paperlessConfig: PaperlessConfig | undefined,\n nextcloudConfig: NextcloudConfig | undefined,\n) {\n if (!paperlessConfig?.keepFiles && !nextcloudConfig?.keepFiles) {\n await Promise.all(\n filePaths.map(async (filePath) => {\n if (filePath) {\n await fs.unlink(filePath);\n console.log(`File ${filePath} has been removed from the filesystem`);\n }\n }),\n );\n }\n}\n"]}
|
package/dist/scanProcessing.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import Event from "./Event";
|
|
|
2
2
|
import { DeviceCapabilities } from "./DeviceCapabilities";
|
|
3
3
|
import { InputSource } from "./InputSource";
|
|
4
4
|
import { PaperlessConfig } from "./paperless/PaperlessConfig";
|
|
5
|
+
import { NextcloudConfig } from "./nextcloud/NextcloudConfig";
|
|
5
6
|
export declare function getScanWidth(scanConfig: ScanConfig, inputSource: InputSource, deviceCapabilities: DeviceCapabilities): number | null;
|
|
6
7
|
export declare function getScanHeight(scanConfig: ScanConfig, inputSource: InputSource, deviceCapabilities: DeviceCapabilities): number | null;
|
|
7
8
|
export declare function saveScanFromEvent(event: Event, folder: string, tempFolder: string, scanCount: number, deviceCapabilities: DeviceCapabilities, scanConfig: ScanConfig): Promise<void>;
|
|
@@ -16,6 +17,7 @@ export type ScanConfig = {
|
|
|
16
17
|
height: number | null;
|
|
17
18
|
directoryConfig: DirectoryConfig;
|
|
18
19
|
paperlessConfig: PaperlessConfig | undefined;
|
|
20
|
+
nextcloudConfig: NextcloudConfig | undefined;
|
|
19
21
|
};
|
|
20
22
|
export type AdfAutoScanConfig = ScanConfig & {
|
|
21
23
|
isDuplex: boolean;
|
|
@@ -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 { ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\nimport { InputSource } from \"./InputSource\";\nimport { PaperlessConfig } from \"./paperless/PaperlessConfig\";\nimport { postProcessing } from \"./postProcessing\";\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 const 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 const 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 handleScanProcessingState(\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 handleScanProcessingState(\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 const walkupScanToCompEvent =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\n const 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\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): number | null {\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 inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n }\n}\n\nexport function getScanHeight(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n): number | null {\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 inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n }\n}\n\nexport async function saveScanFromEvent(\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\n if (scanStatus.scannerState !== \"Idle\") {\n console.log(\"Scanner state is not Idle, aborting scan attempt...!\");\n }\n\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 await postProcessing(\n scanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n scanDate,\n toPdf,\n );\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\n\nexport type ScanConfig = {\n resolution: number;\n width: number | null;\n height: number | null;\n directoryConfig: DirectoryConfig;\n paperlessConfig: PaperlessConfig | undefined;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport type SingleScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\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 await postProcessing(\n adfAutoScanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n date,\n adfAutoScanConfig.generatePdf,\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 { ScanContent, ScanPage } from \"./ScanContent\";\nimport Job from \"./Job\";\nimport { delay } from \"./delay\";\nimport PathHelper from \"./PathHelper\";\nimport ScanStatus from \"./ScanStatus\";\nimport { InputSource } from \"./InputSource\";\nimport { PaperlessConfig } from \"./paperless/PaperlessConfig\";\nimport { NextcloudConfig } from \"./nextcloud/NextcloudConfig\";\nimport { postProcessing } from \"./postProcessing\";\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 const 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 const 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 handleScanProcessingState(\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 handleScanProcessingState(\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 const walkupScanToCompEvent =\n await HPApi.getWalkupScanToCompEvent(compEventURI);\n const 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\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): number | null {\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 inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxWidth\n : deviceCapabilities.platenMaxWidth;\n }\n}\n\nexport function getScanHeight(\n scanConfig: ScanConfig,\n inputSource: InputSource,\n deviceCapabilities: DeviceCapabilities,\n): number | null {\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 inputSource === InputSource.Adf\n ? deviceCapabilities.adfMaxHeight\n : deviceCapabilities.platenMaxHeight;\n }\n}\n\nexport async function saveScanFromEvent(\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\n if (scanStatus.scannerState !== \"Idle\") {\n console.log(\"Scanner state is not Idle, aborting scan attempt...!\");\n }\n\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 await postProcessing(\n scanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n scanDate,\n toPdf,\n );\n}\n\nexport type DirectoryConfig = {\n directory: string | undefined;\n tempDirectory: string | undefined;\n filePattern: string | undefined;\n};\n\nexport type ScanConfig = {\n resolution: number;\n width: number | null;\n height: number | null;\n directoryConfig: DirectoryConfig;\n paperlessConfig: PaperlessConfig | undefined;\n nextcloudConfig: NextcloudConfig | undefined;\n};\nexport type AdfAutoScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\n pollingInterval: number;\n startScanDelay: number;\n};\n\nexport type SingleScanConfig = ScanConfig & {\n isDuplex: boolean;\n generatePdf: boolean;\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 await postProcessing(\n adfAutoScanConfig,\n folder,\n tempFolder,\n scanCount,\n scanJobContent,\n date,\n adfAutoScanConfig.generatePdf,\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const mocha_1 = require("mocha");
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const nextcloud_1 = require("../src/nextcloud/nextcloud");
|
|
9
|
+
const pdfProcessing_1 = require("../src/pdfProcessing");
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const nock_1 = __importDefault(require("nock"));
|
|
12
|
+
(0, mocha_1.describe)("nextcloud", () => {
|
|
13
|
+
// prepare test data
|
|
14
|
+
const fileName = "sample.jpg";
|
|
15
|
+
const filePath = path_1.default.resolve(__dirname, "./asset/" + fileName);
|
|
16
|
+
const nextcloudUrl = "https://nextcloud.example.test";
|
|
17
|
+
const username = "scanner";
|
|
18
|
+
const password = "pa$$word";
|
|
19
|
+
const uploadFolder = "scan";
|
|
20
|
+
let scanJobContent;
|
|
21
|
+
let scanPage;
|
|
22
|
+
let nextcloudConfig;
|
|
23
|
+
beforeEach(async () => {
|
|
24
|
+
nock_1.default.disableNetConnect();
|
|
25
|
+
nock_1.default.enableNetConnect(nextcloudUrl);
|
|
26
|
+
(0, nock_1.default)(nextcloudUrl, { allowUnmocked: true })
|
|
27
|
+
.get(/.*/)
|
|
28
|
+
.reply(503, 'Service Unavailable');
|
|
29
|
+
scanJobContent = { elements: [] };
|
|
30
|
+
scanPage = {
|
|
31
|
+
pageNumber: 1,
|
|
32
|
+
path: filePath,
|
|
33
|
+
width: 400,
|
|
34
|
+
height: 300,
|
|
35
|
+
xResolution: 96,
|
|
36
|
+
yResolution: 96,
|
|
37
|
+
};
|
|
38
|
+
nextcloudConfig = {
|
|
39
|
+
baseUrl: nextcloudUrl,
|
|
40
|
+
username: username,
|
|
41
|
+
password: password,
|
|
42
|
+
uploadFolder: uploadFolder,
|
|
43
|
+
keepFiles: false,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
(0, mocha_1.describe)("upload images to Nextcloud", () => {
|
|
47
|
+
it('success upload single image', async () => {
|
|
48
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
49
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
50
|
+
.basicAuth({ user: username, pass: password })
|
|
51
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
52
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>")
|
|
53
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')
|
|
54
|
+
.basicAuth({ user: username, pass: password })
|
|
55
|
+
.reply(201);
|
|
56
|
+
scanJobContent.elements.push(scanPage);
|
|
57
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
58
|
+
});
|
|
59
|
+
it('success upload multiple images', async () => {
|
|
60
|
+
const fileName1 = "sample1.jpg";
|
|
61
|
+
const fileName2 = "sample2.jpg";
|
|
62
|
+
const filePath1 = path_1.default.resolve(__dirname, "./asset/" + fileName1);
|
|
63
|
+
const filePath2 = path_1.default.resolve(__dirname, "./asset/" + fileName2);
|
|
64
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
65
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
66
|
+
.basicAuth({ user: username, pass: password })
|
|
67
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
68
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>")
|
|
69
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')
|
|
70
|
+
.basicAuth({ user: username, pass: password })
|
|
71
|
+
.reply(201)
|
|
72
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName1}`, 'PUT')
|
|
73
|
+
.basicAuth({ user: username, pass: password })
|
|
74
|
+
.reply(201)
|
|
75
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName2}`, 'PUT')
|
|
76
|
+
.basicAuth({ user: username, pass: password })
|
|
77
|
+
.reply(201);
|
|
78
|
+
fs_1.default.copyFileSync(filePath, filePath1);
|
|
79
|
+
fs_1.default.copyFileSync(filePath, filePath2);
|
|
80
|
+
scanJobContent.elements.push(scanPage);
|
|
81
|
+
const scanPage2 = { ...scanPage };
|
|
82
|
+
scanPage2.pageNumber = 2;
|
|
83
|
+
scanPage2.path = filePath1;
|
|
84
|
+
scanJobContent.elements.push(scanPage2);
|
|
85
|
+
const scanPage3 = { ...scanPage };
|
|
86
|
+
scanPage3.pageNumber = 3;
|
|
87
|
+
scanPage3.path = filePath2;
|
|
88
|
+
scanJobContent.elements.push(scanPage3);
|
|
89
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
90
|
+
});
|
|
91
|
+
it('user not authorized', async () => {
|
|
92
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
93
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
94
|
+
.basicAuth({ user: username, pass: password })
|
|
95
|
+
.reply(401, "Unauthorized");
|
|
96
|
+
scanJobContent = { elements: [] };
|
|
97
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
98
|
+
});
|
|
99
|
+
it('upload path does not exist', async () => {
|
|
100
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
101
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
102
|
+
.basicAuth({ user: username, pass: password })
|
|
103
|
+
.reply(404, "No such file or directory");
|
|
104
|
+
scanJobContent = { elements: [] };
|
|
105
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
106
|
+
});
|
|
107
|
+
it('upload file failed', async () => {
|
|
108
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
109
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
110
|
+
.basicAuth({ user: username, pass: password })
|
|
111
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
112
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>")
|
|
113
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')
|
|
114
|
+
.basicAuth({ user: username, pass: password })
|
|
115
|
+
.reply(404);
|
|
116
|
+
scanJobContent.elements.push(scanPage);
|
|
117
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
118
|
+
});
|
|
119
|
+
it('upload file not found', async () => {
|
|
120
|
+
const unknownFilePath = path_1.default.resolve(__dirname, "./asset/unknown.jpg");
|
|
121
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
122
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
123
|
+
.basicAuth({ user: username, pass: password })
|
|
124
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
125
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>")
|
|
126
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')
|
|
127
|
+
.basicAuth({ user: username, pass: password })
|
|
128
|
+
.reply(201);
|
|
129
|
+
const scanPage = {
|
|
130
|
+
pageNumber: 1,
|
|
131
|
+
path: unknownFilePath,
|
|
132
|
+
width: 400,
|
|
133
|
+
height: 300,
|
|
134
|
+
xResolution: 96,
|
|
135
|
+
yResolution: 96,
|
|
136
|
+
};
|
|
137
|
+
scanJobContent.elements.push(scanPage);
|
|
138
|
+
await (0, nextcloud_1.uploadImagesToNextcloud)(scanJobContent, nextcloudConfig);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
(0, mocha_1.describe)("uploadPdfToNextcloud", () => {
|
|
142
|
+
it('success upload pdf document', async () => {
|
|
143
|
+
const pdfFilePath = await (0, pdfProcessing_1.convertToPdf)(scanPage, false);
|
|
144
|
+
const pdfFileName = "sample.pdf";
|
|
145
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
146
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
147
|
+
.basicAuth({ user: username, pass: password })
|
|
148
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
149
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>")
|
|
150
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${pdfFileName}`, 'PUT')
|
|
151
|
+
.basicAuth({ user: username, pass: password })
|
|
152
|
+
.reply(201);
|
|
153
|
+
await (0, nextcloud_1.uploadPdfToNextcloud)(pdfFilePath, nextcloudConfig);
|
|
154
|
+
});
|
|
155
|
+
it('pdf document not set', async () => {
|
|
156
|
+
(0, nock_1.default)(nextcloudUrl)
|
|
157
|
+
.intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')
|
|
158
|
+
.basicAuth({ user: username, pass: password })
|
|
159
|
+
.reply(207, "<?xml version=\"1.0\"?>\n" +
|
|
160
|
+
"<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\" xmlns:nc=\"http://nextcloud.org/ns\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>");
|
|
161
|
+
await (0, nextcloud_1.uploadPdfToNextcloud)(null, nextcloudConfig);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=nextcloud.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextcloud.test.js","sourceRoot":"","sources":["../../test/nextcloud.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport path from \"path\";\nimport {\n ScanContent,\n ScanPage\n} from \"../src/ScanContent\";\nimport {\n uploadImagesToNextcloud,\n uploadPdfToNextcloud\n} from \"../src/nextcloud/nextcloud\";\nimport { NextcloudConfig } from \"../src/nextcloud/NextcloudConfig\";\nimport { convertToPdf } from \"../src/pdfProcessing\";\nimport fs from \"fs\";\nimport nock from \"nock\";\n\ndescribe(\"nextcloud\", () => {\n // prepare test data\n const fileName = \"sample.jpg\";\n const filePath = path.resolve(__dirname, \"./asset/\" + fileName);\n const nextcloudUrl = \"https://nextcloud.example.test\";\n const username = \"scanner\";\n const password = \"pa$$word\";\n const uploadFolder = \"scan\";\n\n let scanJobContent: ScanContent;\n let scanPage: ScanPage;\n let nextcloudConfig: NextcloudConfig;\n\n beforeEach(async () => {\n nock.disableNetConnect()\n nock.enableNetConnect(nextcloudUrl)\n\n nock(nextcloudUrl, { allowUnmocked: true })\n .get(/.*/)\n .reply(503, 'Service Unavailable');\n\n scanJobContent = { elements: [] };\n scanPage = {\n pageNumber: 1,\n path: filePath,\n width: 400,\n height: 300,\n xResolution: 96,\n yResolution: 96,\n };\n\n nextcloudConfig = {\n baseUrl: nextcloudUrl,\n username: username,\n password: password,\n uploadFolder: uploadFolder,\n keepFiles: false,\n }\n });\n\n describe(\"upload images to Nextcloud\", () => {\n it('success upload single image', async () => {\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\")\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201);\n\n scanJobContent.elements.push(scanPage);\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n\n it('success upload multiple images', async () => {\n const fileName1 = \"sample1.jpg\";\n const fileName2 = \"sample2.jpg\";\n const filePath1 = path.resolve(__dirname, \"./asset/\" + fileName1);\n const filePath2 = path.resolve(__dirname, \"./asset/\" + fileName2);\n\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\")\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName1}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName2}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201);\n\n fs.copyFileSync(filePath, filePath1);\n fs.copyFileSync(filePath, filePath2);\n\n scanJobContent.elements.push(scanPage);\n\n const scanPage2 = {...scanPage};\n scanPage2.pageNumber = 2;\n scanPage2.path = filePath1;\n scanJobContent.elements.push(scanPage2);\n\n const scanPage3 = {...scanPage};\n scanPage3.pageNumber = 3;\n scanPage3.path = filePath2;\n scanJobContent.elements.push(scanPage3);\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n\n it('user not authorized', async () => {\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(401, \"Unauthorized\");\n scanJobContent = { elements: [] };\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n\n it('upload path does not exist', async () => {\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(404, \"No such file or directory\");\n scanJobContent = { elements: [] };\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n\n it('upload file failed', async () => {\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\")\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(404);\n\n scanJobContent.elements.push(scanPage);\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n\n it('upload file not found', async () => {\n const unknownFilePath = path.resolve(__dirname, \"./asset/unknown.jpg\");\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\")\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${fileName}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201);\n\n const scanPage = {\n pageNumber: 1,\n path: unknownFilePath,\n width: 400,\n height: 300,\n xResolution: 96,\n yResolution: 96,\n };\n scanJobContent.elements.push(scanPage);\n\n await uploadImagesToNextcloud(scanJobContent, nextcloudConfig);\n });\n });\n\n describe(\"uploadPdfToNextcloud\", () => {\n it('success upload pdf document', async () => {\n const pdfFilePath = await convertToPdf(scanPage, false);\n const pdfFileName = \"sample.pdf\";\n\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\")\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}/${pdfFileName}`, 'PUT')\n .basicAuth({user: username, pass: password})\n .reply(201);\n\n await uploadPdfToNextcloud(pdfFilePath, nextcloudConfig);\n });\n\n it('pdf document not set', async () => {\n nock(nextcloudUrl)\n .intercept(`/remote.php/dav/files/${username}/${uploadFolder}`, 'PROPFIND')\n .basicAuth({user: username, pass: password})\n .reply(207, \"<?xml version=\\\"1.0\\\"?>\\n\" +\n \"<d:multistatus xmlns:d=\\\"DAV:\\\" xmlns:s=\\\"http://sabredav.org/ns\\\" xmlns:oc=\\\"http://owncloud.org/ns\\\" xmlns:nc=\\\"http://nextcloud.org/ns\\\"><d:response><d:propstat><d:status>HTTP/1.1 200 OK</d:status></d:propstat></d:response></d:multistatus>\");\n\n await uploadPdfToNextcloud(null, nextcloudConfig);\n });\n });\n});\n"]}
|
|
@@ -17,7 +17,8 @@ const InputSource_1 = require("../src/InputSource");
|
|
|
17
17
|
tempDirectory: undefined,
|
|
18
18
|
filePattern: undefined,
|
|
19
19
|
},
|
|
20
|
-
paperlessConfig: undefined
|
|
20
|
+
paperlessConfig: undefined,
|
|
21
|
+
nextcloudConfig: undefined
|
|
21
22
|
};
|
|
22
23
|
deviceCapabilities = {
|
|
23
24
|
supportsMultiItemScanFromPlaten: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scanProcessing.test.js","sourceRoot":"","sources":["../../test/scanProcessing.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport {\n getScanWidth,\n getScanHeight,\n ScanConfig,\n} from \"../src/scanProcessing\";\nimport { DeviceCapabilities } from \"../src/DeviceCapabilities\";\nimport { InputSource } from \"../src/InputSource\";\n\ndescribe(\"scanProcessing\", () => {\n let scanConfig: ScanConfig;\n let deviceCapabilities: DeviceCapabilities;\n\n beforeEach(async () => {\n scanConfig = {\n resolution: 200,\n width: null,\n height: null,\n directoryConfig: {\n directory: undefined,\n tempDirectory: undefined,\n filePattern: undefined,\n },\n paperlessConfig: undefined\n };\n deviceCapabilities = {\n supportsMultiItemScanFromPlaten: false,\n useWalkupScanToComp: false,\n platenMaxWidth: null,\n platenMaxHeight: null,\n adfMaxWidth: null,\n adfMaxHeight: null,\n };\n });\n\n describe(\"getScanWidth\", async () => {\n const inputSource = InputSource.Adf;\n describe(\"Adf\", async () => {\n it(\"Does not define a value if nothing provided\", async () => {\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.width = -1;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.width = 2583;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(2583);\n });\n });\n describe(\"Platen\", async () => {\n const inputSource = InputSource.Platen;\n it(\"Does not define a value if nothing provided\", async () => {\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.width = -1;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.width = 2583;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(2583);\n });\n });\n });\n\n describe(\"getScanHeight\", async () => {\n const inputSource = InputSource.Adf;\n describe(\"Adf\", async () => {\n it(\"Does not define a value if nothing provided\", async () => {\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.height = -1;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.height = 1269;\n const width = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(1269);\n });\n });\n describe(\"Platen\", async () => {\n const inputSource = InputSource.Platen;\n it(\"Does not define a value if nothing provided\", async () => {\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.height = -1;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.height = 1269;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(1269);\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"scanProcessing.test.js","sourceRoot":"","sources":["../../test/scanProcessing.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe } from \"mocha\";\nimport { expect } from \"chai\";\nimport {\n getScanWidth,\n getScanHeight,\n ScanConfig,\n} from \"../src/scanProcessing\";\nimport { DeviceCapabilities } from \"../src/DeviceCapabilities\";\nimport { InputSource } from \"../src/InputSource\";\n\ndescribe(\"scanProcessing\", () => {\n let scanConfig: ScanConfig;\n let deviceCapabilities: DeviceCapabilities;\n\n beforeEach(async () => {\n scanConfig = {\n resolution: 200,\n width: null,\n height: null,\n directoryConfig: {\n directory: undefined,\n tempDirectory: undefined,\n filePattern: undefined,\n },\n paperlessConfig: undefined,\n nextcloudConfig: undefined\n };\n deviceCapabilities = {\n supportsMultiItemScanFromPlaten: false,\n useWalkupScanToComp: false,\n platenMaxWidth: null,\n platenMaxHeight: null,\n adfMaxWidth: null,\n adfMaxHeight: null,\n };\n });\n\n describe(\"getScanWidth\", async () => {\n const inputSource = InputSource.Adf;\n describe(\"Adf\", async () => {\n it(\"Does not define a value if nothing provided\", async () => {\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.width = -1;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.width = 2583;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(2583);\n });\n });\n describe(\"Platen\", async () => {\n const inputSource = InputSource.Platen;\n it(\"Does not define a value if nothing provided\", async () => {\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.width = -1;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.width = 2583;\n const width = getScanWidth(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(2583);\n });\n });\n });\n\n describe(\"getScanHeight\", async () => {\n const inputSource = InputSource.Adf;\n describe(\"Adf\", async () => {\n it(\"Does not define a value if nothing provided\", async () => {\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.height = -1;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.height = 1269;\n const width = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(width).to.be.eq(1269);\n });\n });\n describe(\"Platen\", async () => {\n const inputSource = InputSource.Platen;\n it(\"Does not define a value if nothing provided\", async () => {\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Does not define a value if negative provided\", async () => {\n scanConfig.height = -1;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(null);\n });\n it(\"Define the value if no max available from device\", async () => {\n scanConfig.height = 1269;\n const height = getScanHeight(scanConfig, inputSource, deviceCapabilities);\n expect(height).to.be.eq(1269);\n });\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-hp-scan-to",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Scan document to Computer for HP All-in-One Printers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Officejet",
|
|
@@ -63,6 +63,7 @@
|
|
|
63
63
|
"codecov": "^3.8.3",
|
|
64
64
|
"eslint": "^9.1.0",
|
|
65
65
|
"mocha": "^11.0.1",
|
|
66
|
+
"nock": "^13.5.6",
|
|
66
67
|
"nodemon": "^3.0.1",
|
|
67
68
|
"nyc": "^17.0.0",
|
|
68
69
|
"prettier": "^3.0.0",
|
package/src/commitInfo.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -26,8 +26,9 @@ import {
|
|
|
26
26
|
} from "./scanProcessing";
|
|
27
27
|
import * as commitInfo from "./commitInfo.json";
|
|
28
28
|
import { PaperlessConfig } from "./paperless/PaperlessConfig";
|
|
29
|
+
import { NextcloudConfig } from "./nextcloud/NextcloudConfig";
|
|
29
30
|
import { startHealthCheckServer } from "./healthcheck";
|
|
30
|
-
|
|
31
|
+
import fs from "fs";
|
|
31
32
|
|
|
32
33
|
let iteration = 0;
|
|
33
34
|
|
|
@@ -248,15 +249,36 @@ function setupScanParameters(command: Command): Command {
|
|
|
248
249
|
"Always convert scan job to pdf before sending to paperless",
|
|
249
250
|
);
|
|
250
251
|
command.option(
|
|
251
|
-
"-k, --
|
|
252
|
+
"-k, --keep-files",
|
|
252
253
|
"Keep the scan files on the file system (default: false)",
|
|
253
254
|
);
|
|
255
|
+
|
|
256
|
+
command.option(
|
|
257
|
+
"--nextcloud-url <nextcloud_url>",
|
|
258
|
+
"The nextcloud url (example: https://domain.tld)",
|
|
259
|
+
);
|
|
260
|
+
command.option(
|
|
261
|
+
"--nextcloud-username <nextcloud_username>",
|
|
262
|
+
"The nextcloud username",
|
|
263
|
+
);
|
|
264
|
+
command.option(
|
|
265
|
+
"--nextcloud-password <nextcloud_app_password>",
|
|
266
|
+
"The nextcloud app password for username. Either this or nextcloud-password-file is required",
|
|
267
|
+
);
|
|
268
|
+
command.option(
|
|
269
|
+
"--nextcloud-password-file <nextcloud_app_password_file>",
|
|
270
|
+
"File name that contains the nextcloud app password for username. Either this or nextcloud-password is required",
|
|
271
|
+
);
|
|
272
|
+
command.option(
|
|
273
|
+
"--nextcloud-upload-folder <nextcloud_upload_folder>",
|
|
274
|
+
"The upload folder where documents or images are uploaded (default: scan)",
|
|
275
|
+
);
|
|
254
276
|
return command;
|
|
255
277
|
}
|
|
256
278
|
|
|
257
279
|
function setupParameterOpts(command: Command): Command {
|
|
258
280
|
command.option(
|
|
259
|
-
"-
|
|
281
|
+
"-a, --address <ip>",
|
|
260
282
|
"IP address of the device (this overrides -p)",
|
|
261
283
|
);
|
|
262
284
|
command.option(
|
|
@@ -301,16 +323,10 @@ function getPaperlessConfig(
|
|
|
301
323
|
getConfig("paperless_post_document_url");
|
|
302
324
|
const configPaperlessToken: string =
|
|
303
325
|
parentOption.paperlessToken || getConfig("paperless_token");
|
|
304
|
-
const configPaperlessKeepFiles =
|
|
305
|
-
parentOption.paperlessKeepFiles ||
|
|
306
|
-
getConfig("paperless_keep_files") ||
|
|
307
|
-
false;
|
|
308
326
|
|
|
309
327
|
if (paperlessPostDocumentUrl && configPaperlessToken) {
|
|
310
328
|
const configPaperlessKeepFiles: boolean =
|
|
311
|
-
parentOption.
|
|
312
|
-
getConfig("paperless_keep_files") ||
|
|
313
|
-
false;
|
|
329
|
+
parentOption.keepFiles || getConfig("keep_files") || false;
|
|
314
330
|
const groupMultiPageScanIntoAPdf: boolean =
|
|
315
331
|
parentOption.paperlessGroupMultiPageScanIntoAPdf ||
|
|
316
332
|
getConfig("paperless_group_multi_page_scan_into_a_pdf") ||
|
|
@@ -335,6 +351,51 @@ function getPaperlessConfig(
|
|
|
335
351
|
}
|
|
336
352
|
}
|
|
337
353
|
|
|
354
|
+
function getNextcloudConfig(
|
|
355
|
+
parentOption: OptionValues,
|
|
356
|
+
): NextcloudConfig | undefined {
|
|
357
|
+
const configNextcloudUrl: string =
|
|
358
|
+
parentOption.nextcloudUrl || getConfig("nextcloud_url");
|
|
359
|
+
const configNextcloudUsername: string =
|
|
360
|
+
parentOption.nextcloudUsername || getConfig("nextcloud_username");
|
|
361
|
+
let configNextcloudPassword: string =
|
|
362
|
+
parentOption.nextcloudPassword || getConfig("nextcloud_password");
|
|
363
|
+
const configNextcloudPasswordFile: string =
|
|
364
|
+
parentOption.nextcloudPasswordFile || getConfig("nextcloud_password_file");
|
|
365
|
+
|
|
366
|
+
if (
|
|
367
|
+
configNextcloudUrl &&
|
|
368
|
+
configNextcloudUsername &&
|
|
369
|
+
(configNextcloudPassword || configNextcloudPasswordFile)
|
|
370
|
+
) {
|
|
371
|
+
const configNextcloudUploadFolder =
|
|
372
|
+
parentOption.nextcloudUploadFolder ||
|
|
373
|
+
getConfig("nextcloud_upload_folder") ||
|
|
374
|
+
"scan";
|
|
375
|
+
const configNextcloudKeepFiles: boolean =
|
|
376
|
+
parentOption.keepFiles || getConfig("keep_files") || false;
|
|
377
|
+
|
|
378
|
+
if (configNextcloudPasswordFile) {
|
|
379
|
+
configNextcloudPassword = fs
|
|
380
|
+
.readFileSync(configNextcloudPasswordFile, "utf8")
|
|
381
|
+
.trimEnd();
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
console.log(
|
|
385
|
+
`Nextcloud configuration provided, url: ${configNextcloudUrl}, username: ${configNextcloudUsername}, password length: ${configNextcloudPassword.length}, upload folder: ${configNextcloudUploadFolder}, keepFiles: ${configNextcloudKeepFiles}`,
|
|
386
|
+
);
|
|
387
|
+
return {
|
|
388
|
+
baseUrl: configNextcloudUrl,
|
|
389
|
+
username: configNextcloudUsername,
|
|
390
|
+
password: configNextcloudPassword,
|
|
391
|
+
uploadFolder: configNextcloudUploadFolder,
|
|
392
|
+
keepFiles: configNextcloudKeepFiles,
|
|
393
|
+
};
|
|
394
|
+
} else {
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
338
399
|
function getHealthCheckSetting(option: OptionValues) {
|
|
339
400
|
const healthCheckEnabled: boolean =
|
|
340
401
|
option.healthCheck || getConfig("enableHealthCheck") === true;
|
|
@@ -370,6 +431,7 @@ function getScanConfiguration(option: OptionValues) {
|
|
|
370
431
|
: parseInt(configHeight, 10);
|
|
371
432
|
|
|
372
433
|
const paperlessConfig = getPaperlessConfig(option);
|
|
434
|
+
const nextcloudConfig = getNextcloudConfig(option);
|
|
373
435
|
|
|
374
436
|
const scanConfig: ScanConfig = {
|
|
375
437
|
resolution: parseInt(
|
|
@@ -380,6 +442,7 @@ function getScanConfiguration(option: OptionValues) {
|
|
|
380
442
|
height: height,
|
|
381
443
|
directoryConfig,
|
|
382
444
|
paperlessConfig,
|
|
445
|
+
nextcloudConfig,
|
|
383
446
|
};
|
|
384
447
|
return scanConfig;
|
|
385
448
|
}
|