@thermal-label/brother-ql-node 0.0.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/dist/__tests__/discovery.test.d.ts +2 -0
  4. package/dist/__tests__/discovery.test.d.ts.map +1 -0
  5. package/dist/__tests__/discovery.test.js +77 -0
  6. package/dist/__tests__/discovery.test.js.map +1 -0
  7. package/dist/__tests__/errors.test.d.ts +2 -0
  8. package/dist/__tests__/errors.test.d.ts.map +1 -0
  9. package/dist/__tests__/errors.test.js +20 -0
  10. package/dist/__tests__/errors.test.js.map +1 -0
  11. package/dist/__tests__/integration/print-image.test.d.ts +2 -0
  12. package/dist/__tests__/integration/print-image.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/print-image.test.js +22 -0
  14. package/dist/__tests__/integration/print-image.test.js.map +1 -0
  15. package/dist/__tests__/integration/print-text.test.d.ts +2 -0
  16. package/dist/__tests__/integration/print-text.test.d.ts.map +1 -0
  17. package/dist/__tests__/integration/print-text.test.js +25 -0
  18. package/dist/__tests__/integration/print-text.test.js.map +1 -0
  19. package/dist/__tests__/integration/print-two-color.test.d.ts +2 -0
  20. package/dist/__tests__/integration/print-two-color.test.d.ts.map +1 -0
  21. package/dist/__tests__/integration/print-two-color.test.js +28 -0
  22. package/dist/__tests__/integration/print-two-color.test.js.map +1 -0
  23. package/dist/__tests__/integration/tcp.test.d.ts +2 -0
  24. package/dist/__tests__/integration/tcp.test.d.ts.map +1 -0
  25. package/dist/__tests__/integration/tcp.test.js +20 -0
  26. package/dist/__tests__/integration/tcp.test.js.map +1 -0
  27. package/dist/__tests__/printer.test.d.ts +2 -0
  28. package/dist/__tests__/printer.test.d.ts.map +1 -0
  29. package/dist/__tests__/printer.test.js +216 -0
  30. package/dist/__tests__/printer.test.js.map +1 -0
  31. package/dist/__tests__/tcp-transport.test.d.ts +2 -0
  32. package/dist/__tests__/tcp-transport.test.d.ts.map +1 -0
  33. package/dist/__tests__/tcp-transport.test.js +115 -0
  34. package/dist/__tests__/tcp-transport.test.js.map +1 -0
  35. package/dist/__tests__/usb-transport.test.d.ts +2 -0
  36. package/dist/__tests__/usb-transport.test.d.ts.map +1 -0
  37. package/dist/__tests__/usb-transport.test.js +99 -0
  38. package/dist/__tests__/usb-transport.test.js.map +1 -0
  39. package/dist/discovery.d.ts +5 -0
  40. package/dist/discovery.d.ts.map +1 -0
  41. package/dist/discovery.js +31 -0
  42. package/dist/discovery.js.map +1 -0
  43. package/dist/errors.d.ts +8 -0
  44. package/dist/errors.d.ts.map +1 -0
  45. package/dist/errors.js +15 -0
  46. package/dist/errors.js.map +1 -0
  47. package/dist/index.d.ts +9 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/printer.d.ts +18 -0
  52. package/dist/printer.d.ts.map +1 -0
  53. package/dist/printer.js +167 -0
  54. package/dist/printer.js.map +1 -0
  55. package/dist/status.d.ts +2 -0
  56. package/dist/status.d.ts.map +1 -0
  57. package/dist/status.js +2 -0
  58. package/dist/status.js.map +1 -0
  59. package/dist/transport.d.ts +32 -0
  60. package/dist/transport.d.ts.map +1 -0
  61. package/dist/transport.js +120 -0
  62. package/dist/transport.js.map +1 -0
  63. package/dist/types.d.ts +13 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +2 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +76 -0
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { EventEmitter } from 'node:events';
3
+ class MockSocket extends EventEmitter {
4
+ write = vi.fn((_data, cb) => {
5
+ cb?.();
6
+ return true;
7
+ });
8
+ removeListener = vi.fn();
9
+ once = vi.fn((event, handler) => {
10
+ super.once(event, handler);
11
+ return this;
12
+ });
13
+ on = vi.fn((event, handler) => {
14
+ super.on(event, handler);
15
+ return this;
16
+ });
17
+ end = vi.fn((cb) => {
18
+ cb?.();
19
+ });
20
+ connect = vi.fn((_port, _host, cb) => {
21
+ process.nextTick(cb);
22
+ });
23
+ }
24
+ const mockSocket = new MockSocket();
25
+ vi.mock('node:net', () => ({
26
+ default: {
27
+ Socket: vi.fn(() => mockSocket),
28
+ },
29
+ }));
30
+ beforeEach(() => {
31
+ mockSocket.write.mockReset().mockImplementation((_data, cb) => {
32
+ cb?.();
33
+ return true;
34
+ });
35
+ mockSocket.end.mockReset().mockImplementation((cb) => {
36
+ cb?.();
37
+ });
38
+ mockSocket.connect
39
+ .mockReset()
40
+ .mockImplementation((_port, _host, cb) => {
41
+ process.nextTick(cb);
42
+ });
43
+ mockSocket.removeAllListeners();
44
+ });
45
+ describe('TcpTransport', () => {
46
+ it('write calls socket.write with correct data', async () => {
47
+ const { TcpTransport } = await import('../transport.js');
48
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
49
+ const data = new Uint8Array([0x1b, 0x40]);
50
+ await transport.write(data);
51
+ expect(mockSocket.write).toHaveBeenCalledOnce();
52
+ const calledWith = mockSocket.write.mock.calls[0][0];
53
+ expect(calledWith[0]).toBe(0x1b);
54
+ expect(calledWith[1]).toBe(0x40);
55
+ await transport.close();
56
+ });
57
+ it('read waits for N bytes from the stream', async () => {
58
+ const { TcpTransport } = await import('../transport.js');
59
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
60
+ const readPromise = transport.read(4);
61
+ mockSocket.emit('data', Buffer.from([0x01, 0x02, 0x03, 0x04]));
62
+ const result = await readPromise;
63
+ expect(result).toHaveLength(4);
64
+ expect(result[0]).toBe(0x01);
65
+ await transport.close();
66
+ });
67
+ it('close ends the socket', async () => {
68
+ const { TcpTransport } = await import('../transport.js');
69
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
70
+ await transport.close();
71
+ expect(mockSocket.end).toHaveBeenCalledOnce();
72
+ });
73
+ it('read returns immediately when data is already buffered', async () => {
74
+ const { TcpTransport } = await import('../transport.js');
75
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
76
+ mockSocket.emit('data', Buffer.from([0x01, 0x02, 0x03, 0x04]));
77
+ const result = await transport.read(4);
78
+ expect(result).toHaveLength(4);
79
+ expect(result[0]).toBe(0x01);
80
+ await transport.close();
81
+ });
82
+ it('read keeps remainder bytes when more data is buffered than needed', async () => {
83
+ const { TcpTransport } = await import('../transport.js');
84
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
85
+ mockSocket.emit('data', Buffer.from([0x0a, 0x0b, 0x0c, 0x0d, 0x0e]));
86
+ const first = await transport.read(4);
87
+ expect(first).toHaveLength(4);
88
+ expect(first[3]).toBe(0x0d);
89
+ const second = await transport.read(1);
90
+ expect(second[0]).toBe(0x0e);
91
+ await transport.close();
92
+ });
93
+ it('deferred read keeps remainder when more data arrives than needed', async () => {
94
+ const { TcpTransport } = await import('../transport.js');
95
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
96
+ const readPromise = transport.read(4);
97
+ mockSocket.emit('data', Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05]));
98
+ const result = await readPromise;
99
+ expect(result).toHaveLength(4);
100
+ const remainder = await transport.read(1);
101
+ expect(remainder[0]).toBe(0x05);
102
+ await transport.close();
103
+ });
104
+ it('write rejects when socket write fails', async () => {
105
+ const { TcpTransport } = await import('../transport.js');
106
+ const transport = await TcpTransport.connect('192.168.1.1', 9100);
107
+ mockSocket.write.mockImplementationOnce((_data, cb) => {
108
+ cb?.(new Error('socket write error'));
109
+ return true;
110
+ });
111
+ await expect(transport.write(new Uint8Array([0x01]))).rejects.toThrow('socket write error');
112
+ await transport.close();
113
+ });
114
+ });
115
+ //# sourceMappingURL=tcp-transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp-transport.test.js","sourceRoot":"","sources":["../../src/__tests__/tcp-transport.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=usb-transport.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb-transport.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/usb-transport.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ const mockOutTransfer = vi.fn().mockResolvedValue(90);
3
+ const mockInTransfer = vi.fn().mockResolvedValue(Buffer.alloc(32));
4
+ const mockClaim = vi.fn();
5
+ const mockReleaseAsync = vi.fn().mockImplementation(() => Promise.resolve());
6
+ const mockClose = vi.fn();
7
+ const mockOpen = vi.fn();
8
+ const mockInterface = vi.fn();
9
+ vi.mock('usb', () => ({
10
+ default: {
11
+ getDeviceList: vi.fn(() => [
12
+ {
13
+ deviceDescriptor: { idVendor: 0x04f9, idProduct: 0x20a7 },
14
+ busNumber: 1,
15
+ deviceAddress: 5,
16
+ open: mockOpen,
17
+ close: mockClose,
18
+ interface: mockInterface,
19
+ },
20
+ ]),
21
+ },
22
+ }));
23
+ beforeEach(() => {
24
+ mockOpen.mockReset();
25
+ mockClose.mockReset();
26
+ mockClaim.mockReset();
27
+ mockReleaseAsync.mockReset().mockImplementation(() => Promise.resolve());
28
+ mockOutTransfer.mockReset().mockResolvedValue(90);
29
+ mockInTransfer.mockReset().mockResolvedValue(Buffer.alloc(32));
30
+ mockInterface.mockReset().mockReturnValue({
31
+ claim: mockClaim,
32
+ releaseAsync: mockReleaseAsync,
33
+ isKernelDriverActive: vi.fn().mockReturnValue(false),
34
+ endpoints: [
35
+ { direction: 'out', transferAsync: mockOutTransfer },
36
+ { direction: 'in', transferAsync: mockInTransfer },
37
+ ],
38
+ });
39
+ });
40
+ describe('UsbTransport', () => {
41
+ it('write calls the out endpoint transferAsync with correct buffer', async () => {
42
+ const { UsbTransport } = await import('../transport.js');
43
+ const transport = await UsbTransport.open(0x04f9, 0x20a7);
44
+ const data = new Uint8Array([0x1b, 0x40]);
45
+ await transport.write(data);
46
+ expect(mockOutTransfer).toHaveBeenCalledOnce();
47
+ const calledWith = mockOutTransfer.mock.calls[0][0];
48
+ expect(calledWith[0]).toBe(0x1b);
49
+ expect(calledWith[1]).toBe(0x40);
50
+ await transport.close();
51
+ });
52
+ it('read calls the in endpoint transferAsync with correct byte count', async () => {
53
+ const { UsbTransport } = await import('../transport.js');
54
+ const transport = await UsbTransport.open(0x04f9, 0x20a7);
55
+ await transport.read(32);
56
+ expect(mockInTransfer).toHaveBeenCalledWith(32);
57
+ await transport.close();
58
+ });
59
+ it('throws when device not found', async () => {
60
+ const { UsbTransport } = await import('../transport.js');
61
+ await expect(UsbTransport.open(0x04f9, 0x9999)).rejects.toThrow('not found');
62
+ });
63
+ it('close releases interface and closes device', async () => {
64
+ const { UsbTransport } = await import('../transport.js');
65
+ const transport = await UsbTransport.open(0x04f9, 0x20a7);
66
+ await transport.close();
67
+ expect(mockReleaseAsync).toHaveBeenCalledOnce();
68
+ expect(mockClose).toHaveBeenCalledOnce();
69
+ });
70
+ it('read returns empty array when transferAsync returns null', async () => {
71
+ mockInTransfer.mockResolvedValueOnce(null);
72
+ const { UsbTransport } = await import('../transport.js');
73
+ const transport = await UsbTransport.open(0x04f9, 0x20a7);
74
+ const result = await transport.read(32);
75
+ expect(result).toHaveLength(0);
76
+ await transport.close();
77
+ });
78
+ it('throws when USB device has no OUT endpoint', async () => {
79
+ mockInterface.mockReturnValueOnce({
80
+ claim: mockClaim,
81
+ releaseAsync: mockReleaseAsync,
82
+ isKernelDriverActive: vi.fn().mockReturnValue(false),
83
+ endpoints: [{ direction: 'in', transferAsync: mockInTransfer }],
84
+ });
85
+ const { UsbTransport } = await import('../transport.js');
86
+ expect(() => UsbTransport.open(0x04f9, 0x20a7)).toThrow('no bulk OUT endpoint');
87
+ });
88
+ it('throws when USB device has no IN endpoint', async () => {
89
+ mockInterface.mockReturnValueOnce({
90
+ claim: mockClaim,
91
+ releaseAsync: mockReleaseAsync,
92
+ isKernelDriverActive: vi.fn().mockReturnValue(false),
93
+ endpoints: [{ direction: 'out', transferAsync: mockOutTransfer }],
94
+ });
95
+ const { UsbTransport } = await import('../transport.js');
96
+ expect(() => UsbTransport.open(0x04f9, 0x20a7)).toThrow('no bulk IN endpoint');
97
+ });
98
+ });
99
+ //# sourceMappingURL=usb-transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb-transport.test.js","sourceRoot":"","sources":["../../src/__tests__/usb-transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACtD,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACnE,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7E,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AACzB,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE9B,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACpB,OAAO,EAAE;QACP,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;YACzB;gBACE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;gBACzD,SAAS,EAAE,CAAC;gBACZ,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,aAAa;aACzB;SACF,CAAC;KACH;CACF,CAAC,CAAC,CAAC;AAEJ,UAAU,CAAC,GAAG,EAAE;IACd,QAAQ,CAAC,SAAS,EAAE,CAAC;IACrB,SAAS,CAAC,SAAS,EAAE,CAAC;IACtB,SAAS,CAAC,SAAS,EAAE,CAAC;IACtB,gBAAgB,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,eAAe,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAClD,cAAc,CAAC,SAAS,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,aAAa,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC;QACxC,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,gBAAgB;QAC9B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;QACpD,SAAS,EAAE;YACT,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE;YACpD,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE;SACnD;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAW,CAAC;QAC/D,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,aAAa,CAAC,mBAAmB,CAAC;YAChC,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,gBAAgB;YAC9B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;YACpD,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;SAChE,CAAC,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,aAAa,CAAC,mBAAmB,CAAC;YAChC,KAAK,EAAE,SAAS;YAChB,YAAY,EAAE,gBAAgB;YAC9B,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;YACpD,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { DEVICES } from '@thermal-label/brother-ql-core';
2
+ import { type PrinterInfo } from './types.js';
3
+ export declare function listPrinters(): PrinterInfo[];
4
+ export { DEVICES };
5
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAiC,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAgB,YAAY,IAAI,WAAW,EAAE,CA8B5C;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import usb from 'usb';
2
+ import { DEVICES, findDevice, isMassStorageMode } from '@thermal-label/brother-ql-core';
3
+ import {} from './types.js';
4
+ const BROTHER_VID = 0x04f9;
5
+ export function listPrinters() {
6
+ const results = [];
7
+ for (const usbDevice of usb.getDeviceList()) {
8
+ const desc = usbDevice.deviceDescriptor;
9
+ if (desc.idVendor !== BROTHER_VID)
10
+ continue;
11
+ if (isMassStorageMode(desc.idProduct)) {
12
+ // eslint-disable-next-line no-console
13
+ console.warn(`[brother-ql] Detected printer in Editor Lite (mass storage) mode (PID 0x${desc.idProduct.toString(16).toUpperCase()}). ` +
14
+ 'Hold the Editor Lite button until the LED turns off to switch to printer mode.');
15
+ continue;
16
+ }
17
+ const device = findDevice(desc.idVendor, desc.idProduct);
18
+ if (!device)
19
+ continue;
20
+ const path = `${usbDevice.busNumber.toString()}.${usbDevice.deviceAddress.toString()}`;
21
+ results.push({
22
+ device,
23
+ serialNumber: undefined,
24
+ path,
25
+ transport: 'usb',
26
+ });
27
+ }
28
+ return results;
29
+ }
30
+ export { DEVICES };
31
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAoB,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,GAAG,MAAM,CAAC;AAE3B,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,gBAAgB,CAAC;QACxC,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW;YAAE,SAAS;QAE5C,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACV,2EAA2E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK;gBACvH,gFAAgF,CACnF,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,IAAI,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEvF,OAAO,CAAC,IAAI,CAAC;YACX,MAAM;YACN,YAAY,EAAE,SAAS;YACvB,IAAI;YACJ,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare class UnsupportedOperationError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class PrinterError extends Error {
5
+ readonly errors: string[];
6
+ constructor(message: string, errors: string[]);
7
+ }
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,YAAa,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM,EAAE;gBADhC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EAAE;CAKnC"}
package/dist/errors.js ADDED
@@ -0,0 +1,15 @@
1
+ export class UnsupportedOperationError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'UnsupportedOperationError';
5
+ }
6
+ }
7
+ export class PrinterError extends Error {
8
+ errors;
9
+ constructor(message, errors) {
10
+ super(message);
11
+ this.errors = errors;
12
+ this.name = 'PrinterError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,KAAK;IAGnB;IAFlB,YACE,OAAe,EACC,MAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,WAAM,GAAN,MAAM,CAAU;QAGhC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export { UsbTransport, TcpTransport } from './transport.js';
2
+ export { BrotherQLPrinter, openPrinter, openPrinterTcp } from './printer.js';
3
+ export { listPrinters } from './discovery.js';
4
+ export { UnsupportedOperationError, PrinterError } from './errors.js';
5
+ export type { Transport } from './transport.js';
6
+ export type { OpenOptions, PrinterInfo } from './types.js';
7
+ export { DEVICES, MEDIA, findDevice, findMedia, findMediaByWidth, encodeJob, renderText, renderImage, } from '@thermal-label/brother-ql-core';
8
+ export type { DeviceDescriptor, MediaDescriptor, PageData, PageOptions, JobOptions, PrinterStatus, LabelBitmap, RawImageData, MediaType, TextPrintOptions, ImagePrintOptions, } from '@thermal-label/brother-ql-core';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EACL,OAAO,EACP,KAAK,EACL,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,WAAW,GACZ,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACR,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gCAAgC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { UsbTransport, TcpTransport } from './transport.js';
2
+ export { BrotherQLPrinter, openPrinter, openPrinterTcp } from './printer.js';
3
+ export { listPrinters } from './discovery.js';
4
+ export { UnsupportedOperationError, PrinterError } from './errors.js';
5
+ // Re-export core API so consumers only need one import
6
+ export { DEVICES, MEDIA, findDevice, findMedia, findMediaByWidth, encodeJob, renderText, renderImage, } from '@thermal-label/brother-ql-core';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKtE,uDAAuD;AACvD,OAAO,EACL,OAAO,EACP,KAAK,EACL,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,WAAW,GACZ,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type DeviceDescriptor, type MediaDescriptor, type PageData, type PageOptions, type JobOptions, type PrinterStatus, type LabelBitmap, type TextPrintOptions, type ImagePrintOptions } from '@thermal-label/brother-ql-core';
2
+ import { type Transport } from './transport.js';
3
+ import { type OpenOptions } from './types.js';
4
+ export declare class BrotherQLPrinter {
5
+ readonly device: DeviceDescriptor;
6
+ readonly transport: 'usb' | 'tcp';
7
+ private readonly _transport;
8
+ constructor(transport: Transport, device: DeviceDescriptor, transportType: 'usb' | 'tcp');
9
+ getStatus(): Promise<PrinterStatus>;
10
+ print(pages: PageData[], options?: JobOptions): Promise<void>;
11
+ printText(text: string, media: MediaDescriptor, options?: TextPrintOptions): Promise<void>;
12
+ printImage(image: Buffer | string, media: MediaDescriptor, options?: ImagePrintOptions): Promise<void>;
13
+ printTwoColor(black: LabelBitmap, red: LabelBitmap, media: MediaDescriptor, options?: PageOptions): Promise<void>;
14
+ close(): Promise<void>;
15
+ }
16
+ export declare function openPrinter(options?: OpenOptions): Promise<BrotherQLPrinter>;
17
+ export declare function openPrinterTcp(host: string, port?: number): Promise<BrotherQLPrinter>;
18
+ //# sourceMappingURL=printer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI5E,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAE3B,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,GAAG,KAAK;IAMlF,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAYnC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB1F,UAAU,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAyBV,aAAa,CACjB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,IAAI,CAAC;IAgBV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgBlF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkBzF"}
@@ -0,0 +1,167 @@
1
+ import { encodeJob, findDevice, renderText, renderImage, } from '@thermal-label/brother-ql-core';
2
+ import { rotateBitmap } from '@mbtech-nl/bitmap';
3
+ import { UsbTransport, TcpTransport } from './transport.js';
4
+ import { parseStatus, STATUS_REQUEST } from './status.js';
5
+ import { listPrinters } from './discovery.js';
6
+ import { UnsupportedOperationError } from './errors.js';
7
+ import {} from './types.js';
8
+ const BROTHER_VID = 0x04f9;
9
+ export class BrotherQLPrinter {
10
+ device;
11
+ transport;
12
+ _transport;
13
+ constructor(transport, device, transportType) {
14
+ this._transport = transport;
15
+ this.device = device;
16
+ this.transport = transportType;
17
+ }
18
+ async getStatus() {
19
+ await this._transport.write(STATUS_REQUEST);
20
+ // The USB IN endpoint (transferAsync) resolves immediately with 0 bytes if
21
+ // the printer hasn't queued its response yet. Retry until we have 32 bytes.
22
+ for (let attempt = 0; attempt < 10; attempt++) {
23
+ await new Promise(r => setTimeout(r, 150));
24
+ const bytes = await this._transport.read(32);
25
+ if (bytes.length >= 32)
26
+ return parseStatus(bytes);
27
+ }
28
+ throw new Error('Printer did not respond to status request within 1.5s');
29
+ }
30
+ async print(pages, options) {
31
+ const data = encodeJob(pages, options);
32
+ await this._transport.write(data);
33
+ }
34
+ async printText(text, media, options) {
35
+ const { invert, scaleX, scaleY, ...pageOptions } = options ?? {};
36
+ // Scale so the label is roughly square: largest integer scale where neither the tape
37
+ // width (base.heightPx axis) nor the label length (base.widthPx axis) exceeds printAreaDots.
38
+ const base = renderText(text, { scaleX: 1, scaleY: 1 });
39
+ const autoScale = Math.max(1, Math.floor(media.printAreaDots / Math.max(base.widthPx, base.heightPx)));
40
+ const effectiveScaleY = scaleY ?? autoScale;
41
+ const effectiveScaleX = scaleX ?? autoScale;
42
+ const rawBitmap = renderText(text, {
43
+ ...(invert !== undefined ? { invert } : {}),
44
+ scaleX: effectiveScaleX,
45
+ scaleY: effectiveScaleY,
46
+ });
47
+ const bitmap = rotateBitmap(rawBitmap, 270);
48
+ const page = {
49
+ bitmap,
50
+ media,
51
+ ...(Object.keys(pageOptions).length > 0 ? { options: pageOptions } : {}),
52
+ };
53
+ await this.print([page]);
54
+ }
55
+ async printImage(image, media, options) {
56
+ const { threshold, dither, invert, rotate, ...pageOptions } = options ?? {};
57
+ let rawImageData;
58
+ if (typeof image === 'string') {
59
+ rawImageData = await loadImageFile(image);
60
+ }
61
+ else {
62
+ rawImageData = await decodeBuffer(image);
63
+ }
64
+ const rawBitmap = renderImage(rawImageData, {
65
+ ...(threshold !== undefined ? { threshold } : {}),
66
+ ...(dither !== undefined ? { dither } : {}),
67
+ ...(invert !== undefined ? { invert } : {}),
68
+ ...(rotate !== undefined ? { rotate } : {}),
69
+ });
70
+ const bitmap = rotateBitmap(rawBitmap, 270);
71
+ const page = {
72
+ bitmap,
73
+ media,
74
+ ...(Object.keys(pageOptions).length > 0 ? { options: pageOptions } : {}),
75
+ };
76
+ await this.print([page]);
77
+ }
78
+ async printTwoColor(black, red, media, options) {
79
+ if (!this.device.twoColor) {
80
+ throw new UnsupportedOperationError(`${this.device.name} does not support two-color printing. ` +
81
+ 'Two-color printing requires a QL-800, QL-810W, or QL-820NWB with DK-22251 labels.');
82
+ }
83
+ const page = {
84
+ bitmap: black,
85
+ redBitmap: red,
86
+ media,
87
+ ...(options !== undefined ? { options } : {}),
88
+ };
89
+ await this.print([page]);
90
+ }
91
+ async close() {
92
+ await this._transport.close();
93
+ }
94
+ }
95
+ export async function openPrinter(options) {
96
+ const { vid = BROTHER_VID, pid } = options ?? {};
97
+ if (pid) {
98
+ const device = findDevice(vid, pid);
99
+ if (!device)
100
+ throw new Error(`Unknown device: ${vid.toString(16)}:${pid.toString(16)}`);
101
+ const transport = await UsbTransport.open(vid, pid);
102
+ return new BrotherQLPrinter(transport, device, 'usb');
103
+ }
104
+ const printers = listPrinters();
105
+ if (printers.length === 0)
106
+ throw new Error('No Brother QL printers found');
107
+ const info = printers[0];
108
+ if (!info)
109
+ throw new Error('No Brother QL printers found');
110
+ const transport = await UsbTransport.open(info.device.vid, info.device.pid);
111
+ return new BrotherQLPrinter(transport, info.device, 'usb');
112
+ }
113
+ export async function openPrinterTcp(host, port = 9100) {
114
+ const transport = await TcpTransport.connect(host, port);
115
+ // We can't know the device descriptor from TCP alone — request status and detect
116
+ // Fall back to a generic QL-820NWB descriptor (most capable, verified by maintainer)
117
+ const status = await (async () => {
118
+ await transport.write(new Uint8Array([0x1b, 0x69, 0x53]));
119
+ return transport.read(32);
120
+ })();
121
+ const mediaWidthMm = status[10] ?? 0;
122
+ // Try to find a matching device by network capability
123
+ const { DEVICES } = await import('@thermal-label/brother-ql-core');
124
+ const networkDevice = Object.values(DEVICES).find(d => d.network !== 'none');
125
+ const device = networkDevice ?? DEVICES.QL_820NWB;
126
+ void mediaWidthMm; // may be used for smarter detection in future
127
+ return new BrotherQLPrinter(transport, device, 'tcp');
128
+ }
129
+ async function loadImageFile(filePath) {
130
+ try {
131
+ const canvas = await import('@napi-rs/canvas');
132
+ const img = await canvas.loadImage(filePath);
133
+ const canvasEl = canvas.createCanvas(img.width, img.height);
134
+ const ctx = canvasEl.getContext('2d');
135
+ ctx.drawImage(img, 0, 0);
136
+ const imageData = ctx.getImageData(0, 0, img.width, img.height);
137
+ return {
138
+ width: img.width,
139
+ height: img.height,
140
+ data: new Uint8Array(imageData.data.buffer),
141
+ };
142
+ }
143
+ catch {
144
+ throw new Error('Cannot load image file: install @napi-rs/canvas for image file support, ' +
145
+ 'or pass a pre-decoded RawImageData to print().');
146
+ }
147
+ }
148
+ async function decodeBuffer(buffer) {
149
+ try {
150
+ const canvas = await import('@napi-rs/canvas');
151
+ const img = await canvas.loadImage(buffer);
152
+ const canvasEl = canvas.createCanvas(img.width, img.height);
153
+ const ctx = canvasEl.getContext('2d');
154
+ ctx.drawImage(img, 0, 0);
155
+ const imageData = ctx.getImageData(0, 0, img.width, img.height);
156
+ return {
157
+ width: img.width,
158
+ height: img.height,
159
+ data: new Uint8Array(imageData.data.buffer),
160
+ };
161
+ }
162
+ catch {
163
+ throw new Error('Cannot decode image buffer: install @napi-rs/canvas for PNG/JPEG decoding, ' +
164
+ 'or pass a pre-decoded RawImageData to print().');
165
+ }
166
+ }
167
+ //# sourceMappingURL=printer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printer.js","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { parseStatus, STATUS_REQUEST } from '@thermal-label/brother-ql-core';
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC"}
package/dist/status.js ADDED
@@ -0,0 +1,2 @@
1
+ export { parseStatus, STATUS_REQUEST } from '@thermal-label/brother-ql-core';
2
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import net from 'node:net';
2
+ import usb from 'usb';
3
+ export interface Transport {
4
+ write(data: Uint8Array): Promise<void>;
5
+ read(byteCount: number): Promise<Uint8Array>;
6
+ close(): Promise<void>;
7
+ }
8
+ export declare class UsbTransport implements Transport {
9
+ private readonly outEndpoint;
10
+ private readonly inEndpoint;
11
+ private readonly iface;
12
+ private readonly device;
13
+ constructor(device: usb.Device);
14
+ static open(vid: number, pid: number): Promise<UsbTransport>;
15
+ write(data: Uint8Array): Promise<void>;
16
+ read(byteCount: number): Promise<Uint8Array>;
17
+ close(): Promise<void>;
18
+ }
19
+ export declare class TcpTransport implements Transport {
20
+ private readonly socket;
21
+ private readonly chunks;
22
+ private resolveRead;
23
+ private needed;
24
+ constructor(socket: net.Socket);
25
+ static connect(host: string, port?: number): Promise<TcpTransport>;
26
+ private buffered;
27
+ private tryResolveRead;
28
+ write(data: Uint8Array): Promise<void>;
29
+ read(byteCount: number): Promise<Uint8Array>;
30
+ close(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;gBAExB,MAAM,EAAE,GAAG,CAAC,MAAM;IAsB9B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAWtD,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAK5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAED,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,WAAW,CAA4C;IAC/D,OAAO,CAAC,MAAM,CAAK;gBAEP,MAAM,EAAE,GAAG,CAAC,MAAM;WAQjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAWtE,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,cAAc;IAchB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAStC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAe5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}