@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 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
- private qualityToIpp;
72
- private mapIppJob;
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.getAttributes();
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
- return this.ippClient.getJobs();
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
- return this.ippClient.getJobInfo(jobId);
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
- // IppProtocol.print() accepts IPrintOptions and returns IPrintJob
144
- const job = await this.ippClient.print(data, options);
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
- this.supportsDuplex = caps.duplexSupported;
154
- this.maxCopies = caps.maxCopies;
155
- if (caps.mediaSizes && caps.mediaSizes.length > 0) {
156
- this.supportedMediaSizes = caps.mediaSizes;
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.mediaTypes && caps.mediaTypes.length > 0) {
159
- this.supportedMediaTypes = caps.mediaTypes;
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
- if (caps.qualitySupported && caps.qualitySupported.length > 0) {
165
- this.supportedQualities = caps.qualitySupported.filter((q) => ['draft', 'normal', 'high'].includes(q));
166
- }
167
- }
168
- qualityToIpp(quality) {
169
- switch (quality) {
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
- mapIppJob(job) {
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
- 3: 'pending',
179
- 4: 'pending',
180
- 5: 'processing',
181
- 6: 'processing',
182
- 7: 'canceled',
183
- 8: 'aborted',
184
- 9: 'completed',
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['job-id'],
188
- name: job['job-name'] ?? 'Unknown',
189
- state: stateMap[job['job-state'] ?? 3] ?? 'pending',
190
- stateReason: job['job-state-reasons']?.[0],
191
- createdAt: new Date(job['time-at-creation'] * 1000),
192
- completedAt: job['time-at-completed']
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS5wcmludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2ZlYXR1cmVzL2ZlYXR1cmUucHJpbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUEyQnBEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxPQUFPO0lBQ3ZCLElBQUksR0FBRyxPQUFnQixDQUFDO0lBQ3hCLFFBQVEsQ0FBaUI7SUFFekMsa0JBQWtCO0lBQ1YsU0FBUyxHQUF1QixJQUFJLENBQUM7SUFFN0MsZ0JBQWdCO0lBQ0EsR0FBRyxDQUFTO0lBRTVCLGVBQWU7SUFDUixhQUFhLEdBQVksSUFBSSxDQUFDO0lBQzlCLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsbUJBQW1CLEdBQWEsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzNFLG1CQUFtQixHQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixjQUFjLEdBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsa0JBQWtCLEdBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFeEQsWUFDRSxNQUF3QixFQUN4QixJQUFZLEVBQ1osT0FBOEI7UUFFOUIsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksU0FBUyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksWUFBWSxDQUFDO1FBRXZFLDRDQUE0QztRQUM1QyxJQUFJ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
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wcm90b2NvbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELHVCQUF1QjtBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsc0JBQXNCO0FBQ3RCLE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxHQUlWLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsNkJBQTZCO0FBQzdCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLFlBQVksR0FJYixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLDBCQUEwQjtBQUMxQixPQUFPLEVBQ0wsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixpQkFBaUIsR0FRbEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1Qiw4QkFBOEI7QUFDOUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEdBS2QsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixvQ0FBb0M7QUFDcEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUMifQ==
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 protocol wrapper using the ipp npm package
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
- export declare class IppProtocol {
6
- private printerUrl;
7
- private printer;
8
- constructor(address: string, port: number, path?: string);
9
- /**
10
- * Get printer attributes/capabilities
11
- */
12
- getAttributes(): Promise<IPrinterCapabilities>;
13
- /**
14
- * Print a document
15
- */
16
- print(data: Buffer, options?: IPrintOptions): Promise<IPrintJob>;
17
- /**
18
- * Get all jobs
19
- */
20
- getJobs(): Promise<IPrintJob[]>;
21
- /**
22
- * Get specific job info
23
- */
24
- getJobInfo(jobId: number): Promise<IPrintJob>;
25
- /**
26
- * Cancel a job
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
- * Check if printer is available
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
- checkAvailability(): Promise<boolean>;
140
+ smartPrint(data: Buffer, options?: IIppPrintOptions): Promise<IIppJob>;
33
141
  /**
34
- * Build IPP print message from options
142
+ * Detect document format from magic bytes
35
143
  */
36
- private buildPrintMessage;
144
+ private detectFormat;
37
145
  /**
38
- * Parse printer capabilities from attributes
146
+ * Convert document to target format
147
+ * Uses ImageMagick if available, otherwise throws
39
148
  */
40
- private parseCapabilities;
149
+ private convertDocument;
41
150
  /**
42
- * Parse job info from attributes
151
+ * Get file extension for MIME type
43
152
  */
44
- private parseJobInfo;
153
+ private formatToExtension;
45
154
  }
155
+ export { IppClient as IppProtocol };
156
+ export { IPP_VERSION, IPP_OPERATION, IPP_STATUS, JOB_STATE, PRINTER_STATE, isSuccessful, statusCodeToString, };