@ecobridge.xyz/devicemanager 3.0.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +10 -0
- package/dist_ts/features/feature.print.d.ts +4 -2
- package/dist_ts/features/feature.print.js +48 -38
- package/dist_ts/protocols/index.d.ts +1 -1
- package/dist_ts/protocols/index.js +2 -2
- package/dist_ts/protocols/protocol.ipp.d.ts +144 -33
- package/dist_ts/protocols/protocol.ipp.js +942 -239
- package/dist_ts/protocols/protocol.ipp.old.d.ts +45 -0
- package/dist_ts/protocols/protocol.ipp.old.js +284 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/features/feature.print.ts +53 -45
- package/ts/protocols/index.ts +6 -1
- package/ts/protocols/protocol.ipp.ts +1183 -260
package/changelog.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-01-13 - 3.1.0 - feat(print)
|
|
4
|
+
use IPP smartPrint and normalize IPP capabilities and job mapping
|
|
5
|
+
|
|
6
|
+
- Use IppProtocol.smartPrint for automatic format detection/conversion when submitting print jobs.
|
|
7
|
+
- Normalize and map IIppJob -> IPrintJob via mapIppJobToInternal, collapsing extended IPP job states into internal states.
|
|
8
|
+
- Parse IIppPrinterCapabilities fields (mediaSizeSupported, mediaTypeSupported, sidesSupported, printQualitySupported, copiesSupported) and derive supportsDuplex from sidesSupported and maxCopies from copiesSupported range with a fallback.
|
|
9
|
+
- Map numeric IPP printQuality values (3,4,5) to internal quality strings (draft, normal, high).
|
|
10
|
+
- Switched calls to getPrinterAttributes/getJobAttributes and adjusted job listing to map returned IIppJob objects.
|
|
11
|
+
- Export new IPP types from protocols index: IIppPrinterCapabilities, IIppJob, IIppPrintOptions.
|
|
12
|
+
|
|
3
13
|
## 2026-01-12 - 3.0.2 - fix(devicemanager)
|
|
4
14
|
no changes detected - nothing to commit
|
|
5
15
|
|
|
@@ -68,8 +68,10 @@ export declare class PrintFeature extends Feature {
|
|
|
68
68
|
cancelJob(jobId: number): Promise<void>;
|
|
69
69
|
private printWithIpp;
|
|
70
70
|
private updateCapabilitiesFromIpp;
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
/**
|
|
72
|
+
* Map IIppJob to IPrintJob, normalizing extended states
|
|
73
|
+
*/
|
|
74
|
+
private mapIppJobToInternal;
|
|
73
75
|
getFeatureInfo(): IPrintFeatureInfo;
|
|
74
76
|
/**
|
|
75
77
|
* Create from discovery metadata
|
|
@@ -66,7 +66,7 @@ export class PrintFeature extends Feature {
|
|
|
66
66
|
const path = url.pathname || '/ipp/print';
|
|
67
67
|
this.ippClient = new IppProtocol(address, port, path);
|
|
68
68
|
// Verify connection by getting printer attributes
|
|
69
|
-
const attrs = await this.ippClient.
|
|
69
|
+
const attrs = await this.ippClient.getPrinterAttributes();
|
|
70
70
|
this.updateCapabilitiesFromIpp(attrs);
|
|
71
71
|
}
|
|
72
72
|
// JetDirect and LPD don't need connection verification
|
|
@@ -111,7 +111,8 @@ export class PrintFeature extends Feature {
|
|
|
111
111
|
if (!this.isConnected || !this.ippClient) {
|
|
112
112
|
throw new Error('Print feature not connected');
|
|
113
113
|
}
|
|
114
|
-
|
|
114
|
+
const jobs = await this.ippClient.getJobs();
|
|
115
|
+
return jobs.map(job => this.mapIppJobToInternal(job));
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
117
118
|
* Get info about a specific job
|
|
@@ -120,7 +121,8 @@ export class PrintFeature extends Feature {
|
|
|
120
121
|
if (!this.isConnected || !this.ippClient) {
|
|
121
122
|
throw new Error('Print feature not connected');
|
|
122
123
|
}
|
|
123
|
-
|
|
124
|
+
const job = await this.ippClient.getJobAttributes(jobId);
|
|
125
|
+
return this.mapIppJobToInternal(job);
|
|
124
126
|
}
|
|
125
127
|
/**
|
|
126
128
|
* Cancel a print job
|
|
@@ -140,8 +142,16 @@ export class PrintFeature extends Feature {
|
|
|
140
142
|
throw new Error('IPP client not initialized');
|
|
141
143
|
}
|
|
142
144
|
this.emit('print:started', options);
|
|
143
|
-
//
|
|
144
|
-
const
|
|
145
|
+
// Use smartPrint for auto format detection and conversion
|
|
146
|
+
const ippJob = await this.ippClient.smartPrint(data, {
|
|
147
|
+
jobName: options?.jobName,
|
|
148
|
+
copies: options?.copies,
|
|
149
|
+
media: options?.mediaSize,
|
|
150
|
+
sides: options?.sides,
|
|
151
|
+
printQuality: options?.quality,
|
|
152
|
+
colorMode: options?.colorMode,
|
|
153
|
+
});
|
|
154
|
+
const job = this.mapIppJobToInternal(ippJob);
|
|
145
155
|
this.emit('print:submitted', job);
|
|
146
156
|
return job;
|
|
147
157
|
}
|
|
@@ -150,48 +160,48 @@ export class PrintFeature extends Feature {
|
|
|
150
160
|
// ============================================================================
|
|
151
161
|
updateCapabilitiesFromIpp(caps) {
|
|
152
162
|
this.supportsColor = caps.colorSupported;
|
|
153
|
-
|
|
154
|
-
this.
|
|
155
|
-
|
|
156
|
-
|
|
163
|
+
// Derive duplexSupported from sidesSupported
|
|
164
|
+
this.supportsDuplex = caps.sidesSupported?.some(s => s.includes('two-sided')) ?? false;
|
|
165
|
+
// Get max copies from range
|
|
166
|
+
this.maxCopies = caps.copiesSupported?.upper ?? 99;
|
|
167
|
+
if (caps.mediaSizeSupported && caps.mediaSizeSupported.length > 0) {
|
|
168
|
+
this.supportedMediaSizes = caps.mediaSizeSupported;
|
|
157
169
|
}
|
|
158
|
-
if (caps.
|
|
159
|
-
this.supportedMediaTypes = caps.
|
|
170
|
+
if (caps.mediaTypeSupported && caps.mediaTypeSupported.length > 0) {
|
|
171
|
+
this.supportedMediaTypes = caps.mediaTypeSupported;
|
|
160
172
|
}
|
|
161
173
|
if (caps.sidesSupported && caps.sidesSupported.length > 0) {
|
|
162
174
|
this.supportedSides = caps.sidesSupported.filter((s) => ['one-sided', 'two-sided-long-edge', 'two-sided-short-edge'].includes(s));
|
|
163
175
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
case 'draft': return 3;
|
|
171
|
-
case 'normal': return 4;
|
|
172
|
-
case 'high': return 5;
|
|
173
|
-
default: return 4;
|
|
176
|
+
// Map IPP quality values (3=draft, 4=normal, 5=high) to strings
|
|
177
|
+
if (caps.printQualitySupported && caps.printQualitySupported.length > 0) {
|
|
178
|
+
const qualityMap = { 3: 'draft', 4: 'normal', 5: 'high' };
|
|
179
|
+
this.supportedQualities = caps.printQualitySupported
|
|
180
|
+
.map(q => qualityMap[q])
|
|
181
|
+
.filter((q) => q !== undefined);
|
|
174
182
|
}
|
|
175
183
|
}
|
|
176
|
-
|
|
184
|
+
/**
|
|
185
|
+
* Map IIppJob to IPrintJob, normalizing extended states
|
|
186
|
+
*/
|
|
187
|
+
mapIppJobToInternal(job) {
|
|
188
|
+
// Map extended IPP states to simpler internal states
|
|
177
189
|
const stateMap = {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
190
|
+
'pending': 'pending',
|
|
191
|
+
'pending-held': 'pending',
|
|
192
|
+
'processing': 'processing',
|
|
193
|
+
'processing-stopped': 'processing',
|
|
194
|
+
'canceled': 'canceled',
|
|
195
|
+
'aborted': 'aborted',
|
|
196
|
+
'completed': 'completed',
|
|
185
197
|
};
|
|
186
198
|
return {
|
|
187
|
-
id: job
|
|
188
|
-
name: job
|
|
189
|
-
state: stateMap[job
|
|
190
|
-
stateReason: job
|
|
191
|
-
createdAt:
|
|
192
|
-
completedAt: job
|
|
193
|
-
? new Date(job['time-at-completed'] * 1000)
|
|
194
|
-
: undefined,
|
|
199
|
+
id: job.id,
|
|
200
|
+
name: job.name,
|
|
201
|
+
state: stateMap[job.state],
|
|
202
|
+
stateReason: job.stateReasons?.[0],
|
|
203
|
+
createdAt: job.createdAt,
|
|
204
|
+
completedAt: job.completedAt,
|
|
195
205
|
};
|
|
196
206
|
}
|
|
197
207
|
// ============================================================================
|
|
@@ -223,4 +233,4 @@ export class PrintFeature extends Feature {
|
|
|
223
233
|
});
|
|
224
234
|
}
|
|
225
235
|
}
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5wcmludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZlYXR1cmVzL2ZlYXR1cmUucHJpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUE4QyxNQUFNLHVCQUF1QixDQUFDO0FBMEJoRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsT0FBTztJQUN2QixJQUFJLEdBQUcsT0FBZ0IsQ0FBQztJQUN4QixRQUFRLENBQWlCO0lBRXpDLGtCQUFrQjtJQUNWLFNBQVMsR0FBdUIsSUFBSSxDQUFDO0lBRTdDLGdCQUFnQjtJQUNBLEdBQUcsQ0FBUztJQUU1QixlQUFlO0lBQ1IsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLG1CQUFtQixHQUFhLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUMzRSxtQkFBbUIsR0FBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLFNBQVMsR0FBVyxFQUFFLENBQUM7SUFDdkIsY0FBYyxHQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLGtCQUFrQixHQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhELFlBQ0UsTUFBd0IsRUFDeEIsSUFBWSxFQUNaLE9BQThCO1FBRTlCLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxFQUFFLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDM0MsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLFNBQVMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLFlBQVksQ0FBQztRQUV2RSw0Q0FBNEM7UUFDNUMsSUFB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
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { EsclProtocol } from './protocol.escl.js';
|
|
6
6
|
export { SaneProtocol } from './protocol.sane.js';
|
|
7
|
-
export { IppProtocol } from './protocol.ipp.js';
|
|
7
|
+
export { IppProtocol, type IIppPrinterCapabilities, type IIppJob, type IIppPrintOptions, } from './protocol.ipp.js';
|
|
8
8
|
export { SnmpProtocol, SNMP_OIDS, type TSnmpValueType, type ISnmpVarbind, type ISnmpOptions, } from './protocol.snmp.js';
|
|
9
9
|
export { NutProtocol, NUT_VARIABLES, NUT_COMMANDS, type TNutStatusFlag, type INutUpsInfo, type INutVariable, } from './protocol.nut.js';
|
|
10
10
|
export { UpnpSoapClient, UPNP_SERVICE_TYPES, UPNP_DEVICE_TYPES, type TDlnaTransportState, type TDlnaTransportStatus, type IDlnaPositionInfo, type IDlnaTransportInfo, type IDlnaMediaInfo, type IDlnaContentItem, type IDlnaBrowseResult, } from './protocol.upnp.js';
|
|
@@ -7,7 +7,7 @@ export { EsclProtocol } from './protocol.escl.js';
|
|
|
7
7
|
// SANE network scanner protocol
|
|
8
8
|
export { SaneProtocol } from './protocol.sane.js';
|
|
9
9
|
// IPP printer protocol
|
|
10
|
-
export { IppProtocol } from './protocol.ipp.js';
|
|
10
|
+
export { IppProtocol, } from './protocol.ipp.js';
|
|
11
11
|
// SNMP query protocol
|
|
12
12
|
export { SnmpProtocol, SNMP_OIDS, } from './protocol.snmp.js';
|
|
13
13
|
// Network UPS Tools protocol
|
|
@@ -18,4 +18,4 @@ export { UpnpSoapClient, UPNP_SERVICE_TYPES, UPNP_DEVICE_TYPES, } from './protoc
|
|
|
18
18
|
export { UpsSnmpHandler, UPS_SNMP_OIDS, } from './protocol.upssnmp.js';
|
|
19
19
|
// Home Assistant WebSocket protocol
|
|
20
20
|
export { HomeAssistantProtocol } from './protocol.homeassistant.js';
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wcm90b2NvbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELHVCQUF1QjtBQUN2QixPQUFPLEVBQ0wsV0FBVyxHQUlaLE1BQU0sbUJBQW1CLENBQUM7QUFFM0Isc0JBQXNCO0FBQ3RCLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxHQUlWLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsNkJBQTZCO0FBQzdCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLFlBQVksR0FJYixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLDBCQUEwQjtBQUMxQixPQUFPLEVBQ0wsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixpQkFBaUIsR0FRbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1Qiw4QkFBOEI7QUFDOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEdBS2QsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixvQ0FBb0M7QUFDcEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUMifQ==
|
|
@@ -1,45 +1,156 @@
|
|
|
1
|
-
import type { IPrinterCapabilities, IPrintOptions, IPrintJob } from '../interfaces/index.js';
|
|
2
1
|
/**
|
|
3
|
-
* IPP
|
|
2
|
+
* Clean IPP Protocol Implementation
|
|
3
|
+
* RFC 8010 (Encoding) and RFC 8011 (Model)
|
|
4
|
+
*
|
|
5
|
+
* This is a from-scratch implementation with proper capability detection,
|
|
6
|
+
* document format negotiation, and clean attribute parsing.
|
|
4
7
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
8
|
+
/** IPP Version */
|
|
9
|
+
declare const IPP_VERSION: {
|
|
10
|
+
readonly V1_1: 257;
|
|
11
|
+
readonly V2_0: 512;
|
|
12
|
+
};
|
|
13
|
+
/** IPP Operations */
|
|
14
|
+
declare const IPP_OPERATION: {
|
|
15
|
+
readonly PRINT_JOB: 2;
|
|
16
|
+
readonly VALIDATE_JOB: 4;
|
|
17
|
+
readonly CANCEL_JOB: 8;
|
|
18
|
+
readonly GET_JOB_ATTRIBUTES: 9;
|
|
19
|
+
readonly GET_JOBS: 10;
|
|
20
|
+
readonly GET_PRINTER_ATTRIBUTES: 11;
|
|
21
|
+
};
|
|
22
|
+
/** IPP Status Codes */
|
|
23
|
+
declare const IPP_STATUS: {
|
|
24
|
+
readonly SUCCESSFUL_OK: 0;
|
|
25
|
+
readonly SUCCESSFUL_OK_IGNORED_ATTRIBUTES: 1;
|
|
26
|
+
readonly SUCCESSFUL_OK_CONFLICTING_ATTRIBUTES: 2;
|
|
27
|
+
readonly CLIENT_ERROR_BAD_REQUEST: 1024;
|
|
28
|
+
readonly CLIENT_ERROR_FORBIDDEN: 1025;
|
|
29
|
+
readonly CLIENT_ERROR_NOT_AUTHENTICATED: 1026;
|
|
30
|
+
readonly CLIENT_ERROR_NOT_AUTHORIZED: 1027;
|
|
31
|
+
readonly CLIENT_ERROR_NOT_POSSIBLE: 1028;
|
|
32
|
+
readonly CLIENT_ERROR_TIMEOUT: 1029;
|
|
33
|
+
readonly CLIENT_ERROR_NOT_FOUND: 1030;
|
|
34
|
+
readonly CLIENT_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED: 1034;
|
|
35
|
+
readonly SERVER_ERROR_INTERNAL: 1280;
|
|
36
|
+
readonly SERVER_ERROR_OPERATION_NOT_SUPPORTED: 1281;
|
|
37
|
+
readonly SERVER_ERROR_SERVICE_UNAVAILABLE: 1282;
|
|
38
|
+
readonly SERVER_ERROR_DEVICE_ERROR: 1284;
|
|
39
|
+
readonly SERVER_ERROR_NOT_ACCEPTING_JOBS: 1286;
|
|
40
|
+
readonly SERVER_ERROR_BUSY: 1287;
|
|
41
|
+
};
|
|
42
|
+
/** Job States */
|
|
43
|
+
declare const JOB_STATE: {
|
|
44
|
+
readonly PENDING: 3;
|
|
45
|
+
readonly PENDING_HELD: 4;
|
|
46
|
+
readonly PROCESSING: 5;
|
|
47
|
+
readonly PROCESSING_STOPPED: 6;
|
|
48
|
+
readonly CANCELED: 7;
|
|
49
|
+
readonly ABORTED: 8;
|
|
50
|
+
readonly COMPLETED: 9;
|
|
51
|
+
};
|
|
52
|
+
/** Printer States */
|
|
53
|
+
declare const PRINTER_STATE: {
|
|
54
|
+
readonly IDLE: 3;
|
|
55
|
+
readonly PROCESSING: 4;
|
|
56
|
+
readonly STOPPED: 5;
|
|
57
|
+
};
|
|
58
|
+
interface TIppResolution {
|
|
59
|
+
crossFeed: number;
|
|
60
|
+
feed: number;
|
|
61
|
+
units: 'dpi' | 'dpcm';
|
|
62
|
+
}
|
|
63
|
+
interface TIppRange {
|
|
64
|
+
lower: number;
|
|
65
|
+
upper: number;
|
|
66
|
+
}
|
|
67
|
+
export interface IIppPrinterCapabilities {
|
|
68
|
+
printerName: string;
|
|
69
|
+
printerInfo?: string;
|
|
70
|
+
printerMakeAndModel?: string;
|
|
71
|
+
printerLocation?: string;
|
|
72
|
+
printerUri: string;
|
|
73
|
+
printerState: 'idle' | 'processing' | 'stopped';
|
|
74
|
+
printerStateReasons: string[];
|
|
75
|
+
printerIsAcceptingJobs: boolean;
|
|
76
|
+
queuedJobCount: number;
|
|
77
|
+
documentFormatSupported: string[];
|
|
78
|
+
documentFormatDefault?: string;
|
|
79
|
+
mediaSizeSupported: string[];
|
|
80
|
+
mediaDefault?: string;
|
|
81
|
+
mediaTypeSupported: string[];
|
|
82
|
+
colorSupported: boolean;
|
|
83
|
+
sidesSupported: string[];
|
|
84
|
+
sidesDefault?: string;
|
|
85
|
+
copiesSupported: TIppRange;
|
|
86
|
+
printQualitySupported: number[];
|
|
87
|
+
resolutionsSupported: TIppResolution[];
|
|
88
|
+
operationsSupported: number[];
|
|
89
|
+
ippVersionsSupported: string[];
|
|
90
|
+
}
|
|
91
|
+
export interface IIppPrintOptions {
|
|
92
|
+
jobName?: string;
|
|
93
|
+
requestingUserName?: string;
|
|
94
|
+
documentFormat?: string;
|
|
95
|
+
copies?: number;
|
|
96
|
+
sides?: 'one-sided' | 'two-sided-long-edge' | 'two-sided-short-edge';
|
|
97
|
+
media?: string;
|
|
98
|
+
printQuality?: 'draft' | 'normal' | 'high';
|
|
99
|
+
colorMode?: 'monochrome' | 'color' | 'auto';
|
|
100
|
+
orientation?: 'portrait' | 'landscape' | 'reverse-landscape' | 'reverse-portrait';
|
|
101
|
+
}
|
|
102
|
+
export interface IIppJob {
|
|
103
|
+
id: number;
|
|
104
|
+
uri: string;
|
|
105
|
+
state: 'pending' | 'pending-held' | 'processing' | 'processing-stopped' | 'canceled' | 'aborted' | 'completed';
|
|
106
|
+
stateReasons: string[];
|
|
107
|
+
name: string;
|
|
108
|
+
originatingUserName?: string;
|
|
109
|
+
createdAt?: Date;
|
|
110
|
+
completedAt?: Date;
|
|
111
|
+
processingAt?: Date;
|
|
112
|
+
impressionsCompleted?: number;
|
|
113
|
+
}
|
|
114
|
+
declare function isSuccessful(statusCode: number): boolean;
|
|
115
|
+
declare function statusCodeToString(code: number): string;
|
|
116
|
+
export declare class IppClient {
|
|
117
|
+
private readonly printerUri;
|
|
118
|
+
private readonly httpUri;
|
|
119
|
+
private requestId;
|
|
120
|
+
private readonly encoder;
|
|
121
|
+
private readonly decoder;
|
|
122
|
+
constructor(address: string, port?: number, path?: string);
|
|
123
|
+
private request;
|
|
124
|
+
getPrinterAttributes(): Promise<IIppPrinterCapabilities>;
|
|
125
|
+
private parseCapabilities;
|
|
126
|
+
printJob(data: Buffer, options?: IIppPrintOptions): Promise<IIppJob>;
|
|
127
|
+
getJobs(whichJobs?: 'completed' | 'not-completed' | 'all'): Promise<IIppJob[]>;
|
|
128
|
+
getJobAttributes(jobId: number): Promise<IIppJob>;
|
|
28
129
|
cancelJob(jobId: number): Promise<void>;
|
|
130
|
+
validateJob(options?: IIppPrintOptions): Promise<boolean>;
|
|
131
|
+
private parseJob;
|
|
132
|
+
isFormatSupported(mimeType: string): Promise<boolean>;
|
|
133
|
+
getBestFormat(preferredFormats: string[]): Promise<string | null>;
|
|
29
134
|
/**
|
|
30
|
-
*
|
|
135
|
+
* Smart print that auto-detects document format and converts if necessary.
|
|
136
|
+
*
|
|
137
|
+
* If the document format is not supported by the printer, it will attempt
|
|
138
|
+
* to convert to a supported format (e.g., PDF → JPEG).
|
|
31
139
|
*/
|
|
32
|
-
|
|
140
|
+
smartPrint(data: Buffer, options?: IIppPrintOptions): Promise<IIppJob>;
|
|
33
141
|
/**
|
|
34
|
-
*
|
|
142
|
+
* Detect document format from magic bytes
|
|
35
143
|
*/
|
|
36
|
-
private
|
|
144
|
+
private detectFormat;
|
|
37
145
|
/**
|
|
38
|
-
*
|
|
146
|
+
* Convert document to target format
|
|
147
|
+
* Uses ImageMagick if available, otherwise throws
|
|
39
148
|
*/
|
|
40
|
-
private
|
|
149
|
+
private convertDocument;
|
|
41
150
|
/**
|
|
42
|
-
*
|
|
151
|
+
* Get file extension for MIME type
|
|
43
152
|
*/
|
|
44
|
-
private
|
|
153
|
+
private formatToExtension;
|
|
45
154
|
}
|
|
155
|
+
export { IppClient as IppProtocol };
|
|
156
|
+
export { IPP_VERSION, IPP_OPERATION, IPP_STATUS, JOB_STATE, PRINTER_STATE, isSuccessful, statusCodeToString, };
|