node-hp-scan-to 1.2.2 → 1.3.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.
Files changed (283) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -10
  3. package/dist/Destination.js +36 -84
  4. package/dist/Destination.js.map +1 -1
  5. package/dist/DeviceCapabilities.d.ts +4 -0
  6. package/dist/DeviceCapabilities.js +3 -0
  7. package/dist/DeviceCapabilities.js.map +1 -0
  8. package/dist/DiscoveryTree.d.ts +16 -0
  9. package/dist/DiscoveryTree.js +38 -0
  10. package/dist/DiscoveryTree.js.map +1 -0
  11. package/dist/Event.d.ts +1 -1
  12. package/dist/Event.js +24 -39
  13. package/dist/Event.js.map +1 -1
  14. package/dist/EventTable.d.ts +5 -0
  15. package/dist/EventTable.js +24 -18
  16. package/dist/EventTable.js.map +1 -1
  17. package/dist/HPApi.d.ts +26 -18
  18. package/dist/HPApi.js +386 -461
  19. package/dist/HPApi.js.map +1 -1
  20. package/dist/Job.d.ts +8 -7
  21. package/dist/Job.js +69 -86
  22. package/dist/Job.js.map +1 -1
  23. package/dist/JpegUtil.js +73 -82
  24. package/dist/JpegUtil.js.map +1 -1
  25. package/dist/KnownShortcut.d.ts +1 -0
  26. package/dist/KnownShortcut.js +3 -0
  27. package/dist/KnownShortcut.js.map +1 -0
  28. package/dist/PathHelper.d.ts +2 -1
  29. package/dist/PathHelper.js +41 -68
  30. package/dist/PathHelper.js.map +1 -1
  31. package/dist/ScanCaps.d.ts +7 -0
  32. package/dist/ScanCaps.js +17 -0
  33. package/dist/ScanCaps.js.map +1 -0
  34. package/dist/ScanContent.js +18 -73
  35. package/dist/ScanContent.js.map +1 -1
  36. package/dist/ScanJobManifest.d.ts +23 -0
  37. package/dist/ScanJobManifest.js +24 -0
  38. package/dist/ScanJobManifest.js.map +1 -0
  39. package/dist/ScanJobSettings.d.ts +3 -1
  40. package/dist/ScanJobSettings.js +48 -88
  41. package/dist/ScanJobSettings.js.map +1 -1
  42. package/dist/ScanStatus.d.ts +1 -0
  43. package/dist/ScanStatus.js +27 -28
  44. package/dist/ScanStatus.js.map +1 -1
  45. package/dist/WalkupScanDestination.d.ts +11 -13
  46. package/dist/WalkupScanDestination.js +32 -35
  47. package/dist/WalkupScanDestination.js.map +1 -1
  48. package/dist/WalkupScanDestinations.d.ts +1 -0
  49. package/dist/WalkupScanDestinations.js +21 -18
  50. package/dist/WalkupScanDestinations.js.map +1 -1
  51. package/dist/WalkupScanManifest.d.ts +23 -0
  52. package/dist/WalkupScanManifest.js +25 -0
  53. package/dist/WalkupScanManifest.js.map +1 -0
  54. package/dist/WalkupScanToCompCaps.d.ts +12 -0
  55. package/dist/WalkupScanToCompCaps.js +20 -0
  56. package/dist/WalkupScanToCompCaps.js.map +1 -0
  57. package/dist/WalkupScanToCompDestination.d.ts +10 -14
  58. package/dist/WalkupScanToCompDestination.js +32 -38
  59. package/dist/WalkupScanToCompDestination.js.map +1 -1
  60. package/dist/WalkupScanToCompDestinations.d.ts +1 -0
  61. package/dist/WalkupScanToCompDestinations.js +21 -18
  62. package/dist/WalkupScanToCompDestinations.js.map +1 -1
  63. package/dist/WalkupScanToCompEvent.d.ts +2 -1
  64. package/dist/WalkupScanToCompEvent.js +14 -11
  65. package/dist/WalkupScanToCompEvent.js.map +1 -1
  66. package/dist/WalkupScanToCompManifest.d.ts +23 -0
  67. package/dist/WalkupScanToCompManifest.js +25 -0
  68. package/dist/WalkupScanToCompManifest.js.map +1 -0
  69. package/dist/delay.d.ts +1 -0
  70. package/dist/delay.js +10 -0
  71. package/dist/delay.js.map +1 -0
  72. package/dist/fixJpegSize.d.ts +19 -0
  73. package/dist/fixJpegSize.js +292 -0
  74. package/dist/fixJpegSize.js.map +1 -0
  75. package/dist/index.js +209 -607
  76. package/dist/index.js.map +1 -1
  77. package/dist/listening.d.ts +9 -0
  78. package/dist/listening.js +108 -0
  79. package/dist/listening.js.map +1 -0
  80. package/dist/models/Destination.d.ts +8 -0
  81. package/dist/models/Destination.js +68 -0
  82. package/dist/models/Destination.js.map +1 -0
  83. package/dist/models/DiscoveryTree.d.ts +16 -0
  84. package/dist/models/DiscoveryTree.js +38 -0
  85. package/dist/models/DiscoveryTree.js.map +1 -0
  86. package/dist/models/Event.d.ts +21 -0
  87. package/dist/models/Event.js +32 -0
  88. package/dist/models/Event.js.map +1 -0
  89. package/dist/models/EventTable.d.ts +16 -0
  90. package/dist/models/EventTable.js +33 -0
  91. package/dist/models/EventTable.js.map +1 -0
  92. package/dist/models/Job.d.ts +37 -0
  93. package/dist/models/Job.js +78 -0
  94. package/dist/models/Job.js.map +1 -0
  95. package/dist/models/ScanCaps.d.ts +7 -0
  96. package/dist/models/ScanCaps.js +17 -0
  97. package/dist/models/ScanCaps.js.map +1 -0
  98. package/dist/models/ScanJobManifest.d.ts +23 -0
  99. package/dist/models/ScanJobManifest.js +24 -0
  100. package/dist/models/ScanJobManifest.js.map +1 -0
  101. package/dist/models/ScanJobSettings.d.ts +8 -0
  102. package/dist/models/ScanJobSettings.js +56 -0
  103. package/dist/models/ScanJobSettings.js.map +1 -0
  104. package/dist/models/WalkupScanDestination.d.ts +22 -0
  105. package/dist/models/WalkupScanDestination.js +38 -0
  106. package/dist/models/WalkupScanDestination.js.map +1 -0
  107. package/dist/models/WalkupScanDestinations.d.ts +12 -0
  108. package/dist/models/WalkupScanDestinations.js +30 -0
  109. package/dist/models/WalkupScanDestinations.js.map +1 -0
  110. package/dist/models/WalkupScanManifest.d.ts +23 -0
  111. package/dist/models/WalkupScanManifest.js +25 -0
  112. package/dist/models/WalkupScanManifest.js.map +1 -0
  113. package/dist/models/WalkupScanToCompCaps.d.ts +12 -0
  114. package/dist/models/WalkupScanToCompCaps.js +20 -0
  115. package/dist/models/WalkupScanToCompCaps.js.map +1 -0
  116. package/dist/models/WalkupScanToCompDestination.d.ts +22 -0
  117. package/dist/models/WalkupScanToCompDestination.js +38 -0
  118. package/dist/models/WalkupScanToCompDestination.js.map +1 -0
  119. package/dist/models/WalkupScanToCompDestinations.d.ts +12 -0
  120. package/dist/models/WalkupScanToCompDestinations.js +30 -0
  121. package/dist/models/WalkupScanToCompDestinations.js.map +1 -0
  122. package/dist/models/WalkupScanToCompEvent.d.ts +11 -0
  123. package/dist/models/WalkupScanToCompEvent.js +20 -0
  124. package/dist/models/WalkupScanToCompEvent.js.map +1 -0
  125. package/dist/models/WalkupScanToCompManifest.d.ts +23 -0
  126. package/dist/models/WalkupScanToCompManifest.js +25 -0
  127. package/dist/models/WalkupScanToCompManifest.js.map +1 -0
  128. package/dist/readDeviceCapabilities.d.ts +2 -0
  129. package/dist/readDeviceCapabilities.js +41 -0
  130. package/dist/readDeviceCapabilities.js.map +1 -0
  131. package/dist/scanProcess.d.ts +19 -0
  132. package/dist/scanProcess.js +292 -0
  133. package/dist/scanProcess.js.map +1 -0
  134. package/dist/scanProcessing.d.ts +20 -0
  135. package/dist/scanProcessing.js +320 -0
  136. package/dist/scanProcessing.js.map +1 -0
  137. package/dist/src/Destination.d.ts +8 -0
  138. package/dist/src/Destination.js +68 -0
  139. package/dist/src/Destination.js.map +1 -0
  140. package/dist/src/DiscoveryTree.d.ts +16 -0
  141. package/dist/src/DiscoveryTree.js +38 -0
  142. package/dist/src/DiscoveryTree.js.map +1 -0
  143. package/dist/src/Event.d.ts +21 -0
  144. package/dist/src/Event.js +32 -0
  145. package/dist/src/Event.js.map +1 -0
  146. package/dist/src/EventTable.d.ts +16 -0
  147. package/dist/src/EventTable.js +33 -0
  148. package/dist/src/EventTable.js.map +1 -0
  149. package/dist/src/HPApi.d.ts +50 -0
  150. package/dist/src/HPApi.js +454 -0
  151. package/dist/src/HPApi.js.map +1 -0
  152. package/dist/src/Job.d.ts +37 -0
  153. package/dist/src/Job.js +78 -0
  154. package/dist/src/Job.js.map +1 -0
  155. package/dist/src/JpegUtil.d.ts +26 -0
  156. package/dist/src/JpegUtil.js +229 -0
  157. package/dist/src/JpegUtil.js.map +1 -0
  158. package/dist/src/KnownShortcut.d.ts +1 -0
  159. package/dist/src/KnownShortcut.js +3 -0
  160. package/dist/src/KnownShortcut.js.map +1 -0
  161. package/dist/src/PathHelper.d.ts +6 -0
  162. package/dist/src/PathHelper.js +52 -0
  163. package/dist/src/PathHelper.js.map +1 -0
  164. package/dist/src/ScanCaps.d.ts +7 -0
  165. package/dist/src/ScanCaps.js +17 -0
  166. package/dist/src/ScanCaps.js.map +1 -0
  167. package/dist/src/ScanJobManifest.d.ts +23 -0
  168. package/dist/src/ScanJobManifest.js +24 -0
  169. package/dist/src/ScanJobManifest.js.map +1 -0
  170. package/dist/src/ScanJobSettings.d.ts +8 -0
  171. package/dist/src/ScanJobSettings.js +56 -0
  172. package/dist/src/ScanJobSettings.js.map +1 -0
  173. package/dist/src/ScanStatus.d.ts +19 -0
  174. package/dist/src/ScanStatus.js +35 -0
  175. package/dist/src/ScanStatus.js.map +1 -0
  176. package/dist/src/WalkupScanDestination.d.ts +22 -0
  177. package/dist/src/WalkupScanDestination.js +38 -0
  178. package/dist/src/WalkupScanDestination.js.map +1 -0
  179. package/dist/src/WalkupScanDestinations.d.ts +12 -0
  180. package/dist/src/WalkupScanDestinations.js +30 -0
  181. package/dist/src/WalkupScanDestinations.js.map +1 -0
  182. package/dist/src/WalkupScanManifest.d.ts +23 -0
  183. package/dist/src/WalkupScanManifest.js +25 -0
  184. package/dist/src/WalkupScanManifest.js.map +1 -0
  185. package/dist/src/WalkupScanToCompCaps.d.ts +12 -0
  186. package/dist/src/WalkupScanToCompCaps.js +20 -0
  187. package/dist/src/WalkupScanToCompCaps.js.map +1 -0
  188. package/dist/src/WalkupScanToCompDestination.d.ts +22 -0
  189. package/dist/src/WalkupScanToCompDestination.js +38 -0
  190. package/dist/src/WalkupScanToCompDestination.js.map +1 -0
  191. package/dist/src/WalkupScanToCompDestinations.d.ts +12 -0
  192. package/dist/src/WalkupScanToCompDestinations.js +30 -0
  193. package/dist/src/WalkupScanToCompDestinations.js.map +1 -0
  194. package/dist/src/WalkupScanToCompEvent.d.ts +11 -0
  195. package/dist/src/WalkupScanToCompEvent.js +20 -0
  196. package/dist/src/WalkupScanToCompEvent.js.map +1 -0
  197. package/dist/src/WalkupScanToCompManifest.d.ts +23 -0
  198. package/dist/src/WalkupScanToCompManifest.js +25 -0
  199. package/dist/src/WalkupScanToCompManifest.js.map +1 -0
  200. package/dist/src/delay.d.ts +1 -0
  201. package/dist/src/delay.js +10 -0
  202. package/dist/src/delay.js.map +1 -0
  203. package/dist/test/DiscoveryTree.test.d.ts +1 -0
  204. package/dist/test/DiscoveryTree.test.js +68 -0
  205. package/dist/test/DiscoveryTree.test.js.map +1 -0
  206. package/dist/test/EtagEventTable.test.d.ts +1 -0
  207. package/dist/test/EtagEventTable.test.js +93 -0
  208. package/dist/test/EtagEventTable.test.js.map +1 -0
  209. package/dist/test/Job.test.d.ts +1 -0
  210. package/dist/test/Job.test.js +104 -0
  211. package/dist/test/Job.test.js.map +1 -0
  212. package/dist/test/JpegUtil.test.d.ts +1 -0
  213. package/dist/test/JpegUtil.test.js +51 -0
  214. package/dist/test/JpegUtil.test.js.map +1 -0
  215. package/dist/test/PathHelper.test.d.ts +1 -0
  216. package/dist/test/PathHelper.test.js +99 -0
  217. package/dist/test/PathHelper.test.js.map +1 -0
  218. package/dist/test/ScanJobManifest.test.d.ts +1 -0
  219. package/dist/test/ScanJobManifest.test.js +56 -0
  220. package/dist/test/ScanJobManifest.test.js.map +1 -0
  221. package/dist/test/ScanJobSettings.test.d.ts +1 -0
  222. package/dist/test/ScanJobSettings.test.js +53 -0
  223. package/dist/test/ScanJobSettings.test.js.map +1 -0
  224. package/dist/test/ScanStatus.test.d.ts +1 -0
  225. package/dist/test/ScanStatus.test.js +75 -0
  226. package/dist/test/ScanStatus.test.js.map +1 -0
  227. package/dist/test/WalkupScanDestination.test.d.ts +1 -0
  228. package/dist/test/WalkupScanDestination.test.js +80 -0
  229. package/dist/test/WalkupScanDestination.test.js.map +1 -0
  230. package/dist/test/WalkupScanDestinations.test.d.ts +1 -0
  231. package/dist/test/WalkupScanDestinations.test.js +68 -0
  232. package/dist/test/WalkupScanDestinations.test.js.map +1 -0
  233. package/dist/test/WalkupScanManifest.test.d.ts +1 -0
  234. package/dist/test/WalkupScanManifest.test.js +46 -0
  235. package/dist/test/WalkupScanManifest.test.js.map +1 -0
  236. package/dist/test/WalkupScanToCompCaps.test.d.ts +1 -0
  237. package/dist/test/WalkupScanToCompCaps.test.js +56 -0
  238. package/dist/test/WalkupScanToCompCaps.test.js.map +1 -0
  239. package/dist/test/WalkupScanToCompDestination.test.d.ts +1 -0
  240. package/dist/test/WalkupScanToCompDestination.test.js +58 -0
  241. package/dist/test/WalkupScanToCompDestination.test.js.map +1 -0
  242. package/dist/test/WalkupScanToCompDestinations.test.d.ts +1 -0
  243. package/dist/test/WalkupScanToCompDestinations.test.js +58 -0
  244. package/dist/test/WalkupScanToCompDestinations.test.js.map +1 -0
  245. package/dist/test/WalkupScanToCompEvent.test.d.ts +1 -0
  246. package/dist/test/WalkupScanToCompEvent.test.js +46 -0
  247. package/dist/test/WalkupScanToCompEvent.test.js.map +1 -0
  248. package/dist/test/WalkupScanToCompManifest.test.d.ts +1 -0
  249. package/dist/test/WalkupScanToCompManifest.test.js +46 -0
  250. package/dist/test/WalkupScanToCompManifest.test.js.map +1 -0
  251. package/dist/test/clean.d.ts +1 -0
  252. package/dist/test/clean.js +21 -0
  253. package/dist/test/clean.js.map +1 -0
  254. package/package.json +27 -18
  255. package/src/Destination.ts +1 -1
  256. package/src/DeviceCapabilities.ts +4 -0
  257. package/src/DiscoveryTree.ts +56 -0
  258. package/src/Event.ts +17 -7
  259. package/src/EventTable.ts +20 -0
  260. package/src/HPApi.ts +245 -103
  261. package/src/Job.ts +51 -29
  262. package/src/JpegUtil.ts +8 -4
  263. package/src/KnownShortcut.ts +6 -0
  264. package/src/PathHelper.ts +47 -13
  265. package/src/ScanCaps.ts +19 -0
  266. package/src/ScanContent.ts +4 -1
  267. package/src/ScanJobManifest.ts +55 -0
  268. package/src/ScanJobSettings.ts +18 -3
  269. package/src/ScanStatus.ts +9 -0
  270. package/src/WalkupScanDestination.ts +42 -18
  271. package/src/WalkupScanDestinations.ts +12 -0
  272. package/src/WalkupScanManifest.ts +59 -0
  273. package/src/WalkupScanToCompCaps.ts +36 -0
  274. package/src/WalkupScanToCompDestination.ts +38 -24
  275. package/src/WalkupScanToCompDestinations.ts +12 -0
  276. package/src/WalkupScanToCompEvent.ts +15 -3
  277. package/src/WalkupScanToCompManifest.ts +59 -0
  278. package/src/delay.ts +5 -0
  279. package/src/index.ts +267 -465
  280. package/src/listening.ts +145 -0
  281. package/src/readDeviceCapabilities.ts +46 -0
  282. package/src/scanProcessing.ts +535 -0
  283. package/tsconfig.json +1 -1
package/src/HPApi.ts CHANGED
@@ -1,54 +1,53 @@
1
1
  "use strict";
2
2
 
3
- import WalkupScanDestination, {
4
- WalkupScanDestinationData,
5
- } from "./WalkupScanDestination";
6
- import WalkupScanToCompDestination, {
7
- WalkupScanToCompDestinationData,
8
- } from "./WalkupScanToCompDestination";
9
3
  import { promisify } from "util";
10
4
  import fs from "fs";
11
5
  import axios, {
12
6
  AxiosError,
13
7
  AxiosRequestConfig,
14
- AxiosRequestHeaders,
15
8
  AxiosResponse,
9
+ RawAxiosRequestHeaders,
16
10
  } from "axios";
17
11
  import { URL } from "url";
18
- import { Parser } from "xml2js";
19
- import * as stream from 'stream/promises';
20
- import EventTable, { EventTableData } from "./EventTable";
21
- import Job, { JobData } from "./Job";
22
- import ScanStatus, { ScanStatusData } from "./ScanStatus";
23
- import WalkupScanDestinations, {
24
- WalkupScanDestinationsData,
25
- } from "./WalkupScanDestinations";
26
- import WalkupScanToCompDestinations, {
27
- WalkupScanToCompDestinationsData,
28
- } from "./WalkupScanToCompDestinations";
12
+ import * as stream from "stream";
13
+ import { Stream } from "stream";
14
+ import EventTable, { EtagEventTable } from "./EventTable";
15
+ import Job from "./Job";
16
+ import ScanStatus from "./ScanStatus";
17
+ import WalkupScanDestination from "./WalkupScanDestination";
18
+ import WalkupScanToCompDestination from "./WalkupScanToCompDestination";
19
+ import WalkupScanDestinations from "./WalkupScanDestinations";
20
+ import WalkupScanToCompDestinations from "./WalkupScanToCompDestinations";
29
21
  import ScanJobSettings from "./ScanJobSettings";
30
22
  import Destination from "./Destination";
31
- import { Stream } from "stream";
32
- import WalkupScanToCompEvent, {
33
- WalkupScanToCompEventData,
34
- } from "./WalkupScanToCompEvent";
23
+ import WalkupScanToCompEvent from "./WalkupScanToCompEvent";
24
+ import DiscoveryTree from "./DiscoveryTree";
25
+ import WalkupScanToCompManifest from "./WalkupScanToCompManifest";
26
+ import WalkupScanToCompCaps from "./WalkupScanToCompCaps";
27
+ import WalkupScanManifest from "./WalkupScanManifest";
28
+ import ScanJobManifest from "./ScanJobManifest";
29
+ import ScanCaps from "./ScanCaps";
30
+ import { delay } from "./delay";
31
+ import * as net from "net";
35
32
 
36
- const parser = new Parser();
37
- const parseString = promisify<string, any>(parser.parseString);
38
33
  let printerIP = "192.168.1.11";
39
34
  let debug = false;
40
35
  let callCount = 0;
41
36
 
42
37
  export default class HPApi {
43
- static setPrinterIP(ip: string) {
38
+ static setDeviceIP(ip: string): void {
44
39
  printerIP = ip;
45
40
  }
46
41
 
47
- static setDebug(dbg: boolean) {
42
+ static setDebug(dbg: boolean): void {
48
43
  debug = dbg;
49
44
  }
50
45
 
51
- private static logDebug(callId: number, isRequest: boolean, msg: any) {
46
+ private static logDebug(
47
+ callId: number,
48
+ isRequest: boolean,
49
+ msg: object | string
50
+ ): void {
52
51
  if (debug) {
53
52
  const id = String(callId).padStart(4, "0");
54
53
  const content = typeof msg === "string" ? msg : JSON.stringify(msg);
@@ -56,11 +55,16 @@ export default class HPApi {
56
55
  }
57
56
  }
58
57
 
59
- private static async callAxios(request: AxiosRequestConfig) {
58
+ private static async callAxios(
59
+ request: AxiosRequestConfig
60
+ ): Promise<AxiosResponse<string>> {
60
61
  callCount++;
62
+ if (request.timeout === 0) {
63
+ request.timeout = 100_000;
64
+ }
61
65
  HPApi.logDebug(callCount, true, request);
62
66
  try {
63
- const response = (await axios(request)) as AxiosResponse<string>;
67
+ const response = await axios(request);
64
68
  HPApi.logDebug(callCount, false, {
65
69
  status: response.status,
66
70
  data: response.data,
@@ -83,10 +87,47 @@ export default class HPApi {
83
87
  }
84
88
  }
85
89
 
86
- static async getWalkupScanDestinations(): Promise<WalkupScanDestinations> {
90
+ static async isAlive(timeout: number | null = null): Promise<boolean> {
91
+ const definedTimeout = timeout || 10000; // default of 10 seconds
92
+ return new Promise((resolve) => {
93
+ const socket = net.createConnection(80, printerIP, () => {
94
+ clearTimeout(timer);
95
+ resolve(true);
96
+ socket.end();
97
+ });
98
+ const timer = setTimeout(() => {
99
+ resolve(false);
100
+ socket.end();
101
+ }, definedTimeout);
102
+ socket.on("error", () => {
103
+ clearTimeout(timer);
104
+ resolve(false);
105
+ });
106
+ });
107
+ }
108
+
109
+ static async waitDeviceUp(deviceUpPollingInterval: number): Promise<void> {
110
+ let first = true;
111
+ while (!(await HPApi.isAlive())) {
112
+ if (first) {
113
+ console.log(
114
+ `Device ip: ${printerIP} is down! [${new Date().toISOString()}]`
115
+ );
116
+ }
117
+ first = false;
118
+ await delay(deviceUpPollingInterval);
119
+ }
120
+ if (!first) {
121
+ console.log(
122
+ `Device ip: ${printerIP} is up again! [${new Date().toISOString()}]`
123
+ );
124
+ }
125
+ }
126
+
127
+ static async getDiscoveryTree(): Promise<DiscoveryTree> {
87
128
  const response = await HPApi.callAxios({
88
129
  baseURL: `http://${printerIP}`,
89
- url: "/WalkupScan/WalkupScanDestinations",
130
+ url: "/DevMgmt/DiscoveryTree.xml",
90
131
  method: "GET",
91
132
  responseType: "text",
92
133
  });
@@ -94,10 +135,24 @@ export default class HPApi {
94
135
  if (response.status !== 200) {
95
136
  throw new Error(response.statusText);
96
137
  } else {
97
- const parsed = (await parseString(
98
- response.data
99
- )) as WalkupScanDestinationsData;
100
- return new WalkupScanDestinations(parsed);
138
+ return DiscoveryTree.createDiscoveryTree(response.data);
139
+ }
140
+ }
141
+
142
+ static async getWalkupScanDestinations(
143
+ uri: string = "/WalkupScan/WalkupScanDestinations"
144
+ ): Promise<WalkupScanDestinations> {
145
+ const response = await HPApi.callAxios({
146
+ baseURL: `http://${printerIP}`,
147
+ url: uri,
148
+ method: "GET",
149
+ responseType: "text",
150
+ });
151
+
152
+ if (response.status !== 200) {
153
+ throw new Error(response.statusText);
154
+ } else {
155
+ return WalkupScanDestinations.createWalkupScanDestinations(response.data);
101
156
  }
102
157
  }
103
158
 
@@ -112,26 +167,95 @@ export default class HPApi {
112
167
  if (response.status !== 200) {
113
168
  throw new Error(response.statusText);
114
169
  } else {
115
- const parsed = (await parseString(
170
+ return WalkupScanToCompDestinations.createWalkupScanToCompDestinations(
116
171
  response.data
117
- )) as WalkupScanToCompDestinationsData;
118
- return new WalkupScanToCompDestinations(parsed);
172
+ );
119
173
  }
120
174
  }
121
175
 
122
- static async getWalkupScanToCompCaps(): Promise<boolean> {
123
- return HPApi.callAxios({
176
+ static async getWalkupScanManifest(uri: string): Promise<WalkupScanManifest> {
177
+ const response = await HPApi.callAxios({
124
178
  baseURL: `http://${printerIP}`,
125
- url: "/WalkupScanToComp/WalkupScanToCompCaps",
179
+ url: uri,
126
180
  method: "GET",
127
181
  responseType: "text",
128
- }).then(
129
- (response) => response.status == 200,
130
- () => false
131
- );
182
+ });
183
+
184
+ if (response.status !== 200) {
185
+ throw new Error(response.statusText);
186
+ } else {
187
+ return WalkupScanManifest.createWalkupScanManifest(response.data);
188
+ }
189
+ }
190
+ static async getWalkupScanToCompManifest(
191
+ uri: string
192
+ ): Promise<WalkupScanToCompManifest> {
193
+ const response = await HPApi.callAxios({
194
+ baseURL: `http://${printerIP}`,
195
+ url: uri,
196
+ method: "GET",
197
+ responseType: "text",
198
+ });
199
+
200
+ if (response.status !== 200) {
201
+ throw new Error(response.statusText);
202
+ } else {
203
+ return WalkupScanToCompManifest.createWalkupScanToCompManifest(
204
+ response.data
205
+ );
206
+ }
132
207
  }
133
208
 
134
- static async getWalkupScanToCompEvent(compEventURI: string): Promise<WalkupScanToCompEvent> {
209
+ static async getScanJobManifest(uri: string): Promise<ScanJobManifest> {
210
+ const response = await HPApi.callAxios({
211
+ baseURL: `http://${printerIP}`,
212
+ url: uri,
213
+ method: "GET",
214
+ responseType: "text",
215
+ });
216
+
217
+ if (response.status !== 200) {
218
+ throw new Error(response.statusText);
219
+ } else {
220
+ return ScanJobManifest.createScanJobManifest(response.data);
221
+ }
222
+ }
223
+
224
+ static async getScanCaps(uri: string): Promise<ScanCaps> {
225
+ const response = await HPApi.callAxios({
226
+ baseURL: `http://${printerIP}`,
227
+ url: uri,
228
+ method: "GET",
229
+ responseType: "text",
230
+ });
231
+
232
+ if (response.status !== 200) {
233
+ throw new Error(response.statusText);
234
+ } else {
235
+ return ScanCaps.createScanCaps(response.data);
236
+ }
237
+ }
238
+
239
+ static async getWalkupScanToCompCaps(
240
+ uri: string
241
+ ): Promise<WalkupScanToCompCaps> {
242
+ const response = await HPApi.callAxios({
243
+ baseURL: `http://${printerIP}`,
244
+ url: uri,
245
+ method: "GET",
246
+ responseType: "text",
247
+ });
248
+
249
+ if (response.status !== 200) {
250
+ throw new Error(response.statusText);
251
+ } else {
252
+ return WalkupScanToCompCaps.createWalkupScanToCompCaps(response.data);
253
+ }
254
+ }
255
+
256
+ static async getWalkupScanToCompEvent(
257
+ compEventURI: string
258
+ ): Promise<WalkupScanToCompEvent> {
135
259
  const response = await HPApi.callAxios({
136
260
  baseURL: `http://${printerIP}`,
137
261
  url: compEventURI,
@@ -142,38 +266,65 @@ export default class HPApi {
142
266
  if (response.status !== 200) {
143
267
  throw response;
144
268
  } else {
145
- return HPApi.createWalkupScanToCompEvent(response.data);
269
+ return WalkupScanToCompEvent.createWalkupScanToCompEvent(response.data);
146
270
  }
147
271
  }
148
272
 
149
- static async removeDestination(walkupScanDestination: WalkupScanDestination) {
150
- let urlInfo = new URL(walkupScanDestination.resourceURI);
151
-
152
- if (urlInfo.pathname === null) {
153
- throw new Error(
154
- `invalid walkupScanDestination.resourceURI: ${walkupScanDestination.resourceURI}`
155
- );
273
+ static async removeDestination(
274
+ walkupScanDestination: WalkupScanDestination | WalkupScanToCompDestination
275
+ ): Promise<boolean> {
276
+ let path: string;
277
+
278
+ if (walkupScanDestination.resourceURI.startsWith("http")) {
279
+ let urlInfo = new URL(walkupScanDestination.resourceURI);
280
+ if (urlInfo.pathname === null) {
281
+ throw new Error(
282
+ `invalid walkupScanDestination.resourceURI: ${walkupScanDestination.resourceURI}`
283
+ );
284
+ }
285
+ path = urlInfo.pathname;
286
+ } else {
287
+ path = walkupScanDestination.resourceURI;
156
288
  }
157
289
 
158
290
  const response = await HPApi.callAxios({
159
291
  baseURL: `http://${printerIP}`,
160
- url: urlInfo.pathname,
292
+ url: path,
161
293
  method: "DELETE",
162
294
  responseType: "text",
163
295
  });
164
- if (response.status === 204) {
296
+ if (response.status === 204 || response.status == 200) {
165
297
  return true;
166
298
  } else {
167
299
  throw response;
168
300
  }
169
301
  }
170
302
 
171
- static async registerDestination(destination: Destination, toComp: boolean) {
172
- let xml = await destination.toXML();
173
- let url = "/WalkupScan/WalkupScanDestinations";
174
- if (toComp) {
175
- url = "/WalkupScanToComp/WalkupScanToCompDestinations";
303
+ static async registerWalkupScanDestination(
304
+ destination: Destination
305
+ ): Promise<string> {
306
+ const xml = await destination.toXML();
307
+ const url = "/WalkupScan/WalkupScanDestinations";
308
+ const response = await HPApi.callAxios({
309
+ baseURL: `http://${printerIP}`,
310
+ url: url,
311
+ method: "POST",
312
+ headers: { "Content-Type": "text/xml" },
313
+ data: xml,
314
+ responseType: "text",
315
+ });
316
+
317
+ if (response.status === 201 && response.headers.location != null) {
318
+ return new URL(response.headers.location).pathname;
319
+ } else {
320
+ throw response;
176
321
  }
322
+ }
323
+ static async registerWalkupScanToCompDestination(
324
+ destination: Destination
325
+ ): Promise<string> {
326
+ const xml = await destination.toXML();
327
+ const url = "/WalkupScanToComp/WalkupScanToCompDestinations";
177
328
  const response = await HPApi.callAxios({
178
329
  baseURL: `http://${printerIP}`,
179
330
  url: url,
@@ -183,7 +334,7 @@ export default class HPApi {
183
334
  responseType: "text",
184
335
  });
185
336
 
186
- if (response.status === 201) {
337
+ if (response.status === 201 && response.headers.location != null) {
187
338
  return new URL(response.headers.location).pathname;
188
339
  } else {
189
340
  throw response;
@@ -192,9 +343,9 @@ export default class HPApi {
192
343
 
193
344
  static async getEvents(
194
345
  etag = "",
195
- timeout = 0
196
- ): Promise<{ etag: string; eventTable: EventTable }> {
197
- let url = this.appendTimeout("/EventMgmt/EventTable", timeout);
346
+ decisecondTimeout = 0
347
+ ): Promise<EtagEventTable> {
348
+ let url = this.appendTimeout("/EventMgmt/EventTable", decisecondTimeout);
198
349
 
199
350
  let headers = this.placeETagHeader(etag, {});
200
351
 
@@ -206,6 +357,7 @@ export default class HPApi {
206
357
  method: "GET",
207
358
  responseType: "text",
208
359
  headers: headers,
360
+ timeout: decisecondTimeout * 100 * 1.1,
209
361
  });
210
362
  } catch (error) {
211
363
  const axiosError = error as AxiosError;
@@ -221,18 +373,21 @@ export default class HPApi {
221
373
  throw error;
222
374
  }
223
375
 
224
- const parsed = await parseString(response.data);
225
- return {
226
- etag: response.headers["etag"],
227
- eventTable: new EventTable(parsed as EventTableData),
228
- };
376
+ const etagReceived = response.headers["etag"];
377
+ if (etagReceived == null) {
378
+ throw response;
379
+ }
380
+
381
+ const content = response.data;
382
+ return EventTable.createEtagEventTable(content, etagReceived);
229
383
  }
230
384
 
231
- static placeETagHeader(etag: string, headers: AxiosRequestHeaders) {
385
+ static placeETagHeader(
386
+ etag: string,
387
+ headers: RawAxiosRequestHeaders
388
+ ): RawAxiosRequestHeaders {
232
389
  if (etag !== "") {
233
- headers = {
234
- "If-None-Match": etag,
235
- };
390
+ headers["If-None-Match"] = etag;
236
391
  }
237
392
  return headers;
238
393
  }
@@ -247,7 +402,9 @@ export default class HPApi {
247
402
  return url;
248
403
  }
249
404
 
250
- static async getDestination(destinationURL: string) {
405
+ static async getDestination(
406
+ destinationURL: string
407
+ ): Promise<WalkupScanDestination | WalkupScanToCompDestination> {
251
408
  const response = await HPApi.callAxios({
252
409
  baseURL: `http://${printerIP}`,
253
410
  url: destinationURL,
@@ -260,31 +417,16 @@ export default class HPApi {
260
417
  } else {
261
418
  const content = response.data;
262
419
  if (destinationURL.includes("WalkupScanToComp")) {
263
- return this.createWalkupScanToCompDestination(content);
420
+ return WalkupScanToCompDestination.createWalkupScanToCompDestination(
421
+ content
422
+ );
264
423
  } else {
265
- return this.createWalkupScanDestination(content);
424
+ return WalkupScanDestination.createWalkupScanDestination(content);
266
425
  }
267
426
  }
268
427
  }
269
428
 
270
- static async createWalkupScanDestination(content: string) {
271
- const parsed = (await parseString(content)) as WalkupScanDestinationData;
272
- return new WalkupScanDestination(parsed);
273
- }
274
-
275
- static async createWalkupScanToCompDestination(content: string) {
276
- const parsed = (await parseString(
277
- content
278
- )) as WalkupScanToCompDestinationData;
279
- return new WalkupScanToCompDestination(parsed);
280
- }
281
-
282
- static async createWalkupScanToCompEvent(content: string) {
283
- const parsed = (await parseString(content)) as WalkupScanToCompEventData;
284
- return new WalkupScanToCompEvent(parsed);
285
- }
286
-
287
- static async getScanStatus() {
429
+ static async getScanStatus(): Promise<ScanStatus> {
288
430
  const response = await HPApi.callAxios({
289
431
  baseURL: `http://${printerIP}`,
290
432
  url: "/Scan/Status",
@@ -295,18 +437,18 @@ export default class HPApi {
295
437
  if (response.status !== 200) {
296
438
  throw response;
297
439
  } else {
298
- const parsed = (await parseString(response.data)) as ScanStatusData;
299
- return new ScanStatus(parsed);
440
+ let content = response.data;
441
+ return ScanStatus.createScanStatus(content);
300
442
  }
301
443
  }
302
444
 
303
- static delay(t: number) {
445
+ static delay(t: number): Promise<void> {
304
446
  return new Promise(function (resolve) {
305
447
  setTimeout(resolve, t);
306
448
  });
307
449
  }
308
450
 
309
- static async postJob(job: ScanJobSettings) {
451
+ static async postJob(job: ScanJobSettings): Promise<string> {
310
452
  await HPApi.delay(500);
311
453
  const xml = await job.toXML();
312
454
  const response = await HPApi.callAxios({
@@ -318,7 +460,7 @@ export default class HPApi {
318
460
  responseType: "text",
319
461
  });
320
462
 
321
- if (response.status === 201) {
463
+ if (response.status === 201 && response.headers.location != null) {
322
464
  return response.headers.location;
323
465
  } else {
324
466
  throw response;
@@ -339,8 +481,8 @@ export default class HPApi {
339
481
  if (response.status !== 200) {
340
482
  throw response;
341
483
  } else {
342
- const parsed = (await parseString(response.data)) as JobData;
343
- return new Job(parsed);
484
+ const content = response.data;
485
+ return Job.createJob(content);
344
486
  }
345
487
  }
346
488
 
@@ -358,7 +500,7 @@ export default class HPApi {
358
500
  const destinationFileStream = fs.createWriteStream(destination);
359
501
  data.pipe(destinationFileStream);
360
502
 
361
- await stream.finished(destinationFileStream);
503
+ await promisify(stream.finished)(destinationFileStream);
362
504
 
363
505
  return destination;
364
506
  }
package/src/Job.ts CHANGED
@@ -1,4 +1,8 @@
1
1
  "use strict";
2
+ import { Parser } from "xml2js";
3
+ const parser = new Parser();
4
+ import { promisify } from "util";
5
+ const parseString = promisify<string, JobData>(parser.parseString);
2
6
 
3
7
  export interface JobData {
4
8
  "j:Job": {
@@ -16,7 +20,7 @@ export interface JobData {
16
20
  }[];
17
21
  }[];
18
22
  }[];
19
- PostScanPage: {
23
+ PostScanPage?: {
20
24
  PageNumber: string[];
21
25
  }[];
22
26
  }[];
@@ -30,6 +34,11 @@ export default class Job {
30
34
  this.data = data;
31
35
  }
32
36
 
37
+ static async createJob(content: string): Promise<Job> {
38
+ const parsed = await parseString(content);
39
+ return new Job(parsed);
40
+ }
41
+
33
42
  get currentPageNumber(): string | null {
34
43
  let preScanPage = this.data["j:Job"].ScanJob[0].PreScanPage;
35
44
  if (preScanPage) {
@@ -39,11 +48,14 @@ export default class Job {
39
48
  }
40
49
  }
41
50
 
42
- get totalPageNumber(): number {
43
- return parseInt(
44
- this.data["j:Job"].ScanJob[0].PostScanPage[0].PageNumber[0],
45
- 10
46
- );
51
+ get totalPageNumber(): number | null {
52
+ if (this.data["j:Job"].ScanJob[0].PostScanPage) {
53
+ return parseInt(
54
+ this.data["j:Job"].ScanJob[0].PostScanPage[0].PageNumber[0],
55
+ 10
56
+ );
57
+ }
58
+ return null;
47
59
  }
48
60
 
49
61
  get jobState():
@@ -55,46 +67,56 @@ export default class Job {
55
67
  return this.data["j:Job"]["j:JobState"][0];
56
68
  }
57
69
 
58
- get pageState(): string {
70
+ get pageState(): string | null {
59
71
  let preScanPage = this.data["j:Job"].ScanJob[0].PreScanPage;
60
72
  if (preScanPage) {
61
73
  return preScanPage[0].PageState[0];
62
74
  } else {
63
- return "";
75
+ return null;
64
76
  }
65
77
  }
66
78
 
67
79
  get binaryURL(): string | null {
68
- let preScanPage = this.data["j:Job"].ScanJob[0].PreScanPage;
69
- if (preScanPage) {
70
- return preScanPage[0].BinaryURL[0];
71
- } else {
72
- return null;
80
+ if (this.data["j:Job"].ScanJob[0].PreScanPage) {
81
+ return this.data["j:Job"].ScanJob[0].PreScanPage[0].BinaryURL[0];
73
82
  }
83
+ return null;
74
84
  }
75
85
 
76
- get imageWidth(): number {
86
+ get imageWidth(): number | null {
87
+ if (!this.data["j:Job"].ScanJob[0].hasOwnProperty("PreScanPage")) {
88
+ return null;
89
+ }
77
90
  return parseInt(
78
91
  this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
79
92
  ?.ImageWidth[0] ?? ""
80
93
  );
81
94
  }
82
- get imageHeight(): number {
83
- return parseInt(
84
- this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
85
- ?.ImageHeight[0] ?? ""
86
- );
95
+ get imageHeight(): number | null {
96
+ if (this.data["j:Job"].ScanJob[0].PreScanPage) {
97
+ return parseInt(
98
+ this.data["j:Job"].ScanJob[0].PreScanPage[0].BufferInfo[0]
99
+ .ImageHeight[0]
100
+ );
101
+ }
102
+ return null;
87
103
  }
88
- get xResolution(): number {
89
- return parseInt(
90
- this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
91
- ?.ScanSettings?.[0]?.XResolution[0] ?? ""
92
- );
104
+ get xResolution(): number | null {
105
+ if (this.data["j:Job"].ScanJob[0].PreScanPage) {
106
+ return parseInt(
107
+ this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
108
+ ?.ScanSettings?.[0]?.XResolution[0] ?? ""
109
+ );
110
+ }
111
+ return null;
93
112
  }
94
- get yResolution(): number {
95
- return parseInt(
96
- this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
97
- ?.ScanSettings?.[0]?.YResolution[0] ?? ""
98
- );
113
+ get yResolution(): number | null {
114
+ if (this.data["j:Job"].ScanJob[0].hasOwnProperty("PreScanPage")) {
115
+ return parseInt(
116
+ this.data["j:Job"].ScanJob[0].PreScanPage?.[0]?.BufferInfo?.[0]
117
+ ?.ScanSettings?.[0]?.YResolution[0] ?? ""
118
+ );
119
+ }
120
+ return null;
99
121
  }
100
122
  }
package/src/JpegUtil.ts CHANGED
@@ -8,7 +8,7 @@ export default class JpegUtil {
8
8
  debug = dbg;
9
9
  }
10
10
 
11
- private static logDebug(msg: any) {
11
+ private static logDebug(msg: string | object) {
12
12
  if (debug) {
13
13
  console.log(msg);
14
14
  }
@@ -145,7 +145,7 @@ export default class JpegUtil {
145
145
  startOfStartOfFrame: number,
146
146
  lengthOfStartOfFrame: number,
147
147
  numberOfLine: number
148
- ) : boolean {
148
+ ): boolean {
149
149
  // write the picture height
150
150
  if (6 < lengthOfStartOfFrame) {
151
151
  const heightBuffer = Buffer.from([0x00, 0x00]);
@@ -267,7 +267,11 @@ export default class JpegUtil {
267
267
  return null;
268
268
  }
269
269
 
270
- private static parseMarker(buffer: Buffer, i: number, markerHandler: { [key: string]: (start: number, length: number) => boolean }) : boolean {
270
+ private static parseMarker(
271
+ buffer: Buffer,
272
+ i: number,
273
+ markerHandler: { [key: string]: (start: number, length: number) => boolean }
274
+ ): boolean {
271
275
  let marker = "";
272
276
 
273
277
  //Retrieve the block length of the first block since the first block will not contain the size of file
@@ -279,7 +283,7 @@ export default class JpegUtil {
279
283
  if (buffer[i] != 0xff) {
280
284
  this.logDebug(
281
285
  "We should be at the begining of the next block, but got: " +
282
- buffer[i]
286
+ buffer[i]
283
287
  );
284
288
  return false;
285
289
  }