node-hp-scan-to 1.4.3 → 1.5.1
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 +76 -29
- package/dist/Destination.js +2 -2
- package/dist/Destination.js.map +1 -1
- package/dist/DiscoveryTree.js.map +1 -1
- package/dist/Event.js.map +1 -1
- package/dist/EventTable.js +1 -1
- package/dist/EventTable.js.map +1 -1
- package/dist/HPApi.js +4 -4
- package/dist/HPApi.js.map +1 -1
- package/dist/InputSource.js +1 -1
- package/dist/InputSource.js.map +1 -1
- package/dist/Job.js +2 -2
- package/dist/Job.js.map +1 -1
- package/dist/JpegUtil.d.ts +1 -0
- package/dist/JpegUtil.js.map +1 -1
- package/dist/PaperlessCOnfig.d.ts +7 -0
- package/dist/PaperlessCOnfig.js +3 -0
- package/dist/PaperlessCOnfig.js.map +1 -0
- package/dist/PaperlessConfig.d.ts +7 -0
- package/dist/PaperlessConfig.js +3 -0
- package/dist/PaperlessConfig.js.map +1 -0
- package/dist/PathHelper.js.map +1 -1
- package/dist/ScanCaps.js +12 -2
- package/dist/ScanCaps.js.map +1 -1
- package/dist/ScanContent.d.ts +0 -1
- package/dist/ScanContent.js +0 -24
- package/dist/ScanContent.js.map +1 -1
- package/dist/ScanJobManifest.js.map +1 -1
- package/dist/ScanJobSettings.js +2 -2
- package/dist/ScanJobSettings.js.map +1 -1
- package/dist/ScanStatus.js.map +1 -1
- package/dist/WalkupScanDestination.js.map +1 -1
- package/dist/WalkupScanDestinations.js +1 -1
- package/dist/WalkupScanDestinations.js.map +1 -1
- package/dist/WalkupScanManifest.js.map +1 -1
- package/dist/WalkupScanToCompDestination.js.map +1 -1
- package/dist/WalkupScanToCompDestinations.js +1 -1
- package/dist/WalkupScanToCompDestinations.js.map +1 -1
- package/dist/WalkupScanToCompManifest.js.map +1 -1
- package/dist/commitInfo.json +3 -0
- package/dist/healthcheck.d.ts +1 -0
- package/dist/healthcheck.js +24 -0
- package/dist/healthcheck.js.map +1 -0
- package/dist/index.js +106 -19
- package/dist/index.js.map +1 -1
- package/dist/listening.js +2 -2
- package/dist/listening.js.map +1 -1
- package/dist/paperless/PaperlessConfig.d.ts +7 -0
- package/dist/paperless/PaperlessConfig.js +3 -0
- package/dist/paperless/PaperlessConfig.js.map +1 -0
- package/dist/paperless/paperless.d.ts +7 -0
- package/dist/paperless/paperless.js +83 -0
- package/dist/paperless/paperless.js.map +1 -0
- package/dist/paperless.d.ts +7 -0
- package/dist/paperless.js +83 -0
- package/dist/paperless.js.map +1 -0
- package/dist/pdfProcessing.d.ts +4 -0
- package/dist/pdfProcessing.js +52 -0
- package/dist/pdfProcessing.js.map +1 -0
- package/dist/postProcessing.d.ts +3 -0
- package/dist/postProcessing.js +44 -0
- package/dist/postProcessing.js.map +1 -0
- package/dist/readDeviceCapabilities.js.map +1 -1
- package/dist/scanProcessing.d.ts +7 -1
- package/dist/scanProcessing.js +20 -49
- package/dist/scanProcessing.js.map +1 -1
- package/dist/test/PathHelper.test.js +2 -2
- package/dist/test/PathHelper.test.js.map +1 -1
- package/dist/test/ScanCaps.test.js +20 -0
- package/dist/test/ScanCaps.test.js.map +1 -1
- package/dist/test/clean.js.map +1 -1
- package/dist/test/scanProcessing.test.js +1 -0
- package/dist/test/scanProcessing.test.js.map +1 -1
- package/dist/test-bonjour.d.ts +1 -0
- package/dist/test-bonjour.js +20 -0
- package/dist/test-bonjour.js.map +1 -0
- package/package.json +12 -9
- package/src/Destination.ts +2 -2
- package/src/EventTable.ts +1 -1
- package/src/HPApi.ts +4 -4
- package/src/Job.ts +2 -2
- package/src/ScanCaps.ts +18 -8
- package/src/ScanContent.ts +0 -22
- package/src/ScanJobSettings.ts +2 -2
- package/src/WalkupScanDestinations.ts +1 -1
- package/src/WalkupScanToCompDestinations.ts +1 -1
- package/src/commitInfo.json +3 -0
- package/src/healthcheck.ts +17 -0
- package/src/index.ts +132 -24
- package/src/listening.ts +2 -2
- package/src/paperless/PaperlessConfig.ts +7 -0
- package/src/paperless/paperless.ts +122 -0
- package/src/pdfProcessing.ts +67 -0
- package/src/postProcessing.ts +91 -0
- package/src/scanProcessing.ts +46 -93
package/README.md
CHANGED
|
@@ -9,68 +9,94 @@
|
|
|
9
9
|
[](https://www.codefactor.io/repository/github/manuc66/node-hp-scan-to)
|
|
10
10
|
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fmanuc66%2Fnode-hp-scan-to?ref=badge_shield)
|
|
11
11
|
|
|
12
|
+
# node-hp-scan-to
|
|
13
|
+
|
|
12
14
|
The `node-hp-scan-to` is a Node.js application that replicates the functionality of the "Scan to Computer" from HP. For this purpose, the original HP Windows application's interaction with the device has been [reverse engineered](protocol_doc/HP%20Officejet%206500%20E710n-z.md)
|
|
13
15
|
|
|
14
|
-
Its primary purpose is to enable users to scan documents directly from an HP device and seamlessly transfer them to a computer. Unlike the original program, this program is designed to be compatible with Linux (including Docker), and is expected to work on Windows and macOS, making it accessible to a wider range of users and usages.
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
Its primary purpose is to enable users to scan documents directly from an HP device and seamlessly transfer them to a computer. Unlike the original program, this program is designed to be compatible with Linux (including Docker), and is expected to work on Windows and macOS, making it accessible to a wider range of users and usages.
|
|
17
|
+
|
|
18
|
+
## Supported devices
|
|
19
|
+
It has been developed and tested with the following HP All-in-One Printers:
|
|
20
|
+
- HP DeskJet 3520
|
|
21
|
+
- HP OfficeJet 6500A Plus
|
|
17
22
|
- HP Smart Tank Plus 570 series
|
|
18
23
|
|
|
19
24
|
Additionally, it has been reported to work on several other HP printer models.
|
|
20
|
-
- HP
|
|
21
|
-
- HP
|
|
22
|
-
- HP
|
|
23
|
-
- HP
|
|
24
|
-
- HP
|
|
25
|
-
- HP
|
|
26
|
-
- HP OfficeJet
|
|
27
|
-
- HP OfficeJet
|
|
28
|
-
- HP
|
|
29
|
-
- HP
|
|
25
|
+
- HP DeskJet 3050 All-in-One - J610a
|
|
26
|
+
- HP DeskJet 3775 All-in-One
|
|
27
|
+
- HP DeskJet 4670 All-in-One
|
|
28
|
+
- HP DeskJet 5525
|
|
29
|
+
- HP OfficeJet 3830
|
|
30
|
+
- HP OfficeJet 5230
|
|
31
|
+
- HP OfficeJet 5740
|
|
32
|
+
- HP OfficeJet 6700 Premium
|
|
33
|
+
- HP OfficeJet 6950
|
|
34
|
+
- HP OfficeJet 8010 series
|
|
30
35
|
- HP OfficeJet 8012
|
|
36
|
+
- HP OfficeJet Pro 7720 Wide Format All-in-One
|
|
37
|
+
- HP OfficeJet Pro 8025e
|
|
31
38
|
- HP OfficeJet Pro 9012e
|
|
39
|
+
- HP PageWide 377dw MFP
|
|
32
40
|
|
|
33
41
|
There are good chances it also works on your HP All-in-One Printer.
|
|
34
42
|
|
|
35
43
|
Please note that the `node-hp-scan-to` project is not endorsed by nor affiliated with HP. The reverse engineering of the original HP Windows application's interaction with the device has been done independently.
|
|
36
44
|
|
|
37
|
-
## Supported features
|
|
45
|
+
## Supported device features
|
|
38
46
|
- ✔️ JPG scan output
|
|
39
47
|
- ✔️ PDF document scan output
|
|
40
48
|
- ✔️ Scan from automatic document feeder
|
|
41
49
|
- ✔️ Dual side with automatic document feeder
|
|
42
50
|
- ✔️ Multi page from platen
|
|
43
51
|
- ✔️ Automatic IP address discovery
|
|
52
|
+
|
|
53
|
+
## Provided features
|
|
44
54
|
- ✔️ Prebuilt Docker images (multi arch)
|
|
45
55
|
- ✔️ Command line support (Cross platform)
|
|
46
56
|
- ✔️ Customizable file names
|
|
47
57
|
- ✔️ Customizable resolution
|
|
48
58
|
- ✔️ Customizable label on the device
|
|
49
59
|
- ✔️ Multi platform: Linux, Windows and most probably macOS
|
|
60
|
+
- ✔️ Folder target or paperless-ngx api upload
|
|
61
|
+
- ✔️ Clear all registered target
|
|
62
|
+
- ✔️ Automatic scan when automatic document feeder is getting loaded
|
|
50
63
|
|
|
51
64
|
## Usage
|
|
52
65
|
|
|
53
66
|
### Command line
|
|
54
67
|
`npx node-hp-scan-to`
|
|
55
68
|
|
|
56
|
-
- `-
|
|
69
|
+
- `-a` or `--address` followed by the ip address of the printer, i.e. `-a 192.168.0.5`.
|
|
70
|
+
- `--device-up-polling-interval` is the polling interval in milliseconds to detect if the device is up or not
|
|
57
71
|
- `-l` or `--label` The label to display on the printer (default is the hostname).
|
|
58
72
|
- `-n` or `--name` followed by the printer name, it probably contains spaces, so it needs to be quoted, i.e. `-name "Officejet 6500 E710n-z"`
|
|
59
73
|
- `-d` or `--directory` followed by the directory path where the scanned documents should be saved, i.e. `-d ~/Documents/Scans`. Defaults to `/tmp/scan-to-pc<random value>` when not set.
|
|
60
74
|
- `-t` or `--temp-directory` Temp directory used for processing. Defaults to `/tmp/scan-to-pc<random value>` when not set.
|
|
61
75
|
- `-p` or `--pattern` followed by the pattern for the filename without file extension, i.e. `"scan"_dd.mm.yyyy_hh:MM:ss` to name the scanned file `scan_19.04.2021_17:26:47`. Date and time patterns are replaced by the current date and time, text that should not be replaced need to be inside quotes. Documentation for the pattern can be found [here](https://www.npmjs.com/package/dateformat) in the section `Mask options`. Defaults to `scan<increasing number>_page<page number>` when not set.
|
|
62
76
|
- `-r` or `--resolution` Resolution in DPI of the scans (defaults is 200).
|
|
77
|
+
- `-w` or `--width` followed by an integer, the with in pixel of the scans (default: 2481)
|
|
78
|
+
- `-h` or `--height` followed by an integer, the height in pixel of the scans (default: 3507)
|
|
79
|
+
- `-s` or `--paperless-post-document-url` followed by the paperless post document url (example: https://domain.tld/api/documents/post_document/)
|
|
80
|
+
- `k` or `--paperless-token` followed by te paperless-ngx api token
|
|
63
81
|
- `-D, --debug"` enables debug logs.
|
|
64
82
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
83
|
+
#### `listen command`
|
|
84
|
+
This is the default mode, it will listen the device for new job and trigger based on the selection on the device.
|
|
85
|
+
|
|
86
|
+
Do run `npx node-hp-scan-to listen --help` to get command line usage help
|
|
87
|
+
|
|
88
|
+
#### `adf-autoscan`
|
|
89
|
+
This will trigger a scan job as soon as the adf is loaded with paper
|
|
90
|
+
|
|
91
|
+
Do run `npx node-hp-scan-to adf-autoscan --help` to get command line usage help
|
|
92
|
+
|
|
93
|
+
You can also set the environment `MAIN_COMMAND` to `adf-autoscan` with docker
|
|
94
|
+
|
|
95
|
+
#### `clear-registrations`
|
|
96
|
+
This will clear all registered target on the device (useful for trial and error and debugging)
|
|
97
|
+
Do run `npx node-hp-scan-to clear-registrations --help` to get command line usage help
|
|
98
|
+
|
|
99
|
+
You can also set the environment `MAIN_COMMAND` to `clear-registrations` with docker
|
|
74
100
|
|
|
75
101
|
### Run with docker
|
|
76
102
|
|
|
@@ -87,13 +113,15 @@ For the correct permissions to the volume set the environment variables `PUID` a
|
|
|
87
113
|
Exhaustive list of supported environment variables and their meaning, or correspondence with [command-line flags](#command-line):
|
|
88
114
|
- `PUID`: id of user that will run the program
|
|
89
115
|
- `PGID`: id of group that will run the program
|
|
90
|
-
- `IP`: command-line flag `-
|
|
116
|
+
- `IP`: command-line flag `-a`/`--address`
|
|
91
117
|
- `PATTERN`: command-line flag `-p`/`--pattern`
|
|
92
118
|
- `LABEL`: command-line flag `-l`/`--label`
|
|
93
119
|
- `NAME`: command-line flag `-n`/`--name`
|
|
94
120
|
- `DIR`: command-line flag `-d`/`--directory`
|
|
95
121
|
- `TEMP_DIR`: command-line flag `-t`/`--temp-directory`
|
|
96
122
|
- `RESOLUTION`: command-line flag `-r`/`--resolution`
|
|
123
|
+
- `PAPERLESS_POST_DOCUMENT_URL`: the paperless post document url (if provided with token, a pdf is uploaded to paperless-ngx) for example: `PAPERLESS_POST_DOCUMENT_URL= "http://<paperless-host>:<port>/api/documents/post_document/"`
|
|
124
|
+
- `PAPERLESS_TOKEN`: the paperless api token for example: `PAPERLESS_TOKEN= "xxxxxxxxxxxx..."`
|
|
97
125
|
- `CMDLINE`: additional command-line flags that will be put at the end of the command.
|
|
98
126
|
|
|
99
127
|
__To enable debug logs set the environment variable `CMDLINE` to `-D`.__
|
|
@@ -137,7 +165,7 @@ Apply the following manifest (the PersistentVolumeClaim must also be deployed be
|
|
|
137
165
|
```yml
|
|
138
166
|
apiVersion: apps/v1
|
|
139
167
|
kind: Deployment
|
|
140
|
-
|
|
168
|
+
name: hp-scan-to
|
|
141
169
|
spec:
|
|
142
170
|
replicas: 1
|
|
143
171
|
selector:
|
|
@@ -182,16 +210,35 @@ spec:
|
|
|
182
210
|
claimName: incoming-scans
|
|
183
211
|
```
|
|
184
212
|
|
|
185
|
-
|
|
213
|
+
### How to run from the code
|
|
214
|
+
If you wish to test it by cloning this repository:
|
|
215
|
+
```sh
|
|
216
|
+
git clone ...
|
|
217
|
+
cd node-hp-scan-to
|
|
218
|
+
yarn install -d
|
|
219
|
+
yarn build
|
|
220
|
+
# now start the program with the ip or name of the desired printer
|
|
221
|
+
node dist/index.js -a 192.168.1.4 # or -n "Officejet 6500 E710n-z"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
#### Debugging
|
|
186
225
|
I'm using Visual Studio Code to debug this application, so instead of running ts-node just enter `code .` and press F5 to start debugging.
|
|
187
226
|
You may want to set your printers ip or name in `.vscode/launch.json`.
|
|
188
227
|
|
|
189
|
-
|
|
190
228
|
## 💖 Support this project
|
|
191
|
-
|
|
229
|
+
|
|
230
|
+
Thank you so much to everyone who has already supported this project! Your generosity is greatly appreciated and it motivates me to keep improving and maintaining this project.
|
|
231
|
+
|
|
232
|
+
If this project has helped you save money or time, or simply made your life easier, you can support me by buying me a cup of coffee:
|
|
192
233
|
|
|
193
234
|
- [](https://www.paypal.me/manuc66)
|
|
194
235
|
- Bitcoin — You can send me bitcoins at this address: `33gxVjey6g4Beha26fSQZLFfWWndT1oY3F`
|
|
195
236
|
|
|
237
|
+
Thank you for your support!
|
|
238
|
+
|
|
239
|
+
## 🙏 Special Thanks
|
|
240
|
+
|
|
241
|
+
A special thank you to [JetBrains](https://www.jetbrains.com/) for supporting this project with a free license for their amazing development tools. Their support helps make this project possible.
|
|
242
|
+
|
|
196
243
|
## License
|
|
197
244
|
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fmanuc66%2Fnode-hp-scan-to?ref=badge_large)
|
package/dist/Destination.js
CHANGED
|
@@ -54,8 +54,8 @@ class Destination {
|
|
|
54
54
|
parsed.WalkupScanDestination.Hostname[0]._ = this.hostname;
|
|
55
55
|
parsed.WalkupScanDestination.Name[0]._ = this.name;
|
|
56
56
|
parsed.WalkupScanDestination.LinkType[0] = this.linkType;
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
const builder = new xml2js_1.Builder();
|
|
58
|
+
const xml = builder.buildObject(parsed);
|
|
59
59
|
if (this.toComp) {
|
|
60
60
|
return xml.replace(/WalkupScan/g, "WalkupScanToComp");
|
|
61
61
|
}
|
package/dist/Destination.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Destination.js","sourceRoot":"","sources":["../src/Destination.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,mCAAyC;AACzC,2CAA6B;AAE7B,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAU5B,MAAqB,WAAW;IAM9B,YAAY,IAAY,EAAE,QAAgB,EAAE,MAAe;QACzD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,cAAc,GAAW,0CAA0C,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,EAAE
|
|
1
|
+
{"version":3,"file":"Destination.js","sourceRoot":"","sources":["../src/Destination.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,mCAAyC;AACzC,2CAA6B;AAE7B,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAU5B,MAAqB,WAAW;IAM9B,YAAY,IAAY,EAAE,QAAgB,EAAE,MAAe;QACzD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,cAAc,GAAW,0CAA0C,CAAC;QACxE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,cAAc;gBACZ,wJAAwJ;oBACxJ,yGAAyG,CAAC;SAC7G;aAAM;YACL,cAAc;gBACZ,0JAA0J;oBAC1J,qHAAqH,CAAC;SACzH;QAED,cAAc;YACZ,iGAAiG;gBACjG,mFAAmF;gBACnF,kCAAkC;gBAClC,0BAA0B,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CACjC,MAAM,CAAC,WAAW,CACnB,CAAC,cAAc,CAAC,CAAC;QAElB,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3D,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACnD,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEzD,MAAM,OAAO,GAAG,IAAI,gBAAO,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;SACvD;aAAM;YACL,OAAO,GAAG,CAAC;SACZ;IACH,CAAC;CACF;AA/CD,8BA+CC","sourcesContent":["\"use strict\";\n\nimport { Parser, Builder } from \"xml2js\";\nimport * as util from \"util\";\n\nconst parser = new Parser();\n\ntype WalkupScanDestinationData = {\n WalkupScanDestination: {\n Hostname: { _: string }[];\n Name: { _: string }[];\n LinkType: string[];\n };\n};\n\nexport default class Destination {\n private readonly name: string;\n private readonly hostname: string;\n private readonly linkType: string;\n private readonly toComp: boolean;\n\n constructor(name: string, hostname: string, toComp: boolean) {\n this.name = name;\n this.hostname = hostname;\n this.linkType = \"Network\";\n this.toComp = toComp;\n }\n\n async toXML() {\n let rawDestination: string = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n if (this.toComp) {\n rawDestination +=\n '<WalkupScanDestination xmlns=\"http://www.hp.com/schemas/imaging/con/ledm/walkupscan/2010/09/28\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ' +\n 'xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/ledm/walkupscan/2010/09/28 WalkupScan.xsd\">\\n';\n } else {\n rawDestination +=\n '<WalkupScanDestination xmlns=\"http://www.hp.com/schemas/imaging/con/rest/walkupscan/2009/09/21\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \\n' +\n 'xsi:schemaLocation=\"http://www.hp.com/schemas/imaging/con/rest/walkupscan/2009/09/21 WalkupScanDestinations.xsd\">\\n';\n }\n\n rawDestination +=\n '\\t<Hostname xmlns=\"http://www.hp.com/schemas/imaging/con/dictionaries/2009/04/06\"></Hostname>\\n' +\n '\\t<Name xmlns=\"http://www.hp.com/schemas/imaging/con/dictionaries/1.0/\"></Name>\\n' +\n \"\\t<LinkType>Network</LinkType>\\n\" +\n \"</WalkupScanDestination>\";\n\n const parsed = await util.promisify<string, WalkupScanDestinationData>(\n parser.parseString,\n )(rawDestination);\n\n parsed.WalkupScanDestination.Hostname[0]._ = this.hostname;\n parsed.WalkupScanDestination.Name[0]._ = this.name;\n parsed.WalkupScanDestination.LinkType[0] = this.linkType;\n\n const builder = new Builder();\n const xml = builder.buildObject(parsed);\n if (this.toComp) {\n return xml.replace(/WalkupScan/g, \"WalkupScanToComp\");\n } else {\n return xml;\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscoveryTree.js","sourceRoot":"","sources":["../src/DiscoveryTree.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,mCAAgC;AAChC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAC5B,+BAAiC;AACjC,MAAM,WAAW,GAAG,IAAA,gBAAS,EAA4B,MAAM,CAAC,WAAW,CAAC,CAAC;AAW7E,MAAqB,aAAa;IAGhC,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAe;QAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,2BAA2B;QAC7B,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACpE,mBAAmB,CACpB,CAAC,IAAI,CACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,qCAAqC,CACzE,CAAC;QACF,IAAI,8BAA8B,KAAK,SAAS,EAAE
|
|
1
|
+
{"version":3,"file":"DiscoveryTree.js","sourceRoot":"","sources":["../src/DiscoveryTree.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,mCAAgC;AAChC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAC5B,+BAAiC;AACjC,MAAM,WAAW,GAAG,IAAA,gBAAS,EAA4B,MAAM,CAAC,WAAW,CAAC,CAAC;AAW7E,MAAqB,aAAa;IAGhC,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAe;QAC9C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,2BAA2B;QAC7B,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACpE,mBAAmB,CACpB,CAAC,IAAI,CACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,qCAAqC,CACzE,CAAC;QACF,IAAI,8BAA8B,KAAK,SAAS,EAAE;YAChD,OAAO,8BAA8B,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9D;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,qBAAqB;QACvB,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACpE,mBAAmB,CACpB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,yBAAyB,CAAC,CAAC;QACrE,IAAI,8BAA8B,KAAK,SAAS,EAAE;YAChD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,8BAA8B,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,kBAAkB;QACpB,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CACpE,mBAAmB,CACpB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,4BAA4B,CAAC,CAAC;QACxE,IAAI,8BAA8B,KAAK,SAAS,EAAE;YAChD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,8BAA8B,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF;AAxCD,gCAwCC","sourcesContent":["\"use strict\";\nimport { Parser } from \"xml2js\";\nconst parser = new Parser();\nimport { promisify } from \"util\";\nconst parseString = promisify<string, DiscoveryTreeData>(parser.parseString);\n\nexport interface DiscoveryTreeData {\n \"ledm:DiscoveryTree\": {\n \"ledm:SupportedIfc\": {\n \"ledm:ManifestURI\": string[];\n \"dd:ResourceType\": string[];\n }[];\n };\n}\n\nexport default class DiscoveryTree {\n private readonly data: DiscoveryTreeData;\n\n constructor(data: DiscoveryTreeData) {\n this.data = data;\n }\n static async createDiscoveryTree(content: string): Promise<DiscoveryTree> {\n const parsed = await parseString(content);\n return new DiscoveryTree(parsed);\n }\n\n get WalkupScanToCompManifestURI(): string | null {\n const hpLedmWalkupScanToCompManifest = this.data[\"ledm:DiscoveryTree\"][\n \"ledm:SupportedIfc\"\n ].find(\n (x) => x[\"dd:ResourceType\"][0] === \"ledm:hpLedmWalkupScanToCompManifest\",\n );\n if (hpLedmWalkupScanToCompManifest !== undefined) {\n return hpLedmWalkupScanToCompManifest[\"ledm:ManifestURI\"][0];\n }\n return null;\n }\n get WalkupScanManifestURI(): string | null {\n const hpLedmWalkupScanToCompManifest = this.data[\"ledm:DiscoveryTree\"][\n \"ledm:SupportedIfc\"\n ].find((x) => x[\"dd:ResourceType\"][0] === \"hpCnxWalkupScanManifest\");\n if (hpLedmWalkupScanToCompManifest === undefined) {\n return null;\n }\n return hpLedmWalkupScanToCompManifest[\"ledm:ManifestURI\"][0];\n }\n get ScanJobManifestURI(): string | null {\n const hpLedmWalkupScanToCompManifest = this.data[\"ledm:DiscoveryTree\"][\n \"ledm:SupportedIfc\"\n ].find((x) => x[\"dd:ResourceType\"][0] === \"ledm:hpLedmScanJobManifest\");\n if (hpLedmWalkupScanToCompManifest === undefined) {\n return null;\n }\n return hpLedmWalkupScanToCompManifest[\"ledm:ManifestURI\"][0];\n }\n}\n"]}
|
package/dist/Event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.js","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAeb,MAAqB,KAAK;IAExB,YAAY,IAAe;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,cAAc;QAChB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE
|
|
1
|
+
{"version":3,"file":"Event.js","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAeb,MAAqB,KAAK;IAExB,YAAY,IAAe;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,wBAAwB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,cAAc;QAChB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;YACjE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACrD,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAClD,CAAC;YAEF,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACrE;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,YAAY;QACd,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,CAAC,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAChD,CAAC;YAEF,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;SACjE;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,wBAAwB,KAAK,WAAW,CAAC;IACvD,CAAC;CACF;AAvCD,wBAuCC","sourcesContent":["\"use strict\";\n\nexport type EventData = {\n \"dd:UnqualifiedEventCategory\": string[];\n \"dd:AgingStamp\": string[];\n \"ev:Payload\": {\n \"dd:ResourceURI\": {\n \"0\": string;\n };\n \"dd:ResourceType\": {\n \"0\": string;\n };\n }[];\n};\n\nexport default class Event {\n private readonly data: EventData;\n constructor(data: EventData) {\n this.data = data;\n }\n\n get unqualifiedEventCategory(): string {\n return this.data[\"dd:UnqualifiedEventCategory\"][0];\n }\n\n get agingStamp(): string {\n return this.data[\"dd:AgingStamp\"][0];\n }\n\n get destinationURI(): string | undefined {\n if (Object.prototype.hasOwnProperty.call(this.data, \"ev:Payload\")) {\n const destination = this.data[\"ev:Payload\"].find((v) =>\n v[\"dd:ResourceType\"][\"0\"].includes(\"Destination\"),\n );\n\n return destination ? destination[\"dd:ResourceURI\"][\"0\"] : undefined;\n }\n return undefined;\n }\n\n get compEventURI(): string | undefined {\n if (Object.prototype.hasOwnProperty.call(this.data, \"ev:Payload\")) {\n const compEvent = this.data[\"ev:Payload\"].find((v) =>\n v[\"dd:ResourceType\"][\"0\"].includes(\"CompEvent\"),\n );\n\n return compEvent ? compEvent[\"dd:ResourceURI\"][\"0\"] : undefined;\n }\n return undefined;\n }\n\n get isScanEvent(): boolean {\n return this.unqualifiedEventCategory === \"ScanEvent\";\n }\n}\n"]}
|
package/dist/EventTable.js
CHANGED
|
@@ -20,7 +20,7 @@ class EventTable {
|
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
get events() {
|
|
23
|
-
|
|
23
|
+
const eventTable = this.data["ev:EventTable"];
|
|
24
24
|
if (eventTable != null && eventTable["ev:Event"] != null) {
|
|
25
25
|
return eventTable["ev:Event"].map((x) => new Event_1.default(x));
|
|
26
26
|
}
|
package/dist/EventTable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventTable.js","sourceRoot":"","sources":["../src/EventTable.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,oDAA2C;AAC3C,mCAAgC;AAChC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAC5B,+BAAiC;AACjC,MAAM,WAAW,GAAG,IAAA,gBAAS,EAAyB,MAAM,CAAC,WAAW,CAAC,CAAC;AAa1E,MAAqB,UAAU;IAE7B,YAAY,IAAoB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAC/B,OAAe,EACf,YAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM;QACR,
|
|
1
|
+
{"version":3,"file":"EventTable.js","sourceRoot":"","sources":["../src/EventTable.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;;;;AAEb,oDAA2C;AAC3C,mCAAgC;AAChC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAC5B,+BAAiC;AACjC,MAAM,WAAW,GAAG,IAAA,gBAAS,EAAyB,MAAM,CAAC,WAAW,CAAC,CAAC;AAa1E,MAAqB,UAAU;IAE7B,YAAY,IAAoB;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAC/B,OAAe,EACf,YAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;SACnC,CAAC;IACJ,CAAC;IAED,IAAI,MAAM;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE;YACxD,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,eAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACxD;aAAM;YACL,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CACF;AAzBD,6BAyBC","sourcesContent":["\"use strict\";\n\nimport Event, { EventData } from \"./Event\";\nimport { Parser } from \"xml2js\";\nconst parser = new Parser();\nimport { promisify } from \"util\";\nconst parseString = promisify<string, EventTableData>(parser.parseString);\n\nexport interface EtagEventTable {\n etag: string;\n eventTable: EventTable;\n}\n\nexport interface EventTableData {\n \"ev:EventTable\"?: {\n \"ev:Event\"?: EventData[];\n };\n}\n\nexport default class EventTable {\n private readonly data: EventTableData;\n constructor(data: EventTableData) {\n this.data = data;\n }\n\n static async createEtagEventTable(\n content: string,\n etagReceived: string,\n ): Promise<EtagEventTable> {\n const parsed = await parseString(content);\n return {\n etag: etagReceived,\n eventTable: new EventTable(parsed),\n };\n }\n\n get events() {\n const eventTable = this.data[\"ev:EventTable\"];\n if (eventTable != null && eventTable[\"ev:Event\"] != null) {\n return eventTable[\"ev:Event\"].map((x) => new Event(x));\n } else {\n return [];\n }\n }\n}\n"]}
|
package/dist/HPApi.js
CHANGED
|
@@ -257,7 +257,7 @@ class HPApi {
|
|
|
257
257
|
static async removeDestination(walkupScanDestination) {
|
|
258
258
|
let path;
|
|
259
259
|
if (walkupScanDestination.resourceURI.startsWith("http")) {
|
|
260
|
-
|
|
260
|
+
const urlInfo = new url_1.URL(walkupScanDestination.resourceURI);
|
|
261
261
|
if (urlInfo.pathname === null) {
|
|
262
262
|
throw new Error(`invalid walkupScanDestination.resourceURI: ${walkupScanDestination.resourceURI}`);
|
|
263
263
|
}
|
|
@@ -317,8 +317,8 @@ class HPApi {
|
|
|
317
317
|
}
|
|
318
318
|
static async getEvents(etag = "", decisecondTimeout = 0) {
|
|
319
319
|
var _a;
|
|
320
|
-
|
|
321
|
-
|
|
320
|
+
const url = this.appendTimeout("/EventMgmt/EventTable", decisecondTimeout);
|
|
321
|
+
const headers = this.placeETagHeader(etag, {});
|
|
322
322
|
let response;
|
|
323
323
|
try {
|
|
324
324
|
response = await HPApi.callAxios({
|
|
@@ -395,7 +395,7 @@ class HPApi {
|
|
|
395
395
|
throw response;
|
|
396
396
|
}
|
|
397
397
|
else {
|
|
398
|
-
|
|
398
|
+
const content = response.data;
|
|
399
399
|
return ScanStatus_1.default.createScanStatus(content);
|
|
400
400
|
}
|
|
401
401
|
}
|
package/dist/HPApi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HPApi.js","sourceRoot":"","sources":["../src/HPApi.ts"],"names":[],"mappings":"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","sourcesContent":["\"use strict\";\n\nimport { promisify } from \"util\";\nimport fs from \"fs\";\nimport axios, {\n AxiosError,\n AxiosRequestConfig,\n AxiosResponse,\n RawAxiosRequestHeaders,\n} from \"axios\";\nimport { URL } from \"url\";\nimport * as stream from \"stream\";\nimport { Stream } from \"stream\";\nimport EventTable, { EtagEventTable } from \"./EventTable\";\nimport Job from \"./Job\";\nimport ScanStatus from \"./ScanStatus\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport WalkupScanDestinations from \"./WalkupScanDestinations\";\nimport WalkupScanToCompDestinations from \"./WalkupScanToCompDestinations\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport Destination from \"./Destination\";\nimport WalkupScanToCompEvent from \"./WalkupScanToCompEvent\";\nimport DiscoveryTree from \"./DiscoveryTree\";\nimport WalkupScanToCompManifest from \"./WalkupScanToCompManifest\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\nimport WalkupScanManifest from \"./WalkupScanManifest\";\nimport ScanJobManifest from \"./ScanJobManifest\";\nimport ScanCaps from \"./ScanCaps\";\nimport { delay } from \"./delay\";\nimport * as net from \"net\";\n\nlet printerIP = \"192.168.1.11\";\nlet debug = false;\nlet callCount = 0;\n\nexport default class HPApi {\n static setDeviceIP(ip: string): void {\n printerIP = ip;\n }\n\n static setDebug(dbg: boolean): void {\n debug = dbg;\n }\n static isDebug(): boolean {\n return debug;\n }\n\n private static logDebug(\n callId: number,\n isRequest: boolean,\n msg: object | string,\n ): void {\n if (debug) {\n const id = String(callId).padStart(4, \"0\");\n const content = typeof msg === \"string\" ? msg : JSON.stringify(msg);\n console.log(id + (isRequest ? \" -> \" : \" <- \") + content);\n }\n }\n\n private static async callAxios(\n request: AxiosRequestConfig,\n ): Promise<AxiosResponse<string>> {\n callCount++;\n if (request.timeout === 0) {\n request.timeout = 100_000;\n }\n HPApi.logDebug(callCount, true, request);\n try {\n const response = await axios(request);\n HPApi.logDebug(callCount, false, {\n status: response.status,\n data: response.data,\n headers: response.headers,\n statusText: response.statusText,\n });\n return response;\n } catch (error) {\n const axiosError = error as AxiosError;\n\n if (axiosError.isAxiosError) {\n HPApi.logDebug(callCount, false, {\n status: axiosError.response?.status,\n data: axiosError.response?.data,\n headers: axiosError.response?.headers,\n statusText: axiosError.response?.statusText,\n });\n }\n throw error;\n }\n }\n\n static async isAlive(timeout: number | null = null): Promise<boolean> {\n const definedTimeout = timeout || 10000; // default of 10 seconds\n return new Promise((resolve) => {\n const socket = net.createConnection(80, printerIP, () => {\n clearTimeout(timer);\n resolve(true);\n socket.end();\n });\n const timer = setTimeout(() => {\n resolve(false);\n socket.end();\n }, definedTimeout);\n socket.on(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n }\n\n static async waitDeviceUp(deviceUpPollingInterval: number): Promise<void> {\n let first = true;\n while (!(await HPApi.isAlive())) {\n if (first) {\n console.log(\n `Device ip: ${printerIP} is down! [${new Date().toISOString()}]`,\n );\n }\n first = false;\n await delay(deviceUpPollingInterval);\n }\n if (!first) {\n console.log(\n `Device ip: ${printerIP} is up again! [${new Date().toISOString()}]`,\n );\n }\n }\n\n static async getDiscoveryTree(): Promise<DiscoveryTree> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/DevMgmt/DiscoveryTree.xml\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return DiscoveryTree.createDiscoveryTree(response.data);\n }\n }\n\n static async getWalkupScanDestinations(\n uri: string = \"/WalkupScan/WalkupScanDestinations\",\n ): Promise<WalkupScanDestinations> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanDestinations.createWalkupScanDestinations(response.data);\n }\n }\n\n static async getWalkupScanToCompDestinations(): Promise<WalkupScanToCompDestinations> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/WalkupScanToComp/WalkupScanToCompDestinations\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompDestinations.createWalkupScanToCompDestinations(\n response.data,\n );\n }\n }\n\n static async getWalkupScanManifest(uri: string): Promise<WalkupScanManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanManifest.createWalkupScanManifest(response.data);\n }\n }\n static async getWalkupScanToCompManifest(\n uri: string,\n ): Promise<WalkupScanToCompManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompManifest.createWalkupScanToCompManifest(\n response.data,\n );\n }\n }\n\n static async getScanJobManifest(uri: string): Promise<ScanJobManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return ScanJobManifest.createScanJobManifest(response.data);\n }\n }\n\n static async getScanCaps(uri: string): Promise<ScanCaps> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return ScanCaps.createScanCaps(response.data);\n }\n }\n\n static async getWalkupScanToCompCaps(\n uri: string,\n ): Promise<WalkupScanToCompCaps> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompCaps.createWalkupScanToCompCaps(response.data);\n }\n }\n\n static async getWalkupScanToCompEvent(\n compEventURI: string,\n ): Promise<WalkupScanToCompEvent> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: compEventURI,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n return WalkupScanToCompEvent.createWalkupScanToCompEvent(response.data);\n }\n }\n\n static async removeDestination(\n walkupScanDestination: WalkupScanDestination | WalkupScanToCompDestination,\n ): Promise<boolean> {\n let path: string;\n\n if (walkupScanDestination.resourceURI.startsWith(\"http\")) {\n let urlInfo = new URL(walkupScanDestination.resourceURI);\n if (urlInfo.pathname === null) {\n throw new Error(\n `invalid walkupScanDestination.resourceURI: ${walkupScanDestination.resourceURI}`,\n );\n }\n path = urlInfo.pathname;\n } else {\n path = walkupScanDestination.resourceURI;\n }\n\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: path,\n method: \"DELETE\",\n responseType: \"text\",\n });\n if (response.status === 204 || response.status == 200) {\n return true;\n } else {\n throw response;\n }\n }\n\n static async registerWalkupScanDestination(\n destination: Destination,\n ): Promise<string> {\n const xml = await destination.toXML();\n const url = \"/WalkupScan/WalkupScanDestinations\";\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return new URL(response.headers.location).pathname;\n } else {\n throw response;\n }\n }\n static async registerWalkupScanToCompDestination(\n destination: Destination,\n ): Promise<string> {\n const xml = await destination.toXML();\n const url = \"/WalkupScanToComp/WalkupScanToCompDestinations\";\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return new URL(response.headers.location).pathname;\n } else {\n throw response;\n }\n }\n\n static async getEvents(\n etag: string = \"\",\n decisecondTimeout: number = 0,\n ): Promise<EtagEventTable> {\n let url = this.appendTimeout(\"/EventMgmt/EventTable\", decisecondTimeout);\n\n let headers = this.placeETagHeader(etag, {});\n\n let response: AxiosResponse<string>;\n try {\n response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"GET\",\n responseType: \"text\",\n headers: headers,\n timeout: decisecondTimeout * 100 * 1.1,\n });\n } catch (error) {\n const axiosError = error as AxiosError;\n\n if (!axiosError.isAxiosError) throw error;\n\n if (axiosError.response?.status === 304) {\n return {\n etag: etag,\n eventTable: new EventTable({}),\n };\n }\n throw error;\n }\n\n const etagReceived = response.headers[\"etag\"];\n if (etagReceived == null) {\n throw response;\n }\n\n const content = response.data;\n return EventTable.createEtagEventTable(content, etagReceived);\n }\n\n static placeETagHeader(\n etag: string,\n headers: RawAxiosRequestHeaders,\n ): RawAxiosRequestHeaders {\n if (etag !== \"\") {\n headers[\"If-None-Match\"] = etag;\n }\n return headers;\n }\n\n static appendTimeout(url: string, timeout: number | null = null): string {\n if (timeout == null) {\n timeout = 1200;\n }\n if (timeout > 0) {\n url += \"?timeout=\" + timeout;\n }\n return url;\n }\n\n static async getDestination(\n destinationURL: string,\n ): Promise<WalkupScanDestination | WalkupScanToCompDestination> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: destinationURL,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n const content = response.data;\n if (destinationURL.includes(\"WalkupScanToComp\")) {\n return WalkupScanToCompDestination.createWalkupScanToCompDestination(\n content,\n );\n } else {\n return WalkupScanDestination.createWalkupScanDestination(content);\n }\n }\n }\n\n static async getScanStatus(): Promise<ScanStatus> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/Scan/Status\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n let content = response.data;\n return ScanStatus.createScanStatus(content);\n }\n }\n\n static delay(t: number): Promise<void> {\n return new Promise(function (resolve) {\n setTimeout(resolve, t);\n });\n }\n\n static async postJob(job: ScanJobSettings): Promise<string> {\n await HPApi.delay(500);\n const xml = await job.toXML();\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}:8080`,\n url: \"/Scan/Jobs\",\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return response.headers.location;\n } else {\n throw response;\n }\n }\n\n /**\n * @param jobURL\n * @return {Promise<Job|*>}\n */\n static async getJob(jobURL: string) {\n const response = await HPApi.callAxios({\n url: jobURL,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n const content = response.data;\n return Job.createJob(content);\n }\n }\n\n static async downloadPage(\n binaryURL: string,\n destination: string,\n ): Promise<string> {\n const { data }: AxiosResponse<Stream> = await axios.request<Stream>({\n baseURL: `http://${printerIP}:8080`,\n url: binaryURL,\n method: \"GET\",\n responseType: \"stream\",\n });\n\n const destinationFileStream = fs.createWriteStream(destination);\n data.pipe(destinationFileStream);\n\n await promisify(stream.finished)(destinationFileStream);\n\n return destination;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HPApi.js","sourceRoot":"","sources":["../src/HPApi.ts"],"names":[],"mappings":"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","sourcesContent":["\"use strict\";\n\nimport { promisify } from \"util\";\nimport fs from \"fs\";\nimport axios, {\n AxiosError,\n AxiosRequestConfig,\n AxiosResponse,\n RawAxiosRequestHeaders,\n} from \"axios\";\nimport { URL } from \"url\";\nimport * as stream from \"stream\";\nimport { Stream } from \"stream\";\nimport EventTable, { EtagEventTable } from \"./EventTable\";\nimport Job from \"./Job\";\nimport ScanStatus from \"./ScanStatus\";\nimport WalkupScanDestination from \"./WalkupScanDestination\";\nimport WalkupScanToCompDestination from \"./WalkupScanToCompDestination\";\nimport WalkupScanDestinations from \"./WalkupScanDestinations\";\nimport WalkupScanToCompDestinations from \"./WalkupScanToCompDestinations\";\nimport ScanJobSettings from \"./ScanJobSettings\";\nimport Destination from \"./Destination\";\nimport WalkupScanToCompEvent from \"./WalkupScanToCompEvent\";\nimport DiscoveryTree from \"./DiscoveryTree\";\nimport WalkupScanToCompManifest from \"./WalkupScanToCompManifest\";\nimport WalkupScanToCompCaps from \"./WalkupScanToCompCaps\";\nimport WalkupScanManifest from \"./WalkupScanManifest\";\nimport ScanJobManifest from \"./ScanJobManifest\";\nimport ScanCaps from \"./ScanCaps\";\nimport { delay } from \"./delay\";\nimport * as net from \"net\";\n\nlet printerIP = \"192.168.1.11\";\nlet debug = false;\nlet callCount = 0;\n\nexport default class HPApi {\n static setDeviceIP(ip: string): void {\n printerIP = ip;\n }\n\n static setDebug(dbg: boolean): void {\n debug = dbg;\n }\n static isDebug(): boolean {\n return debug;\n }\n\n private static logDebug(\n callId: number,\n isRequest: boolean,\n msg: object | string,\n ): void {\n if (debug) {\n const id = String(callId).padStart(4, \"0\");\n const content = typeof msg === \"string\" ? msg : JSON.stringify(msg);\n console.log(id + (isRequest ? \" -> \" : \" <- \") + content);\n }\n }\n\n private static async callAxios(\n request: AxiosRequestConfig,\n ): Promise<AxiosResponse<string>> {\n callCount++;\n if (request.timeout === 0) {\n request.timeout = 100_000;\n }\n HPApi.logDebug(callCount, true, request);\n try {\n const response = await axios(request);\n HPApi.logDebug(callCount, false, {\n status: response.status,\n data: response.data,\n headers: response.headers,\n statusText: response.statusText,\n });\n return response;\n } catch (error) {\n const axiosError = error as AxiosError;\n\n if (axiosError.isAxiosError) {\n HPApi.logDebug(callCount, false, {\n status: axiosError.response?.status,\n data: axiosError.response?.data,\n headers: axiosError.response?.headers,\n statusText: axiosError.response?.statusText,\n });\n }\n throw error;\n }\n }\n\n static async isAlive(timeout: number | null = null): Promise<boolean> {\n const definedTimeout = timeout || 10000; // default of 10 seconds\n return new Promise((resolve) => {\n const socket = net.createConnection(80, printerIP, () => {\n clearTimeout(timer);\n resolve(true);\n socket.end();\n });\n const timer = setTimeout(() => {\n resolve(false);\n socket.end();\n }, definedTimeout);\n socket.on(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n });\n }\n\n static async waitDeviceUp(deviceUpPollingInterval: number): Promise<void> {\n let first = true;\n while (!(await HPApi.isAlive())) {\n if (first) {\n console.log(\n `Device ip: ${printerIP} is down! [${new Date().toISOString()}]`,\n );\n }\n first = false;\n await delay(deviceUpPollingInterval);\n }\n if (!first) {\n console.log(\n `Device ip: ${printerIP} is up again! [${new Date().toISOString()}]`,\n );\n }\n }\n\n static async getDiscoveryTree(): Promise<DiscoveryTree> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/DevMgmt/DiscoveryTree.xml\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return DiscoveryTree.createDiscoveryTree(response.data);\n }\n }\n\n static async getWalkupScanDestinations(\n uri: string = \"/WalkupScan/WalkupScanDestinations\",\n ): Promise<WalkupScanDestinations> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanDestinations.createWalkupScanDestinations(response.data);\n }\n }\n\n static async getWalkupScanToCompDestinations(): Promise<WalkupScanToCompDestinations> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/WalkupScanToComp/WalkupScanToCompDestinations\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompDestinations.createWalkupScanToCompDestinations(\n response.data,\n );\n }\n }\n\n static async getWalkupScanManifest(uri: string): Promise<WalkupScanManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanManifest.createWalkupScanManifest(response.data);\n }\n }\n static async getWalkupScanToCompManifest(\n uri: string,\n ): Promise<WalkupScanToCompManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompManifest.createWalkupScanToCompManifest(\n response.data,\n );\n }\n }\n\n static async getScanJobManifest(uri: string): Promise<ScanJobManifest> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return ScanJobManifest.createScanJobManifest(response.data);\n }\n }\n\n static async getScanCaps(uri: string): Promise<ScanCaps> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return ScanCaps.createScanCaps(response.data);\n }\n }\n\n static async getWalkupScanToCompCaps(\n uri: string,\n ): Promise<WalkupScanToCompCaps> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: uri,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw new Error(response.statusText);\n } else {\n return WalkupScanToCompCaps.createWalkupScanToCompCaps(response.data);\n }\n }\n\n static async getWalkupScanToCompEvent(\n compEventURI: string,\n ): Promise<WalkupScanToCompEvent> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: compEventURI,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n return WalkupScanToCompEvent.createWalkupScanToCompEvent(response.data);\n }\n }\n\n static async removeDestination(\n walkupScanDestination: WalkupScanDestination | WalkupScanToCompDestination,\n ): Promise<boolean> {\n let path: string;\n\n if (walkupScanDestination.resourceURI.startsWith(\"http\")) {\n const urlInfo = new URL(walkupScanDestination.resourceURI);\n if (urlInfo.pathname === null) {\n throw new Error(\n `invalid walkupScanDestination.resourceURI: ${walkupScanDestination.resourceURI}`,\n );\n }\n path = urlInfo.pathname;\n } else {\n path = walkupScanDestination.resourceURI;\n }\n\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: path,\n method: \"DELETE\",\n responseType: \"text\",\n });\n if (response.status === 204 || response.status == 200) {\n return true;\n } else {\n throw response;\n }\n }\n\n static async registerWalkupScanDestination(\n destination: Destination,\n ): Promise<string> {\n const xml = await destination.toXML();\n const url = \"/WalkupScan/WalkupScanDestinations\";\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return new URL(response.headers.location).pathname;\n } else {\n throw response;\n }\n }\n static async registerWalkupScanToCompDestination(\n destination: Destination,\n ): Promise<string> {\n const xml = await destination.toXML();\n const url = \"/WalkupScanToComp/WalkupScanToCompDestinations\";\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return new URL(response.headers.location).pathname;\n } else {\n throw response;\n }\n }\n\n static async getEvents(\n etag: string = \"\",\n decisecondTimeout: number = 0,\n ): Promise<EtagEventTable> {\n const url = this.appendTimeout(\"/EventMgmt/EventTable\", decisecondTimeout);\n\n const headers = this.placeETagHeader(etag, {});\n\n let response: AxiosResponse<string>;\n try {\n response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: url,\n method: \"GET\",\n responseType: \"text\",\n headers: headers,\n timeout: decisecondTimeout * 100 * 1.1,\n });\n } catch (error) {\n const axiosError = error as AxiosError;\n\n if (!axiosError.isAxiosError) throw error;\n\n if (axiosError.response?.status === 304) {\n return {\n etag: etag,\n eventTable: new EventTable({}),\n };\n }\n throw error;\n }\n\n const etagReceived = response.headers[\"etag\"];\n if (etagReceived == null) {\n throw response;\n }\n\n const content = response.data;\n return EventTable.createEtagEventTable(content, etagReceived);\n }\n\n static placeETagHeader(\n etag: string,\n headers: RawAxiosRequestHeaders,\n ): RawAxiosRequestHeaders {\n if (etag !== \"\") {\n headers[\"If-None-Match\"] = etag;\n }\n return headers;\n }\n\n static appendTimeout(url: string, timeout: number | null = null): string {\n if (timeout == null) {\n timeout = 1200;\n }\n if (timeout > 0) {\n url += \"?timeout=\" + timeout;\n }\n return url;\n }\n\n static async getDestination(\n destinationURL: string,\n ): Promise<WalkupScanDestination | WalkupScanToCompDestination> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: destinationURL,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n const content = response.data;\n if (destinationURL.includes(\"WalkupScanToComp\")) {\n return WalkupScanToCompDestination.createWalkupScanToCompDestination(\n content,\n );\n } else {\n return WalkupScanDestination.createWalkupScanDestination(content);\n }\n }\n }\n\n static async getScanStatus(): Promise<ScanStatus> {\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}`,\n url: \"/Scan/Status\",\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n const content = response.data;\n return ScanStatus.createScanStatus(content);\n }\n }\n\n static delay(t: number): Promise<void> {\n return new Promise(function (resolve) {\n setTimeout(resolve, t);\n });\n }\n\n static async postJob(job: ScanJobSettings): Promise<string> {\n await HPApi.delay(500);\n const xml = await job.toXML();\n const response = await HPApi.callAxios({\n baseURL: `http://${printerIP}:8080`,\n url: \"/Scan/Jobs\",\n method: \"POST\",\n headers: { \"Content-Type\": \"text/xml\" },\n data: xml,\n responseType: \"text\",\n });\n\n if (response.status === 201 && response.headers.location != null) {\n return response.headers.location;\n } else {\n throw response;\n }\n }\n\n /**\n * @param jobURL\n * @return {Promise<Job|*>}\n */\n static async getJob(jobURL: string) {\n const response = await HPApi.callAxios({\n url: jobURL,\n method: \"GET\",\n responseType: \"text\",\n });\n\n if (response.status !== 200) {\n throw response;\n } else {\n const content = response.data;\n return Job.createJob(content);\n }\n }\n\n static async downloadPage(\n binaryURL: string,\n destination: string,\n ): Promise<string> {\n const { data }: AxiosResponse<Stream> = await axios.request<Stream>({\n baseURL: `http://${printerIP}:8080`,\n url: binaryURL,\n method: \"GET\",\n responseType: \"stream\",\n });\n\n const destinationFileStream = fs.createWriteStream(destination);\n data.pipe(destinationFileStream);\n\n await promisify(stream.finished)(destinationFileStream);\n\n return destination;\n }\n}\n"]}
|
package/dist/InputSource.js
CHANGED
|
@@ -5,5 +5,5 @@ var InputSource;
|
|
|
5
5
|
(function (InputSource) {
|
|
6
6
|
InputSource["Adf"] = "Adf";
|
|
7
7
|
InputSource["Platen"] = "Platen";
|
|
8
|
-
})(InputSource
|
|
8
|
+
})(InputSource = exports.InputSource || (exports.InputSource = {}));
|
|
9
9
|
//# sourceMappingURL=InputSource.js.map
|
package/dist/InputSource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputSource.js","sourceRoot":"","sources":["../src/InputSource.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,0BAAW,CAAA;IACX,gCAAiB,CAAA;AACnB,CAAC,EAHW,WAAW,
|
|
1
|
+
{"version":3,"file":"InputSource.js","sourceRoot":"","sources":["../src/InputSource.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,0BAAW,CAAA;IACX,gCAAiB,CAAA;AACnB,CAAC,EAHW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAGtB","sourcesContent":["export enum InputSource {\n Adf = \"Adf\",\n Platen = \"Platen\",\n}\n"]}
|
package/dist/Job.js
CHANGED
|
@@ -13,7 +13,7 @@ class Job {
|
|
|
13
13
|
return new Job(parsed);
|
|
14
14
|
}
|
|
15
15
|
get currentPageNumber() {
|
|
16
|
-
|
|
16
|
+
const preScanPage = this.data["j:Job"].ScanJob[0].PreScanPage;
|
|
17
17
|
if (preScanPage) {
|
|
18
18
|
return preScanPage[0].PageNumber[0];
|
|
19
19
|
}
|
|
@@ -31,7 +31,7 @@ class Job {
|
|
|
31
31
|
return this.data["j:Job"]["j:JobState"][0];
|
|
32
32
|
}
|
|
33
33
|
get pageState() {
|
|
34
|
-
|
|
34
|
+
const preScanPage = this.data["j:Job"].ScanJob[0].PreScanPage;
|
|
35
35
|
if (preScanPage) {
|
|
36
36
|
return preScanPage[0].PageState[0];
|
|
37
37
|
}
|
package/dist/Job.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,mCAAgC;AAChC,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAC5B,+BAAiC;AACjC,MAAM,WAAW,GAAG,IAAA,gBAAS,EAAkB,MAAM,CAAC,WAAW,CAAC,CAAC;AA4BnE,MAAqB,GAAG;IAEtB,YAAY,IAAa;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAe;QACpC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,iBAAiB;QACnB,
|
|
1
|
+
{"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"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","sourcesContent":["\"use strict\";\nimport { Parser } from \"xml2js\";\nconst parser = new Parser();\nimport { promisify } from \"util\";\nconst parseString = promisify<string, JobData>(parser.parseString);\n\nexport interface JobData {\n \"j:Job\": {\n ScanJob: {\n PreScanPage?: {\n PageState: string[];\n BinaryURL: string[];\n PageNumber: string[];\n BufferInfo: {\n ImageWidth: string[];\n ImageHeight: string[];\n ScanSettings: {\n InputSource: string[];\n ContentType: string[];\n XResolution: string[];\n YResolution: string[];\n }[];\n }[];\n }[];\n PostScanPage?: {\n PageNumber: string[];\n }[];\n }[];\n \"j:JobState\": string[];\n };\n}\n\nexport default class Job {\n private readonly data: JobData;\n constructor(data: JobData) {\n this.data = data;\n }\n\n static async createJob(content: string): Promise<Job> {\n const parsed = await parseString(content);\n return new Job(parsed);\n }\n\n get currentPageNumber(): string | null {\n const preScanPage = this.data[\"j:Job\"].ScanJob[0].PreScanPage;\n if (preScanPage) {\n return preScanPage[0].PageNumber[0];\n } else {\n return null;\n }\n }\n\n get totalPageNumber(): number | null {\n if (this.data[\"j:Job\"].ScanJob[0].PostScanPage) {\n return parseInt(\n this.data[\"j:Job\"].ScanJob[0].PostScanPage[0].PageNumber[0],\n 10,\n );\n }\n return null;\n }\n\n get jobState():\n | \"Completed\"\n | \"Processing\"\n | \"ReadyToUpload\"\n | \"Canceled\"\n | string {\n return this.data[\"j:Job\"][\"j:JobState\"][0];\n }\n\n get pageState(): string | null {\n const preScanPage = this.data[\"j:Job\"].ScanJob[0].PreScanPage;\n if (preScanPage) {\n return preScanPage[0].PageState[0];\n } else {\n return null;\n }\n }\n\n get binaryURL(): string | null {\n if (this.data[\"j:Job\"].ScanJob[0].PreScanPage) {\n return this.data[\"j:Job\"].ScanJob[0].PreScanPage[0].BinaryURL[0];\n }\n return null;\n }\n\n get imageWidth(): number | null {\n if (\n !Object.prototype.hasOwnProperty.call(\n this.data[\"j:Job\"].ScanJob[0],\n \"PreScanPage\",\n )\n ) {\n return null;\n }\n return parseInt(\n this.data[\"j:Job\"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]\n ?.ImageWidth[0] ?? \"\",\n );\n }\n get imageHeight(): number | null {\n if (this.data[\"j:Job\"].ScanJob[0].PreScanPage) {\n return parseInt(\n this.data[\"j:Job\"].ScanJob[0].PreScanPage[0].BufferInfo[0]\n .ImageHeight[0],\n );\n }\n return null;\n }\n get xResolution(): number | null {\n if (this.data[\"j:Job\"].ScanJob[0].PreScanPage) {\n return parseInt(\n this.data[\"j:Job\"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]\n ?.ScanSettings?.[0]?.XResolution[0] ?? \"\",\n );\n }\n return null;\n }\n get yResolution(): number | null {\n if (\n Object.prototype.hasOwnProperty.call(\n this.data[\"j:Job\"].ScanJob[0],\n \"PreScanPage\",\n )\n ) {\n return parseInt(\n this.data[\"j:Job\"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]\n ?.ScanSettings?.[0]?.YResolution[0] ?? \"\",\n );\n }\n return null;\n }\n}\n"]}
|
package/dist/JpegUtil.d.ts
CHANGED
package/dist/JpegUtil.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JpegUtil.js","sourceRoot":"","sources":["../src/JpegUtil.ts"],"names":[],"mappings":"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","sourcesContent":["let debug = false;\n\nconst start_of_Frame_0 = \"FFC0\";\nconst define_number_of_lines = \"FFDC\";\n\nexport default class JpegUtil {\n static setDebug(dbg: boolean) {\n debug = dbg;\n }\n\n private static logDebug(msg: string | object) {\n if (debug) {\n console.log(msg);\n }\n }\n\n private static numToHex(s: number) {\n return s.toString(16).padStart(2, \"0\").toUpperCase();\n }\n\n static GetJpgSize(buffer: Buffer): { height: number; width: number } | null {\n let size: { height: number; width: number } | null = null;\n this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n if (6 < length) {\n const pHeight = buffer[start + 3] * 256 + buffer[start + 4];\n const pWidth = buffer[start + 5] * 256 + buffer[start + 6];\n\n size = { height: pHeight, width: pWidth };\n }\n\n // stop processing\n return true;\n },\n });\n return size;\n }\n\n static setJpgSize(\n buffer: Buffer,\n size: { height: number; width: number },\n ): boolean {\n let sizeWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n if (6 < length) {\n const height = Buffer.from([0x00, 0x00]);\n height.writeInt16BE(size.height);\n buffer[start + 3] = height[0];\n buffer[start + 4] = height[1];\n\n const width = Buffer.from([0x00, 0x00]);\n width.writeInt16BE(size.width);\n buffer[start + 5] = width[0];\n buffer[start + 6] = width[1];\n\n sizeWritten = true;\n }\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return sizeWritten;\n }\n\n static setJpgHeight(buffer: Buffer, height: number): boolean {\n let heightWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n heightWritten = this.writeHeightInStartOfFrame(\n buffer,\n start,\n length,\n height,\n );\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return heightWritten;\n }\n\n static fixSizeWithDNL(buffer: Buffer): number | null {\n let numberOfLine: number | null = null;\n let startOfStartOfFrame: number | null = null;\n let lengthOfStartOfFrame: number | null = null;\n this.parse(buffer, {\n [define_number_of_lines]: (start: number, length: number) => {\n numberOfLine = this.readNumberOfLineFromDNL(buffer, start, length);\n return false; // don't stop\n },\n [start_of_Frame_0]: (start: number, length: number) => {\n startOfStartOfFrame = start;\n lengthOfStartOfFrame = length;\n return false; // don't stop\n },\n });\n\n if (numberOfLine == null) {\n this.logDebug(\"DNL marker not found impossible to fix height\");\n return null;\n }\n\n if (startOfStartOfFrame == null || lengthOfStartOfFrame == null) {\n this.logDebug(\n \"Start of frame 0 not found, either jpeg parsing is broken either the stream is corrupted\",\n );\n return null;\n }\n\n if (\n this.writeHeightInStartOfFrame(\n buffer,\n startOfStartOfFrame,\n lengthOfStartOfFrame,\n numberOfLine,\n )\n ) {\n return numberOfLine;\n }\n return null;\n }\n\n private static writeHeightInStartOfFrame(\n buffer: Buffer,\n startOfStartOfFrame: number,\n lengthOfStartOfFrame: number,\n numberOfLine: number,\n ): boolean {\n // write the picture height\n if (6 < lengthOfStartOfFrame) {\n const heightBuffer = Buffer.from([0x00, 0x00]);\n heightBuffer.writeInt16BE(numberOfLine);\n buffer[startOfStartOfFrame + 3] = heightBuffer[0];\n buffer[startOfStartOfFrame + 4] = heightBuffer[1];\n\n return true;\n }\n\n return false;\n }\n\n static readNumberOfLineFromDNL(\n buffer: Buffer,\n start: number,\n length: number,\n ): number | null {\n let numberOfLine: number | null = null;\n\n // read the number of line\n if (3 < length) {\n numberOfLine = buffer[start + 2] * 256 + buffer[start + 3];\n }\n\n return numberOfLine;\n }\n static parse(\n buffer: Buffer,\n markerHandler: {\n [key: string]: (start: number, length: number) => boolean;\n },\n ): boolean {\n let i: number = 0;\n\n if (!this.isSOIHeader(i, buffer)) {\n this.logDebug(\"Not a valid SOI header\");\n return false;\n }\n\n i += 4;\n\n // Check for valid JPEG header (null terminated JFIF)\n if (!this.isValidJpegHeader(i, buffer)) {\n this.logDebug(\"Not a valid JFIF string\");\n return false;\n }\n\n return this.parseMarker(buffer, i, markerHandler);\n }\n\n private static isValidJpegHeader(i: number, buffer: Buffer) {\n return (\n i + 6 < buffer.length &&\n buffer[i + 2] == \"J\".charCodeAt(0) &&\n buffer[i + 3] == \"F\".charCodeAt(0) &&\n buffer[i + 4] == \"I\".charCodeAt(0) &&\n buffer[i + 5] == \"F\".charCodeAt(0) &&\n buffer[i + 6] == 0x00\n );\n }\n\n private static isSOIHeader(i: number, buffer: Buffer) {\n return (\n i + 3 < buffer.length &&\n buffer[i] == 0xff &&\n buffer[i + 1] == 0xd8 &&\n buffer[i + 2] == 0xff &&\n buffer[i + 3] == 0xe0\n );\n }\n\n private static getBlockLength(\n buffer: Buffer,\n i: number,\n marker: string,\n ): number | null {\n if (\n marker === \"FFDA\" ||\n marker === \"FFD0\" ||\n marker === \"FFD1\" ||\n marker === \"FFD2\" ||\n marker === \"FFD3\" ||\n marker === \"FFD4\" ||\n marker === \"FFD5\" ||\n marker === \"FFD6\" ||\n marker === \"FFD7\"\n ) {\n return JpegUtil.findCurrentBlockSize(buffer, i + 2, marker);\n } else {\n // read the new block length\n const blockLength = buffer[i + 2] * 256 + buffer[i + 3];\n\n this.logDebug(`block size for ${marker} is ${blockLength}`);\n return blockLength;\n }\n }\n\n private static findCurrentBlockSize(\n buffer: Buffer,\n i: number,\n current_marker: string,\n ): number | null {\n for (let j = 0; i + j < buffer.length; j++) {\n if (buffer[i + j] === 0xff) {\n if (i + j + 1 < buffer.length) {\n if (buffer[i + j + 1] == 0x00) {\n // it's ok just continue\n } else {\n // we've just found the end of the Start of Scan\n return j;\n }\n } else {\n this.logDebug(\n `Premature end of stream reach while searching for the block size inside marker ${current_marker}`,\n );\n return null;\n }\n }\n }\n return null;\n }\n\n private static parseMarker(\n buffer: Buffer,\n i: number,\n markerHandler: {\n [key: string]: (start: number, length: number) => boolean;\n },\n ): boolean {\n let marker = \"\";\n\n //Retrieve the block length of the first block since the first block will not contain the size of file\n let blockLength = buffer[i] * 256 + buffer[i + 1];\n\n //Increase the file index to get to the next block\n i += blockLength;\n while (i < buffer.length) {\n if (buffer[i] != 0xff) {\n this.logDebug(\n \"We should be at the begining of the next block, but got: \" +\n buffer[i],\n );\n return false;\n }\n\n if (i + 1 >= buffer.length) {\n this.logDebug(\"End of stream prematurely found in marker: \" + marker);\n return false;\n }\n\n if (buffer[i + 1] == 0x00) {\n this.logDebug(`Bad marker at ${i} 0x00 just after marker ${marker}`);\n return false;\n }\n\n marker = this.numToHex(buffer[i]) + this.numToHex(buffer[i + 1]);\n\n const foundBlockLength = this.getBlockLength(buffer, i, marker);\n if (foundBlockLength == null) {\n this.logDebug(\n `Was not able to determine block size for marker ${marker}`,\n );\n return false;\n }\n blockLength = foundBlockLength;\n\n const handler = markerHandler[marker];\n if (handler != null && handler(i + 2, blockLength)) {\n return true;\n }\n\n i = i + 2 + blockLength;\n }\n\n this.logDebug(\"End of payload reached\");\n return true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"JpegUtil.js","sourceRoot":"","sources":["../src/JpegUtil.ts"],"names":[],"mappings":"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","sourcesContent":["let debug = false;\n\nconst start_of_Frame_0 = \"FFC0\";\nconst define_number_of_lines = \"FFDC\";\n\nexport default class JpegUtil {\n static setDebug(dbg: boolean) {\n debug = dbg;\n }\n\n private static logDebug(msg: string | object) {\n if (debug) {\n console.log(msg);\n }\n }\n\n private static numToHex(s: number) {\n return s.toString(16).padStart(2, \"0\").toUpperCase();\n }\n\n static GetJpgSize(buffer: Buffer): { height: number; width: number } | null {\n let size: { height: number; width: number } | null = null;\n this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n if (6 < length) {\n const pHeight = buffer[start + 3] * 256 + buffer[start + 4];\n const pWidth = buffer[start + 5] * 256 + buffer[start + 6];\n\n size = { height: pHeight, width: pWidth };\n }\n\n // stop processing\n return true;\n },\n });\n return size;\n }\n\n static setJpgSize(\n buffer: Buffer,\n size: { height: number; width: number },\n ): boolean {\n let sizeWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n if (6 < length) {\n const height = Buffer.from([0x00, 0x00]);\n height.writeInt16BE(size.height);\n buffer[start + 3] = height[0];\n buffer[start + 4] = height[1];\n\n const width = Buffer.from([0x00, 0x00]);\n width.writeInt16BE(size.width);\n buffer[start + 5] = width[0];\n buffer[start + 6] = width[1];\n\n sizeWritten = true;\n }\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return sizeWritten;\n }\n\n static setJpgHeight(buffer: Buffer, height: number): boolean {\n let heightWritten = false;\n const parsingSucceed = this.parse(buffer, {\n [start_of_Frame_0]: (start: number, length: number) => {\n // read the \"Start of frame\" marker which contains the file size\n\n // write the picture size\n heightWritten = this.writeHeightInStartOfFrame(\n buffer,\n start,\n length,\n height,\n );\n\n // stop processing\n return true;\n },\n });\n\n if (!parsingSucceed) {\n return false;\n }\n\n return heightWritten;\n }\n\n static fixSizeWithDNL(buffer: Buffer): number | null {\n let numberOfLine: number | null = null;\n let startOfStartOfFrame: number | null = null;\n let lengthOfStartOfFrame: number | null = null;\n this.parse(buffer, {\n [define_number_of_lines]: (start: number, length: number) => {\n numberOfLine = this.readNumberOfLineFromDNL(buffer, start, length);\n return false; // don't stop\n },\n [start_of_Frame_0]: (start: number, length: number) => {\n startOfStartOfFrame = start;\n lengthOfStartOfFrame = length;\n return false; // don't stop\n },\n });\n\n if (numberOfLine == null) {\n this.logDebug(\"DNL marker not found impossible to fix height\");\n return null;\n }\n\n if (startOfStartOfFrame == null || lengthOfStartOfFrame == null) {\n this.logDebug(\n \"Start of frame 0 not found, either jpeg parsing is broken either the stream is corrupted\",\n );\n return null;\n }\n\n if (\n this.writeHeightInStartOfFrame(\n buffer,\n startOfStartOfFrame,\n lengthOfStartOfFrame,\n numberOfLine,\n )\n ) {\n return numberOfLine;\n }\n return null;\n }\n\n private static writeHeightInStartOfFrame(\n buffer: Buffer,\n startOfStartOfFrame: number,\n lengthOfStartOfFrame: number,\n numberOfLine: number,\n ): boolean {\n // write the picture height\n if (6 < lengthOfStartOfFrame) {\n const heightBuffer = Buffer.from([0x00, 0x00]);\n heightBuffer.writeInt16BE(numberOfLine);\n buffer[startOfStartOfFrame + 3] = heightBuffer[0];\n buffer[startOfStartOfFrame + 4] = heightBuffer[1];\n\n return true;\n }\n\n return false;\n }\n\n static readNumberOfLineFromDNL(\n buffer: Buffer,\n start: number,\n length: number,\n ): number | null {\n let numberOfLine: number | null = null;\n\n // read the number of line\n if (3 < length) {\n numberOfLine = buffer[start + 2] * 256 + buffer[start + 3];\n }\n\n return numberOfLine;\n }\n static parse(\n buffer: Buffer,\n markerHandler: {\n [key: string]: (start: number, length: number) => boolean;\n },\n ): boolean {\n let i: number = 0;\n\n if (!this.isSOIHeader(i, buffer)) {\n this.logDebug(\"Not a valid SOI header\");\n return false;\n }\n\n i += 4;\n\n // Check for valid JPEG header (null terminated JFIF)\n if (!this.isValidJpegHeader(i, buffer)) {\n this.logDebug(\"Not a valid JFIF string\");\n return false;\n }\n\n return this.parseMarker(buffer, i, markerHandler);\n }\n\n private static isValidJpegHeader(i: number, buffer: Buffer) {\n return (\n i + 6 < buffer.length &&\n buffer[i + 2] == \"J\".charCodeAt(0) &&\n buffer[i + 3] == \"F\".charCodeAt(0) &&\n buffer[i + 4] == \"I\".charCodeAt(0) &&\n buffer[i + 5] == \"F\".charCodeAt(0) &&\n buffer[i + 6] == 0x00\n );\n }\n\n private static isSOIHeader(i: number, buffer: Buffer) {\n return (\n i + 3 < buffer.length &&\n buffer[i] == 0xff &&\n buffer[i + 1] == 0xd8 &&\n buffer[i + 2] == 0xff &&\n buffer[i + 3] == 0xe0\n );\n }\n\n private static getBlockLength(\n buffer: Buffer,\n i: number,\n marker: string,\n ): number | null {\n if (\n marker === \"FFDA\" ||\n marker === \"FFD0\" ||\n marker === \"FFD1\" ||\n marker === \"FFD2\" ||\n marker === \"FFD3\" ||\n marker === \"FFD4\" ||\n marker === \"FFD5\" ||\n marker === \"FFD6\" ||\n marker === \"FFD7\"\n ) {\n return JpegUtil.findCurrentBlockSize(buffer, i + 2, marker);\n } else {\n // read the new block length\n const blockLength = buffer[i + 2] * 256 + buffer[i + 3];\n\n this.logDebug(`block size for ${marker} is ${blockLength}`);\n return blockLength;\n }\n }\n\n private static findCurrentBlockSize(\n buffer: Buffer,\n i: number,\n current_marker: string,\n ): number | null {\n for (let j = 0; i + j < buffer.length; j++) {\n if (buffer[i + j] === 0xff) {\n if (i + j + 1 < buffer.length) {\n if (buffer[i + j + 1] == 0x00) {\n // it's ok just continue\n } else {\n // we've just found the end of the Start of Scan\n return j;\n }\n } else {\n this.logDebug(\n `Premature end of stream reach while searching for the block size inside marker ${current_marker}`,\n );\n return null;\n }\n }\n }\n return null;\n }\n\n private static parseMarker(\n buffer: Buffer,\n i: number,\n markerHandler: {\n [key: string]: (start: number, length: number) => boolean;\n },\n ): boolean {\n let marker = \"\";\n\n //Retrieve the block length of the first block since the first block will not contain the size of file\n let blockLength = buffer[i] * 256 + buffer[i + 1];\n\n //Increase the file index to get to the next block\n i += blockLength;\n while (i < buffer.length) {\n if (buffer[i] != 0xff) {\n this.logDebug(\n \"We should be at the begining of the next block, but got: \" +\n buffer[i],\n );\n return false;\n }\n\n if (i + 1 >= buffer.length) {\n this.logDebug(\"End of stream prematurely found in marker: \" + marker);\n return false;\n }\n\n if (buffer[i + 1] == 0x00) {\n this.logDebug(`Bad marker at ${i} 0x00 just after marker ${marker}`);\n return false;\n }\n\n marker = this.numToHex(buffer[i]) + this.numToHex(buffer[i + 1]);\n\n const foundBlockLength = this.getBlockLength(buffer, i, marker);\n if (foundBlockLength == null) {\n this.logDebug(\n `Was not able to determine block size for marker ${marker}`,\n );\n return false;\n }\n blockLength = foundBlockLength;\n\n const handler = markerHandler[marker];\n if (handler != null && handler(i + 2, blockLength)) {\n return true;\n }\n\n i = i + 2 + blockLength;\n }\n\n this.logDebug(\"End of payload reached\");\n return true;\n }\n}\n"]}
|