@risleylima/escpos 0.2.0 → 1.0.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.
Files changed (106) hide show
  1. package/README.md +94 -766
  2. package/dist/adapter/index.d.ts +29 -0
  3. package/dist/adapter/index.d.ts.map +1 -0
  4. package/dist/adapter/index.js +25 -0
  5. package/dist/adapter/index.js.map +1 -0
  6. package/dist/index.d.ts +14 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +25 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/network-adapter/index.d.ts +24 -0
  11. package/dist/network-adapter/index.d.ts.map +1 -0
  12. package/dist/network-adapter/index.js +263 -0
  13. package/dist/network-adapter/index.js.map +1 -0
  14. package/dist/printer/commands-types.d.ts +37 -0
  15. package/dist/printer/commands-types.d.ts.map +1 -0
  16. package/dist/printer/commands-types.js +63 -0
  17. package/dist/printer/commands-types.js.map +1 -0
  18. package/dist/printer/commands.d.ts +169 -0
  19. package/dist/printer/commands.d.ts.map +1 -0
  20. package/dist/printer/commands.js +192 -0
  21. package/dist/printer/commands.js.map +1 -0
  22. package/dist/printer/image-loader.d.ts +17 -0
  23. package/dist/printer/image-loader.d.ts.map +1 -0
  24. package/dist/printer/image-loader.js +462 -0
  25. package/dist/printer/image-loader.js.map +1 -0
  26. package/dist/printer/image.d.ts +43 -0
  27. package/dist/printer/image.d.ts.map +1 -0
  28. package/dist/printer/image.js +132 -0
  29. package/dist/printer/image.js.map +1 -0
  30. package/dist/printer/index.d.ts +158 -0
  31. package/dist/printer/index.d.ts.map +1 -0
  32. package/dist/printer/index.js +703 -0
  33. package/dist/printer/index.js.map +1 -0
  34. package/dist/printer/profiles/bematech/mp4200th.d.ts +13 -0
  35. package/dist/printer/profiles/bematech/mp4200th.d.ts.map +1 -0
  36. package/dist/printer/profiles/bematech/mp4200th.js +29 -0
  37. package/dist/printer/profiles/bematech/mp4200th.js.map +1 -0
  38. package/dist/printer/profiles/custom/bematech-mp4200th.d.ts +13 -0
  39. package/dist/printer/profiles/custom/bematech-mp4200th.d.ts.map +1 -0
  40. package/dist/printer/profiles/custom/bematech-mp4200th.js +21 -0
  41. package/dist/printer/profiles/custom/bematech-mp4200th.js.map +1 -0
  42. package/dist/printer/profiles/custom/vkp80iii.d.ts +19 -0
  43. package/dist/printer/profiles/custom/vkp80iii.d.ts.map +1 -0
  44. package/dist/printer/profiles/custom/vkp80iii.js +87 -0
  45. package/dist/printer/profiles/custom/vkp80iii.js.map +1 -0
  46. package/dist/printer/profiles/default.d.ts +7 -0
  47. package/dist/printer/profiles/default.d.ts.map +1 -0
  48. package/dist/printer/profiles/default.js +15 -0
  49. package/dist/printer/profiles/default.js.map +1 -0
  50. package/dist/printer/profiles/index.d.ts +41 -0
  51. package/dist/printer/profiles/index.d.ts.map +1 -0
  52. package/dist/printer/profiles/index.js +98 -0
  53. package/dist/printer/profiles/index.js.map +1 -0
  54. package/dist/printer/profiles/merge.d.ts +7 -0
  55. package/dist/printer/profiles/merge.d.ts.map +1 -0
  56. package/dist/printer/profiles/merge.js +58 -0
  57. package/dist/printer/profiles/merge.js.map +1 -0
  58. package/dist/printer/profiles/types.d.ts +99 -0
  59. package/dist/printer/profiles/types.d.ts.map +1 -0
  60. package/dist/printer/profiles/types.js +8 -0
  61. package/dist/printer/profiles/types.js.map +1 -0
  62. package/dist/printer/utils.d.ts +9 -0
  63. package/dist/printer/utils.d.ts.map +1 -0
  64. package/dist/printer/utils.js +54 -0
  65. package/dist/printer/utils.js.map +1 -0
  66. package/dist/serial-adapter/index.d.ts +17 -0
  67. package/dist/serial-adapter/index.d.ts.map +1 -0
  68. package/dist/serial-adapter/index.js +172 -0
  69. package/dist/serial-adapter/index.js.map +1 -0
  70. package/dist/usb-adapter/index.d.ts +20 -0
  71. package/dist/usb-adapter/index.d.ts.map +1 -0
  72. package/dist/usb-adapter/index.js +264 -0
  73. package/dist/usb-adapter/index.js.map +1 -0
  74. package/package.json +42 -15
  75. package/CHANGELOG.md +0 -68
  76. package/docs/COVERAGE_ANALYSIS.md +0 -98
  77. package/docs/DEPENDENCIES_REVIEW.md +0 -127
  78. package/docs/JSDOC_REVIEW.md +0 -122
  79. package/docs/LIBRARY_OVERVIEW.md +0 -383
  80. package/docs/PRE_PUBLISH_CHECKLIST.md +0 -331
  81. package/docs/PUBLIC_API_ANALYSIS.md +0 -223
  82. package/docs/README.md +0 -34
  83. package/docs/SERIALPORT_V13_MIGRATION_COMPLETE.md +0 -127
  84. package/docs/TESTS_IMPLEMENTED.md +0 -129
  85. package/docs/USB_V2_REVIEW.md +0 -148
  86. package/docs/VERIFICATION_RESULTS.md +0 -172
  87. package/examples/printTest.js +0 -59
  88. package/index.js +0 -7
  89. package/jest.config.js +0 -16
  90. package/src/adapter/index.js +0 -75
  91. package/src/printer/commands.js +0 -199
  92. package/src/printer/image.js +0 -159
  93. package/src/printer/index.js +0 -621
  94. package/src/printer/utils.js +0 -58
  95. package/src/serial-adapter/index.js +0 -198
  96. package/src/usb-adapter/index.js +0 -283
  97. package/tests/README.md +0 -67
  98. package/tests/integration/printer-flow.test.js +0 -128
  99. package/tests/unit/adapters/adapter.test.js +0 -49
  100. package/tests/unit/adapters/serial-adapter.test.js +0 -238
  101. package/tests/unit/adapters/usb-adapter.test.js +0 -319
  102. package/tests/unit/image/image.test.js +0 -157
  103. package/tests/unit/printer/buffer.test.js +0 -60
  104. package/tests/unit/printer/commands.test.js +0 -109
  105. package/tests/unit/printer/printer.test.js +0 -405
  106. package/tests/unit/utils/utils.test.js +0 -96
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Types for the printer profile system.
3
+ * Profiles allow model-specific command sets and paper width handling
4
+ * while keeping the Printer API agnostic.
5
+ */
6
+ import type { CommandSet as CommandSetType } from '../commands-types';
7
+ /** Full command set shape (same as default commands.ts). */
8
+ export type CommandSet = CommandSetType;
9
+ /**
10
+ * One-level deep override: top-level keys can be replaced,
11
+ * and nested objects (e.g. PAPER, TEXT_FORMAT) can be partially overridden.
12
+ */
13
+ export type CommandSetOverride = {
14
+ [K in keyof CommandSet]?: CommandSet[K] extends Buffer ? Buffer : CommandSet[K] extends (...args: unknown[]) => unknown ? CommandSet[K] : CommandSet[K] extends object ? Partial<CommandSet[K]> : CommandSet[K];
15
+ };
16
+ /**
17
+ * Optional hook to send a paper width command to the printer.
18
+ * Some models use GS W (1D 57) or similar; return undefined to only set width in software.
19
+ */
20
+ export type PaperWidthCommandFn = (widthChars: number) => Buffer | undefined;
21
+ /** Generic model-specific options bag for ticket presentation. */
22
+ export type TicketPresentationOptions = Record<string, unknown>;
23
+ export interface BarcodeOptions {
24
+ width?: number;
25
+ height?: number;
26
+ position?: string;
27
+ font?: string;
28
+ includeParity?: boolean;
29
+ }
30
+ export interface QrCodeOptions {
31
+ model?: number;
32
+ size?: number;
33
+ level?: 'L' | 'M' | 'Q' | 'H';
34
+ }
35
+ export interface BarcodeBuildContext {
36
+ commands: CommandSet;
37
+ getParityBit: (code: string) => string;
38
+ codeLength: (code: string) => Buffer;
39
+ }
40
+ export interface QrCodeBuildContext {
41
+ commands: CommandSet;
42
+ }
43
+ export interface PrinterProfile {
44
+ /** Unique id (e.g. 'default', 'custom-vkp80iii'). */
45
+ id: string;
46
+ /** Human-readable name. */
47
+ name: string;
48
+ /** Short description of the model/family. */
49
+ description?: string;
50
+ /** Default paper width in characters when not specified in options. */
51
+ defaultPaperWidth?: number;
52
+ /** Supported paper widths for this model (for validation/warnings). */
53
+ paperWidths?: number[];
54
+ /**
55
+ * Overrides to the default ESC/POS command set.
56
+ * Omitted keys fall back to the default commands.
57
+ */
58
+ commandsOverride?: CommandSetOverride;
59
+ /**
60
+ * If set, called when paper width is changed so the printer can receive a model-specific command.
61
+ */
62
+ getPaperWidthCommand?: PaperWidthCommandFn;
63
+ /**
64
+ * If set, sent after feed (and after cut, unless ejectCommandIncludesCut) to deliver/release the ticket.
65
+ * Semantics are model-specific.
66
+ */
67
+ paperEjectAfterCut?: Buffer;
68
+ /**
69
+ * If true, paperEjectAfterCut performs the cut itself.
70
+ * cut() will then send only feed (ESC d n) + paperEjectAfterCut, and will NOT send PAPER_FULL_CUT/PART_CUT.
71
+ */
72
+ ejectCommandIncludesCut?: boolean;
73
+ /**
74
+ * Optional profile-specific builder for ticket presentation command.
75
+ * This enables a high-level API while keeping model bytes inside the profile.
76
+ */
77
+ getTicketPresentationCommand?: (options?: TicketPresentationOptions) => Buffer | undefined;
78
+ /**
79
+ * Optional validator for ticket presentation options.
80
+ * Throw to reject invalid values for the current model.
81
+ */
82
+ validateTicketPresentationOptions?: (options?: TicketPresentationOptions) => void;
83
+ /**
84
+ * Optional profile-specific barcode command builder.
85
+ * Return Buffer to fully override default barcode behavior.
86
+ */
87
+ buildBarcode?: (code: string, type: string, options: BarcodeOptions | undefined, context: BarcodeBuildContext) => Buffer | undefined;
88
+ /**
89
+ * Optional profile-specific QR command builder.
90
+ * Return Buffer to fully override default QR behavior.
91
+ */
92
+ buildQrCode?: (code: string, options: QrCodeOptions | undefined, context: QrCodeBuildContext) => Buffer | undefined;
93
+ /**
94
+ * Mapping of encoding name to codepage number (ESC t n).
95
+ * Example: { 'utf8': 255, 'cp860': 3 }
96
+ */
97
+ codepages?: Record<string, number>;
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/printer/profiles/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ /**
3
+ * Types for the printer profile system.
4
+ * Profiles allow model-specific command sets and paper width handling
5
+ * while keeping the Printer API agnostic.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/printer/profiles/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
@@ -0,0 +1,9 @@
1
+ export declare function getParityBit(str: string): string;
2
+ /**
3
+ * Returns the length of the string as a Buffer (1 byte).
4
+ * @param str The string to measure
5
+ */
6
+ export declare function codeLength(str: string): Buffer;
7
+ export declare function textLength(str: string): number;
8
+ export declare function textSubstring(str: string, start: number, end?: number): string;
9
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/printer/utils.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAa9E"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getParityBit = getParityBit;
4
+ exports.codeLength = codeLength;
5
+ exports.textLength = textLength;
6
+ exports.textSubstring = textSubstring;
7
+ function charLength(char) {
8
+ if (!char)
9
+ return 0;
10
+ const code = char.codePointAt(0) ?? 0;
11
+ // Common rule for CJK and Emoji: if it's beyond the basic Latin range,
12
+ // it usually takes 2 columns in thermal printers.
13
+ return code > 0x7f ? 2 : 1;
14
+ }
15
+ function getParityBit(str) {
16
+ let parity = 0;
17
+ const reversedCode = str.split('').reverse().join('');
18
+ for (let counter = 0; counter < reversedCode.length; counter += 1) {
19
+ parity +=
20
+ parseInt(reversedCode.charAt(counter), 10) * Math.pow(3, (counter + 1) % 2);
21
+ }
22
+ return String((10 - (parity % 10)) % 10);
23
+ }
24
+ /**
25
+ * Returns the length of the string as a Buffer (1 byte).
26
+ * @param str The string to measure
27
+ */
28
+ function codeLength(str) {
29
+ const len = str.length;
30
+ if (len > 255) {
31
+ throw new Error('codeLength: string length must be <= 255 for barcode');
32
+ }
33
+ return Buffer.from([len]);
34
+ }
35
+ function textLength(str) {
36
+ // We use Array.from to correctly iterate over Unicode code points (including Emojis)
37
+ return Array.from(str).reduce((accLen, char) => accLen + charLength(char), 0);
38
+ }
39
+ function textSubstring(str, start, end) {
40
+ let accLen = 0;
41
+ let result = '';
42
+ // Iterate over code points correctly
43
+ for (const char of Array.from(str)) {
44
+ const len = charLength(char);
45
+ if (accLen + len > start && (end === undefined || accLen + len <= end)) {
46
+ result += char;
47
+ }
48
+ accLen += len;
49
+ if (end !== undefined && accLen >= end)
50
+ break;
51
+ }
52
+ return result;
53
+ }
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/printer/utils.ts"],"names":[],"mappings":";;AAQA,oCAQC;AAMD,gCAMC;AAED,gCAGC;AAED,sCAaC;AAhDD,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,uEAAuE;IACvE,kDAAkD;IAClD,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,YAAY,CAAC,GAAW;IACtC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM;YACJ,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACvB,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,UAAU,CAAC,GAAW;IACpC,qFAAqF;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,GAAY;IACpE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,qCAAqC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC;QACd,IAAI,GAAG,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG;YAAE,MAAM;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Adapter } from '../adapter';
2
+ export declare class Serial extends Adapter {
3
+ private port;
4
+ private path;
5
+ private options;
6
+ static listSerial(): Promise<import("@serialport/bindings-interface").PortInfo[]>;
7
+ connect(port: string, options?: Record<string, unknown>): Promise<boolean>;
8
+ open(): Promise<boolean>;
9
+ write(data: Buffer): Promise<boolean>;
10
+ private writeChunk;
11
+ read(): Promise<Buffer>;
12
+ close(options?: {
13
+ timeout?: number;
14
+ }): Promise<boolean>;
15
+ disconnect(): Promise<boolean>;
16
+ }
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serial-adapter/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAOrC,qBAAa,MAAO,SAAQ,OAAO;IACjC,OAAO,CAAC,IAAI,CAA2B;IACvC,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,OAAO,CAAwC;WAE1C,UAAU;IAIjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1E,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAuDxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3C,OAAO,CAAC,UAAU;IAYZ,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAWvB,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CvD,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;CAGrC"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Serial = void 0;
4
+ const serialport_1 = require("serialport");
5
+ const adapter_1 = require("../adapter");
6
+ const debug = require('debug')('escpos:serial-adapter');
7
+ const NOT_CONNECTED_MSG = 'Not connected. Call connect(port[, options]) first.';
8
+ const CHUNK_SIZE = 4096; // 4KB chunks for RS232 stability
9
+ class Serial extends adapter_1.Adapter {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.port = null;
13
+ this.path = null;
14
+ this.options = null;
15
+ }
16
+ static async listSerial() {
17
+ return serialport_1.SerialPort.list();
18
+ }
19
+ async connect(port, options) {
20
+ return this.synchronized(async () => {
21
+ this.path = port;
22
+ this.options = options ?? {};
23
+ this.state = 'CONNECTED';
24
+ debug('Serial adapter configured for %s', port);
25
+ return true;
26
+ });
27
+ }
28
+ async open() {
29
+ return this.synchronized(async () => {
30
+ if (!this.path)
31
+ throw new Error(NOT_CONNECTED_MSG);
32
+ if (this.port && this.port.isOpen)
33
+ return true;
34
+ this.state = 'OPENING';
35
+ return new Promise(async (resolve, reject) => {
36
+ try {
37
+ const ports = await serialport_1.SerialPort.list();
38
+ if (!ports.find((i) => i.path === this.path)) {
39
+ this.state = 'DISCONNECTED';
40
+ return reject(new Error('The specified port does not exist!'));
41
+ }
42
+ this.port = new serialport_1.SerialPort({
43
+ ...(this.options ?? {}),
44
+ path: this.path,
45
+ autoOpen: false,
46
+ });
47
+ this.port.on('error', (err) => {
48
+ debug('Error on Serial Port: ', err);
49
+ this.emit('error', err);
50
+ });
51
+ const clearPort = () => {
52
+ this.emit('disconnect', this.port);
53
+ this.port?.removeListener('close', clearPort);
54
+ this.port = null;
55
+ this.state = 'DISCONNECTED';
56
+ };
57
+ this.port.on('close', clearPort);
58
+ this.port.open((err) => {
59
+ if (err) {
60
+ debug('Error Opening the Selected Port: ', err);
61
+ this.port = null;
62
+ this.state = 'DISCONNECTED';
63
+ reject(err);
64
+ }
65
+ else {
66
+ debug('Device Connected and Open!');
67
+ this.state = 'READY';
68
+ this.emit('connect', this.port);
69
+ resolve(true);
70
+ }
71
+ });
72
+ }
73
+ catch (err) {
74
+ this.state = 'DISCONNECTED';
75
+ reject(err);
76
+ }
77
+ });
78
+ });
79
+ }
80
+ async write(data) {
81
+ return this.synchronized(async () => {
82
+ if (!this.port || !this.port.isOpen)
83
+ throw new Error(NOT_CONNECTED_MSG);
84
+ const prevState = this.state;
85
+ this.state = 'BUSY';
86
+ try {
87
+ for (let i = 0; i < data.length; i += CHUNK_SIZE) {
88
+ const chunk = data.subarray(i, i + CHUNK_SIZE);
89
+ await this.writeChunk(chunk);
90
+ }
91
+ return true;
92
+ }
93
+ finally {
94
+ this.state = prevState === 'BUSY' ? 'READY' : prevState;
95
+ }
96
+ });
97
+ }
98
+ writeChunk(chunk) {
99
+ return new Promise((resolve, reject) => {
100
+ this.port.write(chunk, (err) => {
101
+ if (err)
102
+ return reject(err);
103
+ this.port.drain((drainErr) => {
104
+ if (drainErr)
105
+ reject(drainErr);
106
+ else
107
+ resolve();
108
+ });
109
+ });
110
+ });
111
+ }
112
+ async read() {
113
+ return this.synchronized(async () => {
114
+ if (!this.port || !this.port.isOpen)
115
+ throw new Error(NOT_CONNECTED_MSG);
116
+ return new Promise((resolve) => {
117
+ this.port.once('data', (data) => {
118
+ resolve(data);
119
+ });
120
+ });
121
+ });
122
+ }
123
+ async close(options) {
124
+ return this.synchronized(async () => {
125
+ if (!this.port)
126
+ return true;
127
+ this.state = 'CLOSING';
128
+ const time = options?.timeout ?? 50;
129
+ try {
130
+ await new Promise((resolve) => {
131
+ this.port.flush((err) => {
132
+ if (err)
133
+ debug('Flush error: ', err);
134
+ resolve();
135
+ });
136
+ });
137
+ await new Promise((resolve) => setTimeout(resolve, time));
138
+ await new Promise((resolve) => {
139
+ this.port.drain((err) => {
140
+ if (err)
141
+ debug('Drain error: ', err);
142
+ resolve();
143
+ });
144
+ });
145
+ await new Promise((resolve, reject) => {
146
+ this.port.close((err) => {
147
+ if (err)
148
+ reject(err);
149
+ else
150
+ resolve();
151
+ });
152
+ });
153
+ this.emit('close');
154
+ this.port = null;
155
+ this.state = 'DISCONNECTED';
156
+ return true;
157
+ }
158
+ catch (e) {
159
+ debug('Error while closing device: ', e);
160
+ this.emit('error', e);
161
+ this.port = null;
162
+ this.state = 'DISCONNECTED';
163
+ throw e;
164
+ }
165
+ });
166
+ }
167
+ async disconnect() {
168
+ return this.close();
169
+ }
170
+ }
171
+ exports.Serial = Serial;
172
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serial-adapter/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Adapter } from '../adapter';
2
+ export declare class USB extends Adapter {
3
+ private device;
4
+ private endpoint;
5
+ private detachHandler;
6
+ static listUSB(): Promise<Array<{
7
+ manufacturer?: string;
8
+ product?: string;
9
+ vendorId: number;
10
+ productId: number;
11
+ }>>;
12
+ connect(vid?: number, pid?: number): Promise<boolean>;
13
+ open(): Promise<boolean>;
14
+ write(data: Buffer): Promise<boolean>;
15
+ private writeChunk;
16
+ read(): Promise<Buffer>;
17
+ close(): Promise<boolean>;
18
+ disconnect(): Promise<boolean>;
19
+ }
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/usb-adapter/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAerC,qBAAa,GAAI,SAAQ,OAAO;IAC9B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,aAAa,CAA2C;WAEnD,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IA8ClH,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4CrD,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAqCxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmB3C,OAAO,CAAC,UAAU;IAaZ,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAIvB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkCzB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;CAGrC"}