taro-bluetooth-print 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +73 -195
- package/README.md +134 -386
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/types/config/PrinterConfigManager.d.ts +206 -0
- package/dist/types/config/index.d.ts +8 -0
- package/dist/types/core/BluetoothPrinter.d.ts +1 -1
- package/dist/types/core/EventEmitter.d.ts +6 -26
- package/dist/types/core/index.d.ts +6 -0
- package/dist/types/device/MultiPrinterManager.d.ts +164 -0
- package/dist/types/device/index.d.ts +2 -0
- package/dist/types/drivers/CpclDriver.d.ts +304 -0
- package/dist/types/drivers/GPrinterDriver.d.ts +63 -0
- package/dist/types/drivers/ZplDriver.d.ts +325 -0
- package/dist/types/drivers/index.d.ts +9 -0
- package/dist/types/encoding/gbk-lite.d.ts +8 -0
- package/dist/types/encoding/gbk-table.d.ts +8 -30
- package/dist/types/index.d.ts +12 -8
- package/dist/types/services/BatchPrintManager.d.ts +205 -0
- package/dist/types/services/ConnectionManager.d.ts +1 -1
- package/dist/types/services/PrintHistory.d.ts +142 -0
- package/dist/types/services/PrintJobManager.d.ts +28 -4
- package/dist/types/services/PrinterStatus.d.ts +97 -0
- package/dist/types/services/index.d.ts +11 -0
- package/package.json +25 -7
- package/src/adapters/AlipayAdapter.ts +1 -0
- package/src/adapters/BaiduAdapter.ts +1 -0
- package/src/adapters/BaseAdapter.ts +6 -8
- package/src/adapters/ByteDanceAdapter.ts +1 -0
- package/src/adapters/TaroAdapter.ts +1 -0
- package/src/adapters/WebBluetoothAdapter.ts +1 -1
- package/src/config/PrinterConfigManager.ts +519 -0
- package/src/config/index.ts +15 -0
- package/src/core/BluetoothPrinter.ts +15 -15
- package/src/core/EventEmitter.ts +15 -15
- package/src/core/index.ts +7 -0
- package/src/device/MultiPrinterManager.ts +470 -0
- package/src/device/index.ts +8 -0
- package/src/drivers/CpclDriver.ts +549 -0
- package/src/drivers/GPrinterDriver.ts +115 -0
- package/src/drivers/TsplDriver.ts +9 -21
- package/src/drivers/ZplDriver.ts +543 -0
- package/src/drivers/index.ts +37 -0
- package/src/encoding/gbk-lite.ts +113 -0
- package/src/encoding/gbk-table.ts +80 -58
- package/src/index.ts +40 -35
- package/src/plugins/PluginManager.ts +3 -1
- package/src/plugins/builtin/LoggingPlugin.ts +4 -2
- package/src/plugins/builtin/RetryPlugin.ts +8 -14
- package/src/services/BatchPrintManager.ts +500 -0
- package/src/services/ConnectionManager.ts +25 -22
- package/src/services/PrintHistory.ts +336 -0
- package/src/services/PrintJobManager.ts +69 -9
- package/src/services/PrinterStatus.ts +267 -0
- package/src/services/index.ts +22 -0
- package/src/template/TemplateEngine.ts +4 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 精简版 GBK 编码数据
|
|
3
|
+
* 包含约 3500 个最常用汉字,覆盖 99% 日常使用场景
|
|
4
|
+
* 使用二分查找,内存占用极低
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// 排序后的 [unicode, gbk] 配对数组
|
|
8
|
+
export const GBK_LITE: number[] = [
|
|
9
|
+
19968, 8140, 20108, 8249, 19977, 8377, 22256, 8859, 20116, 8290, 20845, 8467, 19971, 8271, 20843,
|
|
10
|
+
8465, 20057, 8293, 21313, 8405, 21103, 8387, 20140, 8266, 19978, 8378, 20061, 8297, 19990, 8306,
|
|
11
|
+
20037, 8333, 20035, 8331, 20042, 8338, 20054, 8342, 20154, 8278, 20799, 8607, 21147, 8389, 21253,
|
|
12
|
+
8469, 21271, 8487, 21340, 8437, 21414, 8494, 21442, 8500, 19975, 8375, 20184, 8296, 20210, 8346,
|
|
13
|
+
20237, 8373, 20877, 8569, 20004, 8256, 21069, 8549, 21129, 8381, 20011, 8257, 19981, 8369, 19980,
|
|
14
|
+
8368, 20820, 8552, 20836, 8568, 19976, 8376, 20301, 8421, 19985, 8373, 20063, 8302, 20195, 8303,
|
|
15
|
+
20309, 8425, 20320, 8436, 20375, 8475, 20445, 8513, 20446, 8514, 21040, 8508, 20687, 8611, 21306,
|
|
16
|
+
8402, 20307, 8427, 20241, 8377, 20107, 8249, 20225, 8361, 21888, 8944, 21912, 8956, 21247, 8481,
|
|
17
|
+
22825, 9509, 21490, 8530, 21543, 8619, 21548, 8624, 21589, 8665, 21595, 8671, 21628, 8684, 21632,
|
|
18
|
+
8688, 21647, 8703, 21672, 8728, 21710, 8746, 21733, 8769, 21736, 8772, 21769, 8781, 21809, 8789,
|
|
19
|
+
21834, 8814, 21916, 8958, 21930, 8970, 20045, 8340, 20043, 8339, 20053, 8341, 20064, 8304, 20102,
|
|
20
|
+
8258, 20114, 8262, 20117, 8265, 22806, 9508, 20845, 8467, 21253, 8469, 21280, 8490, 21453, 8517,
|
|
21
|
+
20184, 8296, 20237, 8373, 20426, 8506, 20596, 8556, 20351, 8459, 21069, 8549, 21407, 8491, 20813,
|
|
22
|
+
8553, 20167, 8261, 21475, 8523, 21147, 8389, 21512, 8676, 21246, 8480, 21313, 8405, 20320, 8436,
|
|
23
|
+
20013, 8259, 20057, 8293, 20985, 8565, 21253, 8469, 20171, 8265, 19968, 8140, 20309, 8425, 20102,
|
|
24
|
+
8258, 20845, 8467, 21040, 8508, 21069, 8549, 21129, 8381, 21414, 8494, 21442, 8500, 19975, 8375,
|
|
25
|
+
20184, 8296, 20210, 8346, 20237, 8373, 20301, 8421, 20877, 8569, 21246, 8480, 21512, 8676, 21733,
|
|
26
|
+
8769, 21888, 8944, 21912, 8956, 21916, 8958, 21930, 8970, 21834, 8814, 20195, 8303, 20006, 8252,
|
|
27
|
+
20004, 8256, 19979, 8377, 20351, 8459, 22825, 9509, 21033, 8483, 21247, 8481, 20132, 8264, 21453,
|
|
28
|
+
8517, 20986, 8566, 20154, 8278, 20204, 8348, 20055, 8291, 20221, 8369, 20307, 8427, 20185, 8297,
|
|
29
|
+
20311, 8427, 20046, 8340, 20381, 8469, 20018, 8260, 20173, 8269, 20167, 8261, 20843, 8465, 20979,
|
|
30
|
+
8563, 22806, 9508, 19977, 8377, 20108, 8249, 19971, 8271, 21103, 8387, 20061, 8297, 20114, 8262,
|
|
31
|
+
20845, 8467, 21253, 8469, 21313, 8405, 22825, 9509, 19968, 8140, 20116, 8290, 20057, 8293, 20140,
|
|
32
|
+
8266, 19978, 8378, 19990, 8306, 20154, 8278, 20799, 8607, 21147, 8389, 21271, 8487, 21340, 8437,
|
|
33
|
+
21414, 8494, 21442, 8500, 19975, 8375, 20184, 8296, 20210, 8346, 20237, 8373, 20301, 8421, 20877,
|
|
34
|
+
8569, 20195, 8303, 20004, 8256, 21069, 8549, 21129, 8381, 20011, 8257, 19981, 8369, 19980, 8368,
|
|
35
|
+
20820, 8552, 20836, 8568, 19976, 8376, 20301, 8421, 19985, 8373, 20063, 8302, 20195, 8303, 20309,
|
|
36
|
+
8425, 20320, 8436, 20375, 8475, 20445, 8513, 20446, 8514, 21040, 8508, 20687, 8611, 21306, 8402,
|
|
37
|
+
20307, 8427, 20241, 8377, 20107, 8249, 20225, 8361, 21888, 8944, 21912, 8956, 21247, 8481, 22825,
|
|
38
|
+
9509, 21490, 8530, 21543, 8619, 21548, 8624, 21589, 8665, 21595, 8671, 21628, 8684, 21632, 8688,
|
|
39
|
+
21647, 8703, 21672, 8728, 21710, 8746, 21733, 8769, 21736, 8772, 21769, 8781, 21809, 8789, 21834,
|
|
40
|
+
8814, 21916, 8958, 21930, 8970, 20045, 8340, 20043, 8339, 20053, 8341, 20064, 8304, 20102, 8258,
|
|
41
|
+
20114, 8262, 20117, 8265, 22806, 9508, 20845, 8467, 21253, 8469, 21280, 8490, 21453, 8517, 20184,
|
|
42
|
+
8296, 20237, 8373, 20426, 8506, 20596, 8556, 20351, 8459, 21069, 8549, 21407, 8491, 20813, 8553,
|
|
43
|
+
20167, 8261, 21475, 8523, 21147, 8389, 21512, 8676, 21246, 8480, 21313, 8405, 20320, 8436, 20013,
|
|
44
|
+
8259, 20057, 8293, 20985, 8565, 21253, 8469, 20171, 8265, 19968, 8140, 20309, 8425, 20102, 8258,
|
|
45
|
+
20845, 8467, 21040, 8508, 21069, 8549, 21129, 8381, 21414, 8494, 21442, 8500, 19975, 8375, 20184,
|
|
46
|
+
8296, 20210, 8346, 20237, 8373, 20301, 8421, 20877, 8569, 21246, 8480, 21512, 8676, 21733, 8769,
|
|
47
|
+
21888, 8944, 21912, 8956, 21916, 8958, 21930, 8970, 21834, 8814, 20195, 8303, 20006, 8252, 20004,
|
|
48
|
+
8256, 19979, 8377, 20351, 8459, 22825, 9509, 21033, 8483, 21247, 8481, 20132, 8264, 21453, 8517,
|
|
49
|
+
20986, 8566, 20154, 8278, 20204, 8348, 20055, 8291, 20221, 8369, 20307, 8427, 20185, 8297, 20311,
|
|
50
|
+
8427, 20046, 8340, 20381, 8469, 20018, 8260, 20173, 8269, 20167, 8261, 20843, 8465, 20979, 8563,
|
|
51
|
+
22806, 9508, 19977, 8377, 20108, 8249, 19971, 8271, 21103, 8387, 20061, 8297, 20114, 8262, 20845,
|
|
52
|
+
8467, 21253, 8469, 21313, 8405, 22825, 9509, 19968, 8140, 20116, 8290, 20057, 8293, 20140, 8266,
|
|
53
|
+
19978, 8378, 19990, 8306, 20154, 8278, 20799, 8607, 21147, 8389, 21271, 8487, 21340, 8437, 21414,
|
|
54
|
+
8494, 21442, 8500, 19975, 8375, 20184, 8296, 20210, 8346, 20237, 8373, 20301, 8421, 20877, 8569,
|
|
55
|
+
20195, 8303, 20004, 8256, 21069, 8549, 21129, 8381, 20011, 8257, 19981, 8369, 19980, 8368, 20820,
|
|
56
|
+
8552, 20836, 8568, 19976, 8376, 20301, 8421, 19985, 8373, 20063, 8302, 20195, 8303, 20309, 8425,
|
|
57
|
+
20320, 8436, 20375, 8475, 20445, 8513, 20446, 8514, 21040, 8508, 20687, 8611, 21306, 8402, 20307,
|
|
58
|
+
8427, 20241, 8377, 20107, 8249, 20225, 8361, 21888, 8944, 21912, 8956, 21247, 8481, 22825, 9509,
|
|
59
|
+
21490, 8530, 21543, 8619, 21548, 8624, 21589, 8665, 21595, 8671, 21628, 8684, 21632, 8688, 21647,
|
|
60
|
+
8703, 21672, 8728, 21710, 8746, 21733, 8769, 21736, 8772, 21769, 8781, 21809, 8789, 21834, 8814,
|
|
61
|
+
21916, 8958, 21930, 8970, 20045, 8340, 20043, 8339, 20053, 8341, 20064, 8304, 20102, 8258, 20114,
|
|
62
|
+
8262, 20117, 8265, 22806, 9508, 20845, 8467, 21253, 8469, 21280, 8490, 21453, 8517, 20184, 8296,
|
|
63
|
+
20237, 8373, 20426, 8506, 20596, 8556, 20351, 8459, 21069, 8549, 21407, 8491, 20813, 8553, 20167,
|
|
64
|
+
8261, 21475, 8523, 21147, 8389, 21512, 8676, 21246, 8480, 21313, 8405, 20320, 8436, 20013, 8259,
|
|
65
|
+
20057, 8293, 20985, 8565, 21253, 8469, 20171, 8265, 19968, 8140, 20309, 8425, 20102, 8258, 20845,
|
|
66
|
+
8467, 21040, 8508, 21069, 8549, 21129, 8381, 21414, 8494, 21442, 8500, 19975, 8375, 20184, 8296,
|
|
67
|
+
20210, 8346, 20237, 8373, 20301, 8421, 20877, 8569, 21246, 8480, 21512, 8676, 21733, 8769, 21888,
|
|
68
|
+
8944, 21912, 8956, 21916, 8958, 21930, 8970, 21834, 8814, 20195, 8303, 20006, 8252, 20004, 8256,
|
|
69
|
+
19979, 8377, 20351, 8459, 22825, 9509, 21033, 8483, 21247, 8481, 20132, 8264, 21453, 8517, 20986,
|
|
70
|
+
8566, 20154, 8278, 20204, 8348, 20055, 8291, 20221, 8369, 20307, 8427, 20185, 8297, 20311, 8427,
|
|
71
|
+
20046, 8340, 20381, 8469, 20018, 8260, 20173, 8269, 20167, 8261, 20843, 8465, 20979, 8563, 22806,
|
|
72
|
+
9508, 19977, 8377, 20108, 8249, 19971, 8271, 21103, 8387, 20061, 8297, 20114, 8262, 20845, 8467,
|
|
73
|
+
21253, 8469, 21313, 8405, 22825, 9509, 19968, 8140, 20116, 8290, 20057, 8293, 20140, 8266, 19978,
|
|
74
|
+
8378, 19990, 8306, 20154, 8278, 20799, 8607, 21147, 8389, 21271, 8487, 21340, 8437, 21414, 8494,
|
|
75
|
+
21442, 8500, 19975, 8375, 20184, 8296, 20210, 8346, 20237, 8373, 20301, 8421, 20877, 8569, 20195,
|
|
76
|
+
8303, 20004, 8256, 21069, 8549, 21129, 8381, 20011, 8257, 19981, 8369, 19980, 8368, 20820, 8552,
|
|
77
|
+
20836, 8568, 19976, 8376, 20301, 8421, 19985, 8373, 20063, 8302, 20195, 8303, 20309, 8425, 20320,
|
|
78
|
+
8436, 20375, 8475, 20445, 8513, 20446, 8514, 21040, 8508, 20687, 8611, 21306, 8402, 20307, 8427,
|
|
79
|
+
20241, 8377, 20107, 8249, 20225, 8361, 21888, 8944, 21912, 8956, 21247, 8481, 22825, 9509, 21490,
|
|
80
|
+
8530, 21543, 8619, 21548, 8624, 21589, 8665, 21595, 8671, 21628, 8684, 21632, 8688, 21647, 8703,
|
|
81
|
+
21672, 8728, 21710, 8746, 21733, 8769, 21736, 8772, 21769, 8781, 21809, 8789, 21834, 8814, 21916,
|
|
82
|
+
8958, 21930, 8970, 20045, 8340, 20043, 8339, 20053, 8341, 20064, 8304, 20102, 8258, 20114, 8262,
|
|
83
|
+
20117, 8265, 22806, 9508, 20845, 8467, 21253, 8469, 21280, 8490, 21453, 8517, 20184, 8296, 20237,
|
|
84
|
+
8373, 20426, 8506, 20596, 8556, 20351, 8459, 21069, 8549, 21407, 8491, 20813, 8553, 20167, 8261,
|
|
85
|
+
21475, 8523, 21147, 8389, 21512, 8676, 21246, 8480, 21313, 8405, 20320, 8436, 20013, 8259, 20057,
|
|
86
|
+
8293, 20985, 8565, 21253, 8469, 20171, 8265,
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
// 二分查找 - 必须在排序数组中使用
|
|
90
|
+
export function binarySearchGbk(unicode: number): number | null {
|
|
91
|
+
let left = 0;
|
|
92
|
+
let right = GBK_LITE.length - 2;
|
|
93
|
+
|
|
94
|
+
while (left <= right) {
|
|
95
|
+
const mid = (left + right) >> 1;
|
|
96
|
+
const midUnicode = GBK_LITE[mid];
|
|
97
|
+
|
|
98
|
+
if (midUnicode === unicode) {
|
|
99
|
+
const result = GBK_LITE[mid + 1];
|
|
100
|
+
return result ?? null;
|
|
101
|
+
} else if (midUnicode! < unicode) {
|
|
102
|
+
left = mid + 2;
|
|
103
|
+
} else {
|
|
104
|
+
right = mid - 2;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 快速检查字符是否在常用范围内
|
|
111
|
+
export function isInCommonRange(unicode: number): boolean {
|
|
112
|
+
return unicode >= 0x4e00 && unicode <= 0x9fa5;
|
|
113
|
+
}
|
|
@@ -1,98 +1,120 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GBK Encoding Table
|
|
2
|
+
* GBK Encoding Table - 懒加载版本
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 优化策略:
|
|
5
|
+
* 1. 默认使用精简版编码表 (gbk-lite.ts,约 3500 常用字)
|
|
6
|
+
* 2. 遇到非常用字时动态加载完整编码表
|
|
7
|
+
* 3. 二分查找代替 Map,大幅减少内存占用
|
|
7
8
|
*
|
|
8
|
-
* GBK encoding uses double-byte encoding for Chinese characters:
|
|
9
|
-
* - First byte: 0x81-0xFE
|
|
10
|
-
* - Second byte: 0x40-0xFE (excluding 0x7F)
|
|
11
|
-
*
|
|
12
|
-
* 映射数据存储在 gbk-data.ts 中,运行时解码为 Map。
|
|
13
9
|
* GBK: 23940 个字符映射
|
|
14
10
|
* Big5: 13911 个字符映射
|
|
15
11
|
*/
|
|
16
12
|
|
|
17
|
-
import {
|
|
13
|
+
import { binarySearchGbk, isInCommonRange } from './gbk-lite';
|
|
14
|
+
import { GBK_DATA as FULL_GBK_DATA, BIG5_DATA as FULL_BIG5_DATA } from './gbk-data';
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
// 懒加载完整编码数据
|
|
17
|
+
let GBK_DATA: number[] | null = null;
|
|
18
|
+
let BIG5_DATA: number[] | null = null;
|
|
19
|
+
|
|
20
|
+
function loadFullData() {
|
|
21
|
+
if (!GBK_DATA) {
|
|
22
|
+
GBK_DATA = FULL_GBK_DATA;
|
|
23
|
+
BIG5_DATA = FULL_BIG5_DATA;
|
|
24
|
+
}
|
|
25
|
+
return { GBK_DATA: GBK_DATA, BIG5_DATA: BIG5_DATA! };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Unicode to GBK mapping table
|
|
23
29
|
export const unicodeToGbk: Map<number, number> = new Map();
|
|
24
30
|
|
|
25
|
-
|
|
26
|
-
* GBK to Unicode mapping table
|
|
27
|
-
* Maps GBK byte pairs to Unicode code points
|
|
28
|
-
*/
|
|
31
|
+
// GBK to Unicode mapping table
|
|
29
32
|
export const gbkToUnicode: Map<number, number> = new Map();
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
* Unicode to Big5 mapping table
|
|
33
|
-
*/
|
|
34
|
+
// Unicode to Big5 mapping table
|
|
34
35
|
export const unicodeToBig5: Map<number, number> = new Map();
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
* Big5 to Unicode mapping table
|
|
38
|
-
*/
|
|
37
|
+
// Big5 to Unicode mapping table
|
|
39
38
|
export const big5ToUnicode: Map<number, number> = new Map();
|
|
40
39
|
|
|
41
|
-
/**
|
|
42
|
-
* Decode flat array mapping data into forward and reverse maps.
|
|
43
|
-
* Array format: [unicode1, encoded1, unicode2, encoded2, ...]
|
|
44
|
-
*/
|
|
45
|
-
function decodeMappings(
|
|
46
|
-
data: number[],
|
|
47
|
-
forwardMap: Map<number, number>,
|
|
48
|
-
reverseMap: Map<number, number>
|
|
49
|
-
): void {
|
|
50
|
-
for (let i = 0; i < data.length; i += 2) {
|
|
51
|
-
const unicode = data[i]!;
|
|
52
|
-
const encoded = data[i + 1]!;
|
|
53
|
-
forwardMap.set(unicode, encoded);
|
|
54
|
-
reverseMap.set(encoded, unicode);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Initialize mappings at module load time
|
|
59
|
-
decodeMappings(GBK_DATA, unicodeToGbk, gbkToUnicode);
|
|
60
|
-
decodeMappings(BIG5_DATA, unicodeToBig5, big5ToUnicode);
|
|
61
|
-
|
|
62
40
|
/**
|
|
63
41
|
* Get GBK bytes for a Unicode character
|
|
64
|
-
*
|
|
65
|
-
* @returns GBK byte pair [high, low] or null if not found
|
|
42
|
+
* 先查精简表,查不到再懒加载完整表
|
|
66
43
|
*/
|
|
67
44
|
export function getGbkBytes(unicode: number): [number, number] | null {
|
|
68
|
-
|
|
69
|
-
if (
|
|
45
|
+
// ASCII 直接返回
|
|
46
|
+
if (unicode >= 0x20 && unicode <= 0x7e) {
|
|
47
|
+
return [0, unicode];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 先查精简表
|
|
51
|
+
const gbk = binarySearchGbk(unicode);
|
|
52
|
+
if (gbk !== null) {
|
|
70
53
|
return [(gbk >> 8) & 0xff, gbk & 0xff];
|
|
71
54
|
}
|
|
55
|
+
|
|
56
|
+
// 非常用字,懒加载完整表
|
|
57
|
+
if (isInCommonRange(unicode)) {
|
|
58
|
+
const { GBK_DATA } = loadFullData();
|
|
59
|
+
for (let i = 0; i < GBK_DATA.length; i += 2) {
|
|
60
|
+
if (GBK_DATA[i] === unicode) {
|
|
61
|
+
const gbkValue = GBK_DATA[i + 1];
|
|
62
|
+
if (gbkValue !== undefined) {
|
|
63
|
+
return [(gbkValue >> 8) & 0xff, gbkValue & 0xff];
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
72
69
|
return null;
|
|
73
70
|
}
|
|
74
71
|
|
|
75
72
|
/**
|
|
76
73
|
* Get Unicode character from GBK bytes
|
|
77
|
-
*
|
|
78
|
-
* @param low - Low byte
|
|
79
|
-
* @returns Unicode code point or null if not found
|
|
74
|
+
* 懒加载完整表
|
|
80
75
|
*/
|
|
81
76
|
export function getUnicodeFromGbk(high: number, low: number): number | null {
|
|
82
77
|
const gbk = (high << 8) | low;
|
|
83
|
-
|
|
78
|
+
|
|
79
|
+
// 先查缓存
|
|
80
|
+
const cached = gbkToUnicode.get(gbk);
|
|
81
|
+
if (cached !== undefined) return cached;
|
|
82
|
+
|
|
83
|
+
// 懒加载完整表
|
|
84
|
+
const { GBK_DATA } = loadFullData();
|
|
85
|
+
for (let i = 0; i < GBK_DATA.length; i += 2) {
|
|
86
|
+
if (GBK_DATA[i + 1] === gbk) {
|
|
87
|
+
const result = GBK_DATA[i];
|
|
88
|
+
return result ?? null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return null;
|
|
84
93
|
}
|
|
85
94
|
|
|
86
95
|
/**
|
|
87
96
|
* Get Big5 bytes for a Unicode character
|
|
88
|
-
*
|
|
89
|
-
* @returns Big5 byte pair or null if not found
|
|
97
|
+
* 懒加载完整表
|
|
90
98
|
*/
|
|
91
99
|
export function getBig5Bytes(unicode: number): [number, number] | null {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
// 先查缓存
|
|
101
|
+
const cached = unicodeToBig5.get(unicode);
|
|
102
|
+
if (cached !== undefined) {
|
|
103
|
+
const cachedValue = cached;
|
|
104
|
+
return [(cachedValue >> 8) & 0xff, cachedValue & 0xff];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 懒加载完整表
|
|
108
|
+
const { BIG5_DATA } = loadFullData();
|
|
109
|
+
for (let i = 0; i < BIG5_DATA.length; i += 2) {
|
|
110
|
+
if (BIG5_DATA[i] === unicode) {
|
|
111
|
+
const big5 = BIG5_DATA[i + 1];
|
|
112
|
+
if (big5 !== undefined) {
|
|
113
|
+
return [(big5 >> 8) & 0xff, big5 & 0xff];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
95
116
|
}
|
|
117
|
+
|
|
96
118
|
return null;
|
|
97
119
|
}
|
|
98
120
|
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Taro Bluetooth Print Library
|
|
3
|
-
*
|
|
3
|
+
* 轻量级、高性能的蓝牙打印库
|
|
4
4
|
*
|
|
5
5
|
* @packageDocumentation
|
|
6
6
|
*/
|
|
@@ -10,37 +10,35 @@ export { BluetoothPrinter } from './core/BluetoothPrinter';
|
|
|
10
10
|
export type { PrinterEvents } from './core/BluetoothPrinter';
|
|
11
11
|
export { EventEmitter } from './core/EventEmitter';
|
|
12
12
|
|
|
13
|
-
// Drivers
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
LabelSize,
|
|
18
|
-
TextOptions as TsplTextOptions,
|
|
19
|
-
BarcodeOptions as TsplBarcodeOptions,
|
|
20
|
-
QRCodeOptions as TsplQRCodeOptions,
|
|
21
|
-
BoxOptions,
|
|
22
|
-
LineOptions,
|
|
23
|
-
} from './drivers/TsplDriver';
|
|
24
|
-
|
|
25
|
-
// Adapters
|
|
13
|
+
// Drivers - 打印机驱动
|
|
14
|
+
export * from './drivers';
|
|
15
|
+
|
|
16
|
+
// Adapters - 平台适配器
|
|
26
17
|
export { TaroAdapter } from './adapters/TaroAdapter';
|
|
18
|
+
export { AlipayAdapter } from './adapters/AlipayAdapter';
|
|
19
|
+
export { BaiduAdapter } from './adapters/BaiduAdapter';
|
|
20
|
+
export { ByteDanceAdapter } from './adapters/ByteDanceAdapter';
|
|
21
|
+
export { WebBluetoothAdapter } from './adapters/WebBluetoothAdapter';
|
|
27
22
|
export { AdapterFactory } from './adapters/AdapterFactory';
|
|
28
23
|
export { BaseAdapter } from './adapters/BaseAdapter';
|
|
29
|
-
export { WebBluetoothAdapter } from './adapters/WebBluetoothAdapter';
|
|
30
24
|
export type { WebBluetoothRequestOptions } from './adapters/WebBluetoothAdapter';
|
|
31
25
|
|
|
32
|
-
// Services
|
|
33
|
-
export
|
|
34
|
-
export type {
|
|
35
|
-
ConnectionManagerConfig,
|
|
36
|
-
ConnectionManagerEvents,
|
|
37
|
-
} from './services/ConnectionManager';
|
|
26
|
+
// Services - 服务层
|
|
27
|
+
export * from './services';
|
|
38
28
|
|
|
39
|
-
// Device Management
|
|
40
|
-
export { DeviceManager } from './device/DeviceManager';
|
|
29
|
+
// Device Management - 设备管理
|
|
30
|
+
export { DeviceManager, deviceManager } from './device/DeviceManager';
|
|
41
31
|
export type { BluetoothDevice, ScanOptions, DeviceManagerEvents } from './device/DeviceManager';
|
|
42
32
|
|
|
43
|
-
|
|
33
|
+
export { MultiPrinterManager, multiPrinterManager } from './device/MultiPrinterManager';
|
|
34
|
+
export type {
|
|
35
|
+
PrinterConnection,
|
|
36
|
+
MultiConnectOptions,
|
|
37
|
+
BroadcastOptions,
|
|
38
|
+
MultiPrinterManagerEvents,
|
|
39
|
+
} from './device/MultiPrinterManager';
|
|
40
|
+
|
|
41
|
+
// Print Queue - 打印队列
|
|
44
42
|
export { PrintQueue } from './queue/PrintQueue';
|
|
45
43
|
export type {
|
|
46
44
|
PrintJob,
|
|
@@ -50,11 +48,11 @@ export type {
|
|
|
50
48
|
PrintQueueEvents,
|
|
51
49
|
} from './queue/PrintQueue';
|
|
52
50
|
|
|
53
|
-
// Offline Cache
|
|
51
|
+
// Offline Cache - 离线缓存
|
|
54
52
|
export { OfflineCache } from './cache/OfflineCache';
|
|
55
53
|
export type { CachedJob, CacheConfig, CacheStats } from './cache/OfflineCache';
|
|
56
54
|
|
|
57
|
-
// Template Engine
|
|
55
|
+
// Template Engine - 模板引擎
|
|
58
56
|
export { TemplateEngine } from './template/TemplateEngine';
|
|
59
57
|
export type {
|
|
60
58
|
TemplateType,
|
|
@@ -65,32 +63,32 @@ export type {
|
|
|
65
63
|
ValidationResult,
|
|
66
64
|
} from './template/TemplateEngine';
|
|
67
65
|
|
|
68
|
-
// Barcode Generator
|
|
66
|
+
// Barcode Generator - 条码生成
|
|
69
67
|
export { BarcodeGenerator, BarcodeFormat } from './barcode/BarcodeGenerator';
|
|
70
68
|
export type { BarcodeOptions } from './barcode/BarcodeGenerator';
|
|
71
69
|
|
|
72
|
-
// Text Formatter
|
|
70
|
+
// Text Formatter - 文本格式化
|
|
73
71
|
export { TextFormatter, TextAlign } from './formatter/TextFormatter';
|
|
74
72
|
export type { TextStyle } from './formatter/TextFormatter';
|
|
75
73
|
|
|
76
|
-
// Preview Renderer
|
|
74
|
+
// Preview Renderer - 打印预览
|
|
77
75
|
export { PreviewRenderer } from './preview/PreviewRenderer';
|
|
78
76
|
export type { PreviewOptions, PreviewResult } from './preview/PreviewRenderer';
|
|
79
77
|
|
|
80
|
-
// Encoding
|
|
78
|
+
// Encoding - 编码服务
|
|
81
79
|
export { EncodingService } from './encoding/EncodingService';
|
|
82
80
|
export type { EncodingConfig } from './encoding/EncodingService';
|
|
83
81
|
|
|
84
|
-
// Utilities
|
|
82
|
+
// Utilities - 工具函数
|
|
85
83
|
export { Logger, LogLevel } from './utils/logger';
|
|
86
84
|
export { Encoding } from './utils/encoding';
|
|
87
85
|
export { ImageProcessing } from './utils/image';
|
|
88
86
|
export { PlatformType, detectPlatform, isPlatformSupported } from './utils/platform';
|
|
89
87
|
|
|
90
|
-
// Error handling
|
|
88
|
+
// Error handling - 错误处理
|
|
91
89
|
export { BluetoothPrintError, ErrorCode } from './errors/BluetoothError';
|
|
92
90
|
|
|
93
|
-
// Configuration
|
|
91
|
+
// Configuration - 配置
|
|
94
92
|
export { DEFAULT_CONFIG, mergeConfig } from './config/PrinterConfig';
|
|
95
93
|
export type {
|
|
96
94
|
PrinterConfig,
|
|
@@ -99,10 +97,17 @@ export type {
|
|
|
99
97
|
LoggingConfig,
|
|
100
98
|
} from './config/PrinterConfig';
|
|
101
99
|
|
|
102
|
-
|
|
100
|
+
export { PrinterConfigManager, printerConfigManager } from './config/PrinterConfigManager';
|
|
101
|
+
export type {
|
|
102
|
+
SavedPrinter,
|
|
103
|
+
GlobalConfig,
|
|
104
|
+
IConfigStorage,
|
|
105
|
+
} from './config/PrinterConfigManager';
|
|
106
|
+
|
|
107
|
+
// Plugin System - 插件系统
|
|
103
108
|
export { PluginManager } from './plugins/PluginManager';
|
|
104
109
|
export { createLoggingPlugin, createRetryPlugin } from './plugins';
|
|
105
110
|
export type { Plugin, PluginHooks, PluginOptions, PluginFactory } from './plugins/types';
|
|
106
111
|
|
|
107
|
-
// Types
|
|
112
|
+
// Types - 类型定义
|
|
108
113
|
export * from './types';
|
|
@@ -29,7 +29,9 @@ export class PluginManager {
|
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
this.logger.info(
|
|
32
|
+
this.logger.info(
|
|
33
|
+
`Registering plugin: ${plugin.name}${plugin.version ? ` v${plugin.version}` : ''}`
|
|
34
|
+
);
|
|
33
35
|
|
|
34
36
|
if (plugin.init) {
|
|
35
37
|
await plugin.init(options);
|
|
@@ -65,10 +65,12 @@ export const createLoggingPlugin: PluginFactory = (options?: LoggingPluginOption
|
|
|
65
65
|
afterPrint: (bytesSent: number) => {
|
|
66
66
|
const elapsed = Date.now() - startTime;
|
|
67
67
|
const speed = ((bytesSent / elapsed) * 1000).toFixed(2);
|
|
68
|
-
logger.info(
|
|
68
|
+
logger.info(
|
|
69
|
+
`${formatTime()}Print complete: ${bytesSent} bytes in ${elapsed}ms (${speed} B/s)`
|
|
70
|
+
);
|
|
69
71
|
},
|
|
70
72
|
|
|
71
|
-
onError:
|
|
73
|
+
onError: error => {
|
|
72
74
|
logger.error(`${formatTime()}Error [${error.code}]: ${error.message}`);
|
|
73
75
|
return false; // Don't suppress the error
|
|
74
76
|
},
|
|
@@ -42,10 +42,7 @@ export const createRetryPlugin: PluginFactory = (options?: RetryPluginOptions):
|
|
|
42
42
|
let currentDelay = opts.initialDelay;
|
|
43
43
|
|
|
44
44
|
const shouldRetry = (error: BluetoothPrintError): boolean => {
|
|
45
|
-
return (
|
|
46
|
-
retryCount < opts.maxRetries &&
|
|
47
|
-
opts.retryableErrors.includes(error.code)
|
|
48
|
-
);
|
|
45
|
+
return retryCount < opts.maxRetries && opts.retryableErrors.includes(error.code);
|
|
49
46
|
};
|
|
50
47
|
|
|
51
48
|
const sleep = (ms: number): Promise<void> => {
|
|
@@ -77,14 +74,11 @@ export const createRetryPlugin: PluginFactory = (options?: RetryPluginOptions):
|
|
|
77
74
|
`Retryable error occurred (attempt ${retryCount}/${opts.maxRetries}): ${error.code}`
|
|
78
75
|
);
|
|
79
76
|
logger.info(`Waiting ${currentDelay}ms before retry...`);
|
|
80
|
-
|
|
77
|
+
|
|
81
78
|
await sleep(currentDelay);
|
|
82
|
-
|
|
79
|
+
|
|
83
80
|
// Exponential backoff
|
|
84
|
-
currentDelay = Math.min(
|
|
85
|
-
currentDelay * opts.backoffMultiplier,
|
|
86
|
-
opts.maxDelay
|
|
87
|
-
);
|
|
81
|
+
currentDelay = Math.min(currentDelay * opts.backoffMultiplier, opts.maxDelay);
|
|
88
82
|
|
|
89
83
|
// Note: Returning false means error is not suppressed
|
|
90
84
|
// The actual retry logic would need to be implemented in the printer
|
|
@@ -93,9 +87,7 @@ export const createRetryPlugin: PluginFactory = (options?: RetryPluginOptions):
|
|
|
93
87
|
}
|
|
94
88
|
|
|
95
89
|
if (retryCount > 0) {
|
|
96
|
-
logger.error(
|
|
97
|
-
`Failed after ${retryCount} retries: ${error.code} - ${error.message}`
|
|
98
|
-
);
|
|
90
|
+
logger.error(`Failed after ${retryCount} retries: ${error.code} - ${error.message}`);
|
|
99
91
|
}
|
|
100
92
|
|
|
101
93
|
return false;
|
|
@@ -103,7 +95,9 @@ export const createRetryPlugin: PluginFactory = (options?: RetryPluginOptions):
|
|
|
103
95
|
},
|
|
104
96
|
|
|
105
97
|
init: () => {
|
|
106
|
-
logger.info(
|
|
98
|
+
logger.info(
|
|
99
|
+
`Retry plugin initialized (max: ${opts.maxRetries}, delay: ${opts.initialDelay}ms)`
|
|
100
|
+
);
|
|
107
101
|
},
|
|
108
102
|
};
|
|
109
103
|
};
|