@thermal-label/brother-ql-web 0.3.0 → 0.5.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/dist/__tests__/printer.test.js +114 -20
- package/dist/__tests__/printer.test.js.map +1 -1
- package/dist/__tests__/webusb-mock.d.ts +11 -0
- package/dist/__tests__/webusb-mock.d.ts.map +1 -1
- package/dist/__tests__/webusb-mock.js +55 -6
- package/dist/__tests__/webusb-mock.js.map +1 -1
- package/dist/printer.d.ts +20 -0
- package/dist/printer.d.ts.map +1 -1
- package/dist/printer.js +118 -9
- package/dist/printer.js.map +1 -1
- package/package.json +6 -6
|
@@ -6,6 +6,9 @@ import { createMockUSBDevice } from './webusb-mock.js';
|
|
|
6
6
|
function solidRgba(width, height) {
|
|
7
7
|
return { width, height, data: new Uint8Array(width * height * 4).fill(0) };
|
|
8
8
|
}
|
|
9
|
+
function noop() {
|
|
10
|
+
// intentionally empty — used to silence console.warn in tests
|
|
11
|
+
}
|
|
9
12
|
function redRgba(width, height) {
|
|
10
13
|
const data = new Uint8Array(width * height * 4);
|
|
11
14
|
for (let i = 0; i < data.length; i += 4) {
|
|
@@ -17,29 +20,29 @@ function redRgba(width, height) {
|
|
|
17
20
|
return { width, height, data };
|
|
18
21
|
}
|
|
19
22
|
describe('WebBrotherQLPrinter', () => {
|
|
20
|
-
it('exposes adapter metadata for a QL-
|
|
21
|
-
const device = createMockUSBDevice({ productId:
|
|
23
|
+
it('exposes adapter metadata for a QL-820NWBc', async () => {
|
|
24
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
22
25
|
const printer = await fromUSBDevice(device);
|
|
23
26
|
expect(printer.family).toBe('brother-ql');
|
|
24
|
-
expect(printer.model).toBe('QL-
|
|
25
|
-
expect(printer.device.twoColor).toBe(true);
|
|
27
|
+
expect(printer.model).toBe('QL-820NWBc');
|
|
28
|
+
expect(printer.device.engines[0]?.capabilities?.twoColor).toBe(true);
|
|
26
29
|
expect(printer.connected).toBe(true);
|
|
27
30
|
});
|
|
28
31
|
it('print() splits two-colour images when media carries a palette', async () => {
|
|
29
|
-
const device = createMockUSBDevice({ productId:
|
|
32
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
30
33
|
const printer = await fromUSBDevice(device);
|
|
31
34
|
await printer.print(redRgba(64, 64), MEDIA[251]);
|
|
32
35
|
expect(device.__transfers.length).toBeGreaterThan(0);
|
|
33
36
|
});
|
|
34
37
|
it('createPreview() returns two planes on multi-ink media', async () => {
|
|
35
|
-
const device = createMockUSBDevice({ productId:
|
|
38
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
36
39
|
const printer = await fromUSBDevice(device);
|
|
37
40
|
const preview = await printer.createPreview(redRgba(64, 64), { media: MEDIA[251] });
|
|
38
41
|
expect(preview.planes.map(p => p.name)).toEqual(['black', 'red']);
|
|
39
42
|
expect(preview.assumed).toBe(false);
|
|
40
43
|
});
|
|
41
44
|
it('createPreview() returns one plane on single-ink media', async () => {
|
|
42
|
-
const device = createMockUSBDevice({ productId:
|
|
45
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
43
46
|
const printer = await fromUSBDevice(device);
|
|
44
47
|
const preview = await printer.createPreview(solidRgba(64, 64), { media: MEDIA[259] });
|
|
45
48
|
expect(preview.planes).toHaveLength(1);
|
|
@@ -48,7 +51,7 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
48
51
|
const bytes = new Uint8Array(32);
|
|
49
52
|
bytes[10] = 62;
|
|
50
53
|
bytes[11] = 0x0a;
|
|
51
|
-
const device = createMockUSBDevice({ productId:
|
|
54
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
52
55
|
const printer = await fromUSBDevice(device);
|
|
53
56
|
await printer.getStatus();
|
|
54
57
|
const preview = await printer.createPreview(solidRgba(64, 64));
|
|
@@ -56,21 +59,21 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
56
59
|
expect(preview.media.id).toBe(259);
|
|
57
60
|
});
|
|
58
61
|
it('createPreview() falls back to DEFAULT_MEDIA with assumed=true', async () => {
|
|
59
|
-
const device = createMockUSBDevice({ productId:
|
|
62
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
60
63
|
const printer = await fromUSBDevice(device);
|
|
61
64
|
const preview = await printer.createPreview(solidRgba(64, 64));
|
|
62
65
|
expect(preview.assumed).toBe(true);
|
|
63
66
|
expect(preview.media.id).toBe(259);
|
|
64
67
|
});
|
|
65
68
|
it('close() releases the underlying USB device', async () => {
|
|
66
|
-
const device = createMockUSBDevice({ productId:
|
|
69
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
67
70
|
const printer = await fromUSBDevice(device);
|
|
68
71
|
await printer.close();
|
|
69
72
|
expect(device.opened).toBe(false);
|
|
70
73
|
expect(printer.connected).toBe(false);
|
|
71
74
|
});
|
|
72
75
|
it('print() writes an encoded raster job for single-ink media', async () => {
|
|
73
|
-
const device = createMockUSBDevice({ productId:
|
|
76
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
74
77
|
const printer = await fromUSBDevice(device);
|
|
75
78
|
await printer.print(solidRgba(64, 64), MEDIA[259]);
|
|
76
79
|
expect(device.__transfers.length).toBeGreaterThan(0);
|
|
@@ -80,10 +83,10 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
80
83
|
// 800×200 landscape RGBA — auto-rotate kicks in. Bypass with
|
|
81
84
|
// `rotate: 0` for the comparison case; the auto path encodes more
|
|
82
85
|
// raster rows so the total transfer is larger.
|
|
83
|
-
const autoDevice = createMockUSBDevice({ productId:
|
|
86
|
+
const autoDevice = createMockUSBDevice({ productId: 0x209d });
|
|
84
87
|
const autoPrinter = await fromUSBDevice(autoDevice);
|
|
85
88
|
await autoPrinter.print(solidRgba(800, 200), MEDIA[271]);
|
|
86
|
-
const bypassDevice = createMockUSBDevice({ productId:
|
|
89
|
+
const bypassDevice = createMockUSBDevice({ productId: 0x209d });
|
|
87
90
|
const bypassPrinter = await fromUSBDevice(bypassDevice);
|
|
88
91
|
await bypassPrinter.print(solidRgba(800, 200), MEDIA[271], { rotate: 0 });
|
|
89
92
|
const totalAuto = autoDevice.__transfers.reduce((acc, t) => acc + t.data.length, 0);
|
|
@@ -101,7 +104,7 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
101
104
|
throw new Error(`no raster row with opcode 0x${opcode.toString(16)} colour 0x${colour.toString(16)}`);
|
|
102
105
|
}
|
|
103
106
|
it('print() horizontally mirrors the rendered bitmap (single-colour)', async () => {
|
|
104
|
-
const device = createMockUSBDevice({ productId:
|
|
107
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
105
108
|
const printer = await fromUSBDevice(device);
|
|
106
109
|
const data = new Uint8Array(16 * 4).fill(0xff);
|
|
107
110
|
data[0] = 0;
|
|
@@ -113,7 +116,7 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
113
116
|
expect(row[1]).toBe(0x00);
|
|
114
117
|
});
|
|
115
118
|
it('print() splits the job into ≤1 KB OUT-pipe chunks (firmware flow-control)', async () => {
|
|
116
|
-
const device = createMockUSBDevice({ productId:
|
|
119
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
117
120
|
const printer = await fromUSBDevice(device);
|
|
118
121
|
await printer.print(solidRgba(696, 120), MEDIA[251]);
|
|
119
122
|
expect(device.__transfers.length).toBeGreaterThan(1);
|
|
@@ -122,7 +125,7 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
122
125
|
}
|
|
123
126
|
});
|
|
124
127
|
it('print() horizontally mirrors both planes on two-colour media', async () => {
|
|
125
|
-
const device = createMockUSBDevice({ productId:
|
|
128
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
126
129
|
const printer = await fromUSBDevice(device);
|
|
127
130
|
const data = new Uint8Array(16 * 4).fill(0xff);
|
|
128
131
|
data[0] = 255;
|
|
@@ -134,8 +137,28 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
134
137
|
expect(redRow[3]).toBe(0x10);
|
|
135
138
|
expect(redRow[1]).toBe(0x00);
|
|
136
139
|
});
|
|
140
|
+
it('print() reuses media detected from a prior getStatus()', async () => {
|
|
141
|
+
const bytes = new Uint8Array(32);
|
|
142
|
+
bytes[10] = 62;
|
|
143
|
+
bytes[11] = 0x0a;
|
|
144
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
145
|
+
const printer = await fromUSBDevice(device);
|
|
146
|
+
await printer.getStatus();
|
|
147
|
+
const before = device.__transfers.length;
|
|
148
|
+
await printer.print(solidRgba(64, 64));
|
|
149
|
+
expect(device.__transfers.length).toBeGreaterThan(before);
|
|
150
|
+
});
|
|
151
|
+
it('print() forwards highRes:true into the encoded job on a high-res-capable engine', async () => {
|
|
152
|
+
// PT-P750W (vid=0x04f9 pid=0x2062) has highResDpi=360 on its primary
|
|
153
|
+
// engine; QL series do not, so the highRes path can only be exercised
|
|
154
|
+
// here. TZe-211 (id 401) is the smallest stocked TZe tape.
|
|
155
|
+
const device = createMockUSBDevice({ productId: 0x2062 });
|
|
156
|
+
const printer = await fromUSBDevice(device);
|
|
157
|
+
await printer.print(solidRgba(64, 64), MEDIA[401], { highRes: true });
|
|
158
|
+
expect(device.__transfers.length).toBeGreaterThan(0);
|
|
159
|
+
});
|
|
137
160
|
it('print() throws MediaNotSpecifiedError when media is missing', async () => {
|
|
138
|
-
const device = createMockUSBDevice({ productId:
|
|
161
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
139
162
|
const printer = await fromUSBDevice(device);
|
|
140
163
|
await expect(printer.print(solidRgba(64, 64))).rejects.toBeInstanceOf(MediaNotSpecifiedError);
|
|
141
164
|
});
|
|
@@ -143,21 +166,92 @@ describe('WebBrotherQLPrinter', () => {
|
|
|
143
166
|
const bytes = new Uint8Array(32);
|
|
144
167
|
bytes[10] = 62;
|
|
145
168
|
bytes[11] = 0x0a;
|
|
146
|
-
const device = createMockUSBDevice({ productId:
|
|
169
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
147
170
|
const printer = await fromUSBDevice(device);
|
|
148
171
|
const status = await printer.getStatus();
|
|
149
172
|
expect(status.rawBytes.length).toBe(32);
|
|
150
173
|
expect(status.editorLiteMode).toBe(false);
|
|
151
174
|
expect(status.detectedMedia?.id).toBe(259);
|
|
152
175
|
});
|
|
176
|
+
it('onStatus delivers spontaneous frames that arrive without a getStatus request', async () => {
|
|
177
|
+
const bytes = new Uint8Array(32);
|
|
178
|
+
bytes[10] = 62;
|
|
179
|
+
bytes[11] = 0x0a;
|
|
180
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
181
|
+
const printer = await fromUSBDevice(device);
|
|
182
|
+
const received = [];
|
|
183
|
+
const unsubscribe = printer.onStatus(s => {
|
|
184
|
+
if (s.detectedMedia)
|
|
185
|
+
received.push(s.detectedMedia.id);
|
|
186
|
+
});
|
|
187
|
+
// Simulate a spontaneous frame the printer would push on lid close /
|
|
188
|
+
// media insert — feed it directly into the mock pipe without an
|
|
189
|
+
// ESC iS request.
|
|
190
|
+
device.__pushUnsolicited(bytes);
|
|
191
|
+
// Drain microtasks so the read loop can pick the frame up.
|
|
192
|
+
await new Promise(r => setTimeout(r, 0));
|
|
193
|
+
unsubscribe();
|
|
194
|
+
expect(received).toContain(259);
|
|
195
|
+
});
|
|
196
|
+
it('onStatus stops firing after unsubscribe', async () => {
|
|
197
|
+
const bytes = new Uint8Array(32);
|
|
198
|
+
bytes[10] = 62;
|
|
199
|
+
bytes[11] = 0x0a;
|
|
200
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
201
|
+
const printer = await fromUSBDevice(device);
|
|
202
|
+
let count = 0;
|
|
203
|
+
const unsubscribe = printer.onStatus(() => {
|
|
204
|
+
count += 1;
|
|
205
|
+
});
|
|
206
|
+
device.__pushUnsolicited(bytes);
|
|
207
|
+
await new Promise(r => setTimeout(r, 0));
|
|
208
|
+
unsubscribe();
|
|
209
|
+
device.__pushUnsolicited(bytes);
|
|
210
|
+
await new Promise(r => setTimeout(r, 0));
|
|
211
|
+
expect(count).toBe(1);
|
|
212
|
+
});
|
|
213
|
+
it('getStatus also fires onStatus subscribers (the response flows through the same stream)', async () => {
|
|
214
|
+
const bytes = new Uint8Array(32);
|
|
215
|
+
bytes[10] = 62;
|
|
216
|
+
bytes[11] = 0x0a;
|
|
217
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
218
|
+
const printer = await fromUSBDevice(device);
|
|
219
|
+
let count = 0;
|
|
220
|
+
const unsubscribe = printer.onStatus(() => {
|
|
221
|
+
count += 1;
|
|
222
|
+
});
|
|
223
|
+
await printer.getStatus();
|
|
224
|
+
unsubscribe();
|
|
225
|
+
expect(count).toBe(1);
|
|
226
|
+
});
|
|
153
227
|
it('throws for unknown USB devices', async () => {
|
|
154
228
|
const device = createMockUSBDevice({ vendorId: 0x1234, productId: 0x5678 });
|
|
155
229
|
await expect(fromUSBDevice(device)).rejects.toThrow('Unsupported USB device');
|
|
156
230
|
});
|
|
231
|
+
it('keeps dispatching to remaining listeners when one throws', async () => {
|
|
232
|
+
const bytes = new Uint8Array(32);
|
|
233
|
+
bytes[10] = 62;
|
|
234
|
+
bytes[11] = 0x0a;
|
|
235
|
+
const device = createMockUSBDevice({ productId: 0x209d, statusBytes: bytes });
|
|
236
|
+
const printer = await fromUSBDevice(device);
|
|
237
|
+
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(noop);
|
|
238
|
+
const otherListener = vi.fn();
|
|
239
|
+
const throwingUnsub = printer.onStatus(() => {
|
|
240
|
+
throw new Error('listener boom');
|
|
241
|
+
});
|
|
242
|
+
const otherUnsub = printer.onStatus(otherListener);
|
|
243
|
+
device.__pushUnsolicited(bytes);
|
|
244
|
+
await new Promise(r => setTimeout(r, 0));
|
|
245
|
+
throwingUnsub();
|
|
246
|
+
otherUnsub();
|
|
247
|
+
expect(otherListener).toHaveBeenCalled();
|
|
248
|
+
expect(warnSpy).toHaveBeenCalledWith('[brother-ql-web] status listener threw:', expect.any(Error));
|
|
249
|
+
warnSpy.mockRestore();
|
|
250
|
+
});
|
|
157
251
|
});
|
|
158
252
|
describe('requestPrinter', () => {
|
|
159
253
|
it('passes the brother-ql VID/PIDs to navigator.usb.requestDevice', async () => {
|
|
160
|
-
const device = createMockUSBDevice({ productId:
|
|
254
|
+
const device = createMockUSBDevice({ productId: 0x209d });
|
|
161
255
|
const requestDevice = vi.fn(() => Promise.resolve(device));
|
|
162
256
|
Object.defineProperty(globalThis, 'navigator', {
|
|
163
257
|
value: { usb: { requestDevice } },
|
|
@@ -168,7 +262,7 @@ describe('requestPrinter', () => {
|
|
|
168
262
|
const call = requestDevice.mock.calls[0][0];
|
|
169
263
|
const pids = call.filters.map(f => f.productId);
|
|
170
264
|
for (const d of Object.values(DEVICES)) {
|
|
171
|
-
expect(pids).toContain(d.pid);
|
|
265
|
+
expect(pids).toContain(parseInt(d.transports.usb.pid, 16));
|
|
172
266
|
}
|
|
173
267
|
});
|
|
174
268
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printer.test.js","sourceRoot":"","sources":["../../src/__tests__/printer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,SAAS,SAAS,CAChB,KAAa,EACb,MAAc;IAMd,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,OAAO,CACd,KAAa,EACb,MAAc;IAMd,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAE,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAE,EAAE,CAAC,CAAC;QACvF,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACjB,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,iEAAiE;QACjE,6DAA6D;QAC7D,kEAAkE;QAClE,+CAA+C;QAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAE1E,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,8CAA8C;IAC9C,SAAS,cAAc,CAAC,KAAiB,EAAE,MAAc,EAAE,MAAc;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC1E,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACd,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACZ,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACd,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACjB,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE;YAC7C,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,EAAE;YACjC,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,MAAM,cAAc,EAAE,CAAC;QAEvB,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAI,aAAa,CAAC,IAAI,CAAC,KAAuD,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"printer.test.js","sourceRoot":"","sources":["../../src/__tests__/printer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,21 @@ export interface MockUSBDevice extends USBDevice {
|
|
|
4
4
|
data: Uint8Array;
|
|
5
5
|
}[];
|
|
6
6
|
__statusBytes: Uint8Array;
|
|
7
|
+
/**
|
|
8
|
+
* Inject an unsolicited status frame into the bulk-IN pipe. Used by
|
|
9
|
+
* tests to simulate spontaneous events the printer pushes outside of
|
|
10
|
+
* a getStatus request (lid open/close, media insert, etc.).
|
|
11
|
+
*/
|
|
12
|
+
__pushUnsolicited: (frame: Uint8Array) => void;
|
|
7
13
|
}
|
|
8
14
|
export declare function createMockUSBDevice(overrides?: {
|
|
9
15
|
vendorId?: number;
|
|
10
16
|
productId?: number;
|
|
17
|
+
/**
|
|
18
|
+
* Response template for ESC iS (`1B 69 53`). Each status request
|
|
19
|
+
* enqueues a copy of this frame — modelling the real printer's
|
|
20
|
+
* "request → one response" cycle. Defaults to a 32-byte zero frame.
|
|
21
|
+
*/
|
|
11
22
|
statusBytes?: Uint8Array;
|
|
12
23
|
}): MockUSBDevice;
|
|
13
24
|
//# sourceMappingURL=webusb-mock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webusb-mock.d.ts","sourceRoot":"","sources":["../../src/__tests__/webusb-mock.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,WAAW,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IAC5D,aAAa,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"webusb-mock.d.ts","sourceRoot":"","sources":["../../src/__tests__/webusb-mock.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,WAAW,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IAC5D,aAAa,EAAE,UAAU,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAChD;AAED,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAC;CAC1B,GAAG,aAAa,CAoHhB"}
|
|
@@ -2,6 +2,19 @@ import { vi } from 'vitest';
|
|
|
2
2
|
export function createMockUSBDevice(overrides) {
|
|
3
3
|
const transfers = [];
|
|
4
4
|
let opened = false;
|
|
5
|
+
// Single in-flight pipe queue. Each ESC iS write appends a response
|
|
6
|
+
// copy. Pending readers (calls to `transferIn` made while the queue
|
|
7
|
+
// is empty) park in `waiters` and are resolved as soon as a frame is
|
|
8
|
+
// appended — matching real WebUSB bulk-IN behaviour.
|
|
9
|
+
const frameQueue = [];
|
|
10
|
+
const waiters = [];
|
|
11
|
+
function enqueue(frame) {
|
|
12
|
+
const waiter = waiters.shift();
|
|
13
|
+
if (waiter)
|
|
14
|
+
waiter(frame);
|
|
15
|
+
else
|
|
16
|
+
frameQueue.push(frame);
|
|
17
|
+
}
|
|
5
18
|
const endpoints = [
|
|
6
19
|
{ endpointNumber: 2, direction: 'out' },
|
|
7
20
|
{ endpointNumber: 1, direction: 'in' },
|
|
@@ -28,7 +41,7 @@ export function createMockUSBDevice(overrides) {
|
|
|
28
41
|
const statusBytes = overrides?.statusBytes ?? new Uint8Array(32);
|
|
29
42
|
const device = {
|
|
30
43
|
vendorId: overrides?.vendorId ?? 0x04f9,
|
|
31
|
-
productId: overrides?.productId ??
|
|
44
|
+
productId: overrides?.productId ?? 0x209d,
|
|
32
45
|
serialNumber: undefined,
|
|
33
46
|
get opened() {
|
|
34
47
|
return opened;
|
|
@@ -40,6 +53,20 @@ export function createMockUSBDevice(overrides) {
|
|
|
40
53
|
}),
|
|
41
54
|
close: vi.fn(() => {
|
|
42
55
|
opened = false;
|
|
56
|
+
// Reject any pending readers with a TransportClosed-shaped error
|
|
57
|
+
// so the read loop can exit cleanly.
|
|
58
|
+
while (waiters.length > 0) {
|
|
59
|
+
const waiter = waiters.shift();
|
|
60
|
+
if (waiter) {
|
|
61
|
+
const err = new Error('Transport closed');
|
|
62
|
+
err.name = 'TransportClosedError';
|
|
63
|
+
// The mock's transferIn signals via the resolved Promise — to
|
|
64
|
+
// surface a rejection, route via the waiter as a thrown call.
|
|
65
|
+
// Using a sentinel "empty" frame works because the read loop
|
|
66
|
+
// checks `transport.connected` which flips to false on close.
|
|
67
|
+
waiter(new Uint8Array(0));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
43
70
|
return Promise.resolve();
|
|
44
71
|
}),
|
|
45
72
|
selectConfiguration: vi.fn(() => Promise.resolve()),
|
|
@@ -48,18 +75,40 @@ export function createMockUSBDevice(overrides) {
|
|
|
48
75
|
transferOut: vi.fn((endpointNumber, data) => {
|
|
49
76
|
const array = data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
50
77
|
transfers.push({ endpointNumber, data: Uint8Array.from(array) });
|
|
78
|
+
// Brother ESC iS = `1B 69 53`. Enqueue a response copy.
|
|
79
|
+
if (array.length >= 3 && array[0] === 0x1b && array[1] === 0x69 && array[2] === 0x53) {
|
|
80
|
+
enqueue(Uint8Array.from(statusBytes));
|
|
81
|
+
}
|
|
51
82
|
return Promise.resolve({ bytesWritten: array.byteLength, status: 'ok' });
|
|
52
83
|
}),
|
|
53
84
|
transferIn: vi.fn((_endpointNumber, length) => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
85
|
+
// Drain any pre-queued frames first.
|
|
86
|
+
const next = frameQueue.shift();
|
|
87
|
+
if (next) {
|
|
88
|
+
const out = new Uint8Array(length);
|
|
89
|
+
out.set(next.subarray(0, length));
|
|
90
|
+
return Promise.resolve({
|
|
91
|
+
data: new DataView(out.buffer),
|
|
92
|
+
status: 'ok',
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
// Park as a waiter; resolve when a future frame is enqueued.
|
|
96
|
+
return new Promise(resolve => {
|
|
97
|
+
waiters.push(frame => {
|
|
98
|
+
const out = new Uint8Array(length);
|
|
99
|
+
out.set(frame.subarray(0, Math.min(length, frame.length)));
|
|
100
|
+
resolve({
|
|
101
|
+
data: new DataView(out.buffer, 0, frame.length),
|
|
102
|
+
status: 'ok',
|
|
103
|
+
});
|
|
104
|
+
});
|
|
59
105
|
});
|
|
60
106
|
}),
|
|
61
107
|
__transfers: transfers,
|
|
62
108
|
__statusBytes: statusBytes,
|
|
109
|
+
__pushUnsolicited: (frame) => {
|
|
110
|
+
enqueue(Uint8Array.from(frame));
|
|
111
|
+
},
|
|
63
112
|
};
|
|
64
113
|
return device;
|
|
65
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webusb-mock.js","sourceRoot":"","sources":["../../src/__tests__/webusb-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"webusb-mock.js","sourceRoot":"","sources":["../../src/__tests__/webusb-mock.ts"],"names":[],"mappings":"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"}
|
package/dist/printer.d.ts
CHANGED
|
@@ -15,13 +15,33 @@ export declare class WebBrotherQLPrinter implements PrinterAdapter {
|
|
|
15
15
|
readonly device: BrotherQLDevice;
|
|
16
16
|
private readonly transport;
|
|
17
17
|
private lastStatus;
|
|
18
|
+
private readonly statusListeners;
|
|
19
|
+
private readLoopStarted;
|
|
20
|
+
private readLoopStopped;
|
|
18
21
|
constructor(device: BrotherQLDevice, transport: Transport);
|
|
19
22
|
get model(): string;
|
|
20
23
|
get connected(): boolean;
|
|
21
24
|
print(image: RawImageData, media?: MediaDescriptor, options?: BrotherQLPrintOptions): Promise<void>;
|
|
22
25
|
private writeChunked;
|
|
23
26
|
createPreview(image: RawImageData, options?: PreviewOptions): Promise<PreviewResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Send ESC iS and resolve with the next status frame the printer
|
|
29
|
+
* emits. The read loop is the sole reader of the bulk-IN pipe —
|
|
30
|
+
* `getStatus()` subscribes transiently, writes the request, and the
|
|
31
|
+
* subscription receives the response (alongside any spontaneous
|
|
32
|
+
* frames; see `onStatus()`).
|
|
33
|
+
*/
|
|
24
34
|
getStatus(): Promise<BrotherQLStatus>;
|
|
35
|
+
/**
|
|
36
|
+
* Subscribe to push-based status updates. Brother QL printers emit
|
|
37
|
+
* unsolicited frames on lid open/close, media insert, errors, and
|
|
38
|
+
* end-of-job — each one fires `cb` synchronously after parsing.
|
|
39
|
+
* Returns an unsubscribe function.
|
|
40
|
+
*/
|
|
41
|
+
onStatus(cb: (status: BrotherQLStatus) => void): () => void;
|
|
42
|
+
private nextStatusFrame;
|
|
43
|
+
private startReadLoop;
|
|
44
|
+
private readLoop;
|
|
25
45
|
close(): Promise<void>;
|
|
26
46
|
}
|
|
27
47
|
export declare const DEFAULT_FILTERS: USBDeviceFilter[];
|
package/dist/printer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,eAAe,EAEf,qBAAqB,EACrB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,eAAe,EAEf,qBAAqB,EACrB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,SAAS,EACV,MAAM,gCAAgC,CAAC;AA2BxC,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,MAAM,eAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgD;IAChF,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS;IAMzD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,KAAK,CACT,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC;YAuCF,YAAY;IAU1B,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAWpF;;;;;;OAMG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAM3C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAO3D,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,aAAa;YAMP,QAAQ;IAsChB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B;AAED,eAAO,MAAM,eAAe,EAAE,eAAe,EAGmC,CAAC;AAEjF;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAI/F;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAStF"}
|
package/dist/printer.js
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
|
-
import { DEFAULT_MEDIA, DEVICES, ROTATE_DIRECTION, STATUS_REQUEST, createPreviewOffline,
|
|
1
|
+
import { DEFAULT_MEDIA, DEVICES, ROTATE_DIRECTION, STATUS_REQUEST, createPreviewOffline, encodeJobForEngine, findDevice, flipHorizontal, parseStatus, pickRotation, renderImage, renderMultiPlaneImage, } from '@thermal-label/brother-ql-core';
|
|
2
2
|
import { MediaNotSpecifiedError } from '@thermal-label/contracts';
|
|
3
|
-
import { buildUsbFilters } from '@thermal-label/transport';
|
|
4
3
|
import { WebUsbTransport } from '@thermal-label/transport/web';
|
|
4
|
+
// Detect transport errors across module boundaries — under pnpm link /
|
|
5
|
+
// multi-version installs `instanceof` checks against the contracts
|
|
6
|
+
// classes can return false even for the right class. The contracts
|
|
7
|
+
// classes pin `this.name`, so name-checking is the portable test.
|
|
8
|
+
function isTransportClosedError(err) {
|
|
9
|
+
return err instanceof Error && err.name === 'TransportClosedError';
|
|
10
|
+
}
|
|
5
11
|
const STATUS_BYTE_COUNT = 32;
|
|
12
|
+
// Brother QL printers push unsolicited 32-byte status frames on lid
|
|
13
|
+
// open/close, media insert, end of job, errors, etc. We run a
|
|
14
|
+
// persistent read loop that picks up every frame, parses it, and
|
|
15
|
+
// notifies subscribers — instant updates with no polling. `getStatus()`
|
|
16
|
+
// writes ESC iS and awaits the next frame from the same stream.
|
|
17
|
+
const STATUS_RESPONSE_TIMEOUT_MS = 1500;
|
|
18
|
+
const READ_LOOP_BACKOFF_MS = 100;
|
|
6
19
|
// Same OUT-pipe chunking as the Node driver — see packages/node/src/printer.ts
|
|
7
20
|
// for the rationale. WebUSB rides the same libusb-style bulk transfer path,
|
|
8
21
|
// so the firmware buffer-overrun risk is identical.
|
|
@@ -21,9 +34,13 @@ export class WebBrotherQLPrinter {
|
|
|
21
34
|
device;
|
|
22
35
|
transport;
|
|
23
36
|
lastStatus;
|
|
37
|
+
statusListeners = new Set();
|
|
38
|
+
readLoopStarted = false;
|
|
39
|
+
readLoopStopped = false;
|
|
24
40
|
constructor(device, transport) {
|
|
25
41
|
this.device = device;
|
|
26
42
|
this.transport = transport;
|
|
43
|
+
this.startReadLoop();
|
|
27
44
|
}
|
|
28
45
|
get model() {
|
|
29
46
|
return this.device.name;
|
|
@@ -40,6 +57,7 @@ export class WebBrotherQLPrinter {
|
|
|
40
57
|
// on the right side of the printed face when the leading edge is held
|
|
41
58
|
// up. Mirror the rendered bitmap so the input image's x-axis matches
|
|
42
59
|
// the printed x-axis. Verified on QL-820NWBc + DK-22251.
|
|
60
|
+
const pageOptions = options?.highRes === true ? { highResolution: true } : undefined;
|
|
43
61
|
let page;
|
|
44
62
|
if (resolvedMedia.palette) {
|
|
45
63
|
const { black, red } = renderMultiPlaneImage(image, {
|
|
@@ -50,13 +68,20 @@ export class WebBrotherQLPrinter {
|
|
|
50
68
|
bitmap: flipHorizontal(black),
|
|
51
69
|
redBitmap: flipHorizontal(red),
|
|
52
70
|
media: resolvedMedia,
|
|
71
|
+
...(pageOptions ? { options: pageOptions } : {}),
|
|
53
72
|
};
|
|
54
73
|
}
|
|
55
74
|
else {
|
|
56
75
|
const bitmap = flipHorizontal(renderImage(image, { dither: true, rotate }));
|
|
57
|
-
page = {
|
|
76
|
+
page = {
|
|
77
|
+
bitmap,
|
|
78
|
+
media: resolvedMedia,
|
|
79
|
+
...(pageOptions ? { options: pageOptions } : {}),
|
|
80
|
+
};
|
|
58
81
|
}
|
|
59
|
-
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- every brother-ql device has at least one engine (data invariant)
|
|
83
|
+
const engine = this.device.engines[0];
|
|
84
|
+
const bytes = encodeJobForEngine([page], {}, engine, this.device.name);
|
|
60
85
|
await this.writeChunked(bytes);
|
|
61
86
|
}
|
|
62
87
|
async writeChunked(bytes) {
|
|
@@ -80,18 +105,102 @@ export class WebBrotherQLPrinter {
|
|
|
80
105
|
assumed: true,
|
|
81
106
|
});
|
|
82
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Send ESC iS and resolve with the next status frame the printer
|
|
110
|
+
* emits. The read loop is the sole reader of the bulk-IN pipe —
|
|
111
|
+
* `getStatus()` subscribes transiently, writes the request, and the
|
|
112
|
+
* subscription receives the response (alongside any spontaneous
|
|
113
|
+
* frames; see `onStatus()`).
|
|
114
|
+
*/
|
|
83
115
|
async getStatus() {
|
|
116
|
+
const next = this.nextStatusFrame(STATUS_RESPONSE_TIMEOUT_MS);
|
|
84
117
|
await this.transport.write(STATUS_REQUEST);
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
118
|
+
return next;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Subscribe to push-based status updates. Brother QL printers emit
|
|
122
|
+
* unsolicited frames on lid open/close, media insert, errors, and
|
|
123
|
+
* end-of-job — each one fires `cb` synchronously after parsing.
|
|
124
|
+
* Returns an unsubscribe function.
|
|
125
|
+
*/
|
|
126
|
+
onStatus(cb) {
|
|
127
|
+
this.statusListeners.add(cb);
|
|
128
|
+
return () => {
|
|
129
|
+
this.statusListeners.delete(cb);
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
nextStatusFrame(timeoutMs) {
|
|
133
|
+
return new Promise((resolve, reject) => {
|
|
134
|
+
const timer = setTimeout(() => {
|
|
135
|
+
this.statusListeners.delete(handler);
|
|
136
|
+
reject(new Error(`Printer did not respond to status request within ${String(timeoutMs)}ms`));
|
|
137
|
+
}, timeoutMs);
|
|
138
|
+
const handler = (s) => {
|
|
139
|
+
clearTimeout(timer);
|
|
140
|
+
this.statusListeners.delete(handler);
|
|
141
|
+
resolve(s);
|
|
142
|
+
};
|
|
143
|
+
this.statusListeners.add(handler);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
startReadLoop() {
|
|
147
|
+
if (this.readLoopStarted)
|
|
148
|
+
return;
|
|
149
|
+
this.readLoopStarted = true;
|
|
150
|
+
void this.readLoop();
|
|
151
|
+
}
|
|
152
|
+
async readLoop() {
|
|
153
|
+
while (!this.readLoopStopped && this.transport.connected) {
|
|
154
|
+
let bytes;
|
|
155
|
+
try {
|
|
156
|
+
bytes = await this.transport.read(STATUS_BYTE_COUNT);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
if (isTransportClosedError(err))
|
|
160
|
+
return;
|
|
161
|
+
// If close() ran while the read was pending, the next iteration's
|
|
162
|
+
// while-guard exits the loop — no early return needed.
|
|
163
|
+
// Transient error — back off briefly to avoid hot-spinning.
|
|
164
|
+
// eslint-disable-next-line no-console -- driver-level diagnostic
|
|
165
|
+
console.warn('[brother-ql-web] status read error, backing off:', err);
|
|
166
|
+
await new Promise(r => setTimeout(r, READ_LOOP_BACKOFF_MS));
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (bytes.length < STATUS_BYTE_COUNT)
|
|
170
|
+
continue;
|
|
171
|
+
let status;
|
|
172
|
+
try {
|
|
173
|
+
status = parseStatus(bytes, this.device.engines[0]);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
// eslint-disable-next-line no-console -- driver-level diagnostic
|
|
177
|
+
console.warn('[brother-ql-web] failed to parse status frame:', err);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
this.lastStatus = status;
|
|
181
|
+
// Snapshot listeners so unsubscribes during dispatch don't skip siblings.
|
|
182
|
+
const snapshot = Array.from(this.statusListeners);
|
|
183
|
+
for (const cb of snapshot) {
|
|
184
|
+
try {
|
|
185
|
+
cb(status);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
// eslint-disable-next-line no-console -- driver-level diagnostic
|
|
189
|
+
console.warn('[brother-ql-web] status listener threw:', err);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
89
193
|
}
|
|
90
194
|
async close() {
|
|
195
|
+
this.readLoopStopped = true;
|
|
196
|
+
this.statusListeners.clear();
|
|
91
197
|
await this.transport.close();
|
|
92
198
|
}
|
|
93
199
|
}
|
|
94
|
-
export const DEFAULT_FILTERS =
|
|
200
|
+
export const DEFAULT_FILTERS = Object.values(DEVICES)
|
|
201
|
+
.map(d => d.transports.usb)
|
|
202
|
+
.filter((t) => t !== undefined)
|
|
203
|
+
.map(t => ({ vendorId: parseInt(t.vid, 16), productId: parseInt(t.pid, 16) }));
|
|
95
204
|
/**
|
|
96
205
|
* Show the browser's USB picker and wrap the selected device.
|
|
97
206
|
*
|
package/dist/printer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"printer.js","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"printer.js","sourceRoot":"","sources":["../src/printer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thermal-label/brother-ql-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "WebUSB browser driver for Brother QL label printers",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"brother",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"README.md"
|
|
38
38
|
],
|
|
39
39
|
"engines": {
|
|
40
|
-
"node": ">=
|
|
40
|
+
"node": ">=20.9.0"
|
|
41
41
|
},
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|
|
@@ -52,15 +52,15 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@thermal-label/contracts": "^0.
|
|
56
|
-
"@thermal-label/transport": "^0.
|
|
57
|
-
"@thermal-label/brother-ql-core": "0.
|
|
55
|
+
"@thermal-label/contracts": "^0.5.0",
|
|
56
|
+
"@thermal-label/transport": "^0.5.0",
|
|
57
|
+
"@thermal-label/brother-ql-core": "0.5.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"typescript": ">=5.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@mbtech-nl/tsconfig": "^1.
|
|
63
|
+
"@mbtech-nl/tsconfig": "^1.1.0",
|
|
64
64
|
"@types/w3c-web-usb": "^1.0.0",
|
|
65
65
|
"@vitest/coverage-v8": "^2.1.9",
|
|
66
66
|
"jsdom": "^26.1.0",
|