@delicity/capacitor-thermal-printer 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DelicityThermalPrinter.podspec +28 -0
- package/LICENSE +21 -0
- package/README.md +649 -0
- package/android/build.gradle +122 -0
- package/android/src/main/AndroidManifest.xml +38 -0
- package/android/src/main/java/com/delicity/thermalprinter/Logger.kt +50 -0
- package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterEngine.kt +528 -0
- package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterPlugin.kt +334 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/BleAdapter.kt +125 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/BrotherAdapter.kt +206 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/EpsonAdapter.kt +384 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosAdapter.kt +160 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosCommands.kt +42 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosTextEncoder.kt +138 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/PrinterAdapter.kt +95 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/RawTcpAdapter.kt +96 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkContract.kt +158 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkReflect.kt +104 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/StarAdapter.kt +322 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/UsbAdapter.kt +248 -0
- package/android/src/main/java/com/delicity/thermalprinter/adapters/ZebraAdapter.kt +207 -0
- package/android/src/main/java/com/delicity/thermalprinter/discovery/AdapterPriority.kt +39 -0
- package/android/src/main/java/com/delicity/thermalprinter/discovery/BleScanner.kt +70 -0
- package/android/src/main/java/com/delicity/thermalprinter/discovery/BluetoothClassicScanner.kt +112 -0
- package/android/src/main/java/com/delicity/thermalprinter/discovery/DiscoveryManager.kt +136 -0
- package/android/src/main/java/com/delicity/thermalprinter/discovery/TcpScanner.kt +96 -0
- package/android/src/main/java/com/delicity/thermalprinter/image/ImageCache.kt +88 -0
- package/android/src/main/java/com/delicity/thermalprinter/image/ImageProcessor.kt +220 -0
- package/android/src/main/java/com/delicity/thermalprinter/image/TextRasterizer.kt +99 -0
- package/android/src/main/java/com/delicity/thermalprinter/model/Models.kt +206 -0
- package/android/src/main/java/com/delicity/thermalprinter/model/PrintItem.kt +100 -0
- package/android/src/main/java/com/delicity/thermalprinter/store/PrinterStore.kt +71 -0
- package/android/src/main/java/com/delicity/thermalprinter/transport/BleGattClient.kt +201 -0
- package/android/src/main/java/com/delicity/thermalprinter/transport/BluetoothSppTransport.kt +110 -0
- package/android/src/main/java/com/delicity/thermalprinter/transport/ByteTransport.kt +18 -0
- package/android/src/main/java/com/delicity/thermalprinter/transport/TcpTransport.kt +83 -0
- package/dist/esm/adapters/dedup.d.ts +26 -0
- package/dist/esm/adapters/dedup.js +66 -0
- package/dist/esm/adapters/dedup.js.map +1 -0
- package/dist/esm/adapters/priority.d.ts +29 -0
- package/dist/esm/adapters/priority.js +55 -0
- package/dist/esm/adapters/priority.js.map +1 -0
- package/dist/esm/core/enums.d.ts +61 -0
- package/dist/esm/core/enums.js +25 -0
- package/dist/esm/core/enums.js.map +1 -0
- package/dist/esm/core/errors.d.ts +16 -0
- package/dist/esm/core/errors.js +53 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/escpos-text.d.ts +33 -0
- package/dist/esm/core/escpos-text.js +239 -0
- package/dist/esm/core/escpos-text.js.map +1 -0
- package/dist/esm/core/imaging.d.ts +91 -0
- package/dist/esm/core/imaging.js +184 -0
- package/dist/esm/core/imaging.js.map +1 -0
- package/dist/esm/core/models.d.ts +131 -0
- package/dist/esm/core/models.js +2 -0
- package/dist/esm/core/models.js.map +1 -0
- package/dist/esm/core/options.d.ts +154 -0
- package/dist/esm/core/options.js +2 -0
- package/dist/esm/core/options.js.map +1 -0
- package/dist/esm/core/text.d.ts +138 -0
- package/dist/esm/core/text.js +14 -0
- package/dist/esm/core/text.js.map +1 -0
- package/dist/esm/definitions.d.ts +155 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/web.d.ts +63 -0
- package/dist/esm/web.js +112 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/plugin.cjs.js +224 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +227 -0
- package/dist/plugin.js.map +1 -0
- package/ios/Plugin/Adapters/BrotherAdapter.swift +139 -0
- package/ios/Plugin/Adapters/EpsonAdapter.swift +131 -0
- package/ios/Plugin/Adapters/EscPosAdapter.swift +106 -0
- package/ios/Plugin/Adapters/EscPosCommands.swift +32 -0
- package/ios/Plugin/Adapters/EscPosTextEncoder.swift +115 -0
- package/ios/Plugin/Adapters/PrinterAdapter.swift +44 -0
- package/ios/Plugin/Adapters/RawTcpAdapter.swift +70 -0
- package/ios/Plugin/Adapters/StarAdapter.swift +305 -0
- package/ios/Plugin/Adapters/ZebraAdapter.swift +119 -0
- package/ios/Plugin/Discovery/AdapterPriority.swift +21 -0
- package/ios/Plugin/Discovery/BonjourScanner.swift +51 -0
- package/ios/Plugin/Discovery/DiscoveryManager.swift +86 -0
- package/ios/Plugin/Image/ImageCache.swift +73 -0
- package/ios/Plugin/Image/ImageProcessor.swift +168 -0
- package/ios/Plugin/Image/TextRasterizer.swift +81 -0
- package/ios/Plugin/Logger.swift +33 -0
- package/ios/Plugin/Model/Models.swift +174 -0
- package/ios/Plugin/Model/PrintItem.swift +111 -0
- package/ios/Plugin/Store/PrinterStore.swift +51 -0
- package/ios/Plugin/ThermalPrinterEngine.swift +395 -0
- package/ios/Plugin/ThermalPrinterPlugin.m +22 -0
- package/ios/Plugin/ThermalPrinterPlugin.swift +258 -0
- package/ios/Plugin/Transport/TcpTransport.swift +89 -0
- package/package.json +96 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import Network
|
|
3
|
+
|
|
4
|
+
/// Transport TCP (RAW / port 9100) basé sur Network.framework (NWConnection).
|
|
5
|
+
///
|
|
6
|
+
/// ⚠️ iOS : la première connexion à une IP locale déclenche la pop-up système
|
|
7
|
+
/// "Réseau local". Il FAUT déclarer NSLocalNetworkUsageDescription dans Info.plist.
|
|
8
|
+
final class TcpTransport {
|
|
9
|
+
|
|
10
|
+
private let host: String
|
|
11
|
+
private let port: UInt16
|
|
12
|
+
private var connection: NWConnection?
|
|
13
|
+
private let queue = DispatchQueue(label: "thermalprinter.tcp")
|
|
14
|
+
|
|
15
|
+
private(set) var isOpen = false
|
|
16
|
+
|
|
17
|
+
init(host: String, port: UInt16 = 9100) {
|
|
18
|
+
self.host = host
|
|
19
|
+
self.port = port
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
func open(timeoutMs: Int) async throws {
|
|
23
|
+
if isOpen { return }
|
|
24
|
+
let conn = NWConnection(
|
|
25
|
+
host: NWEndpoint.Host(host),
|
|
26
|
+
port: NWEndpoint.Port(rawValue: port)!,
|
|
27
|
+
using: .tcp
|
|
28
|
+
)
|
|
29
|
+
self.connection = conn
|
|
30
|
+
|
|
31
|
+
try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
|
|
32
|
+
var resumed = false
|
|
33
|
+
func finish(_ result: Result<Void, Error>) {
|
|
34
|
+
if resumed { return }
|
|
35
|
+
resumed = true
|
|
36
|
+
cont.resume(with: result)
|
|
37
|
+
}
|
|
38
|
+
conn.stateUpdateHandler = { [weak self] state in
|
|
39
|
+
switch state {
|
|
40
|
+
case .ready:
|
|
41
|
+
self?.isOpen = true
|
|
42
|
+
finish(.success(()))
|
|
43
|
+
case .failed(let err):
|
|
44
|
+
finish(.failure(PrinterError(.CONNECTION_FAILED, "TCP \(self?.host ?? "")", detail: err.localizedDescription, retryable: true)))
|
|
45
|
+
case .cancelled:
|
|
46
|
+
finish(.failure(PrinterError(.CONNECTION_FAILED, "TCP annulé")))
|
|
47
|
+
default: break
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
conn.start(queue: queue)
|
|
51
|
+
queue.asyncAfter(deadline: .now() + .milliseconds(timeoutMs)) {
|
|
52
|
+
if !resumed {
|
|
53
|
+
conn.cancel()
|
|
54
|
+
finish(.failure(PrinterError(.TIMEOUT, "Timeout TCP \(self.host):\(self.port)", retryable: true)))
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func write(_ bytes: [UInt8]) async throws {
|
|
61
|
+
guard let conn = connection, isOpen else {
|
|
62
|
+
throw PrinterError(.CONNECTION_FAILED, "Socket TCP non ouvert")
|
|
63
|
+
}
|
|
64
|
+
let data = Data(bytes)
|
|
65
|
+
// Envoi par chunks pour ménager les petits buffers imprimante.
|
|
66
|
+
let chunkSize = 4096
|
|
67
|
+
var offset = 0
|
|
68
|
+
while offset < data.count {
|
|
69
|
+
let end = min(offset + chunkSize, data.count)
|
|
70
|
+
let chunk = data.subdata(in: offset..<end)
|
|
71
|
+
try await withCheckedThrowingContinuation { (cont: CheckedContinuation<Void, Error>) in
|
|
72
|
+
conn.send(content: chunk, completion: .contentProcessed { error in
|
|
73
|
+
if let error = error {
|
|
74
|
+
cont.resume(throwing: PrinterError(.PRINT_FAILED, "Écriture TCP échouée", detail: error.localizedDescription, retryable: true))
|
|
75
|
+
} else {
|
|
76
|
+
cont.resume()
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
offset = end
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
func close() {
|
|
85
|
+
connection?.cancel()
|
|
86
|
+
connection = nil
|
|
87
|
+
isOpen = false
|
|
88
|
+
}
|
|
89
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@delicity/capacitor-thermal-printer",
|
|
3
|
+
"version": "7.0.0",
|
|
4
|
+
"description": "Plugin Capacitor d'impression thermique multi-marques (ESC/POS, Epson, Star, Brother, Zebra) par image, avec découverte agrégée et reconnexion automatique.",
|
|
5
|
+
"main": "dist/plugin.cjs.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/esm/index.d.ts",
|
|
8
|
+
"unpkg": "dist/plugin.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"android/src/main/",
|
|
11
|
+
"android/build.gradle",
|
|
12
|
+
"dist/",
|
|
13
|
+
"ios/Plugin/",
|
|
14
|
+
"DelicityThermalPrinter.podspec"
|
|
15
|
+
],
|
|
16
|
+
"author": "Delicity",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/your-org/capacitor-thermal-printer.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/your-org/capacitor-thermal-printer/issues"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"capacitor",
|
|
27
|
+
"plugin",
|
|
28
|
+
"native",
|
|
29
|
+
"thermal-printer",
|
|
30
|
+
"escpos",
|
|
31
|
+
"epson",
|
|
32
|
+
"star",
|
|
33
|
+
"brother",
|
|
34
|
+
"zebra",
|
|
35
|
+
"receipt",
|
|
36
|
+
"bluetooth",
|
|
37
|
+
"ble",
|
|
38
|
+
"tcp"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"verify": "npm run verify:ios && npm run verify:android && npm run verify:web",
|
|
42
|
+
"verify:ios": "xcodebuild -scheme DelicityThermalPrinter -destination generic/platform=iOS build",
|
|
43
|
+
"verify:android": "cd android && ./gradlew clean build test && cd ..",
|
|
44
|
+
"verify:web": "npm run build",
|
|
45
|
+
"lint": "npm run eslint && npm run prettier -- --check",
|
|
46
|
+
"fmt": "npm run eslint -- --fix && npm run prettier -- --write",
|
|
47
|
+
"eslint": "eslint . --ext ts",
|
|
48
|
+
"prettier": "prettier \"**/*.{css,html,ts,js,java}\"",
|
|
49
|
+
"docgen": "docgen --api ThermalPrinterPlugin --output-readme README.md --output-json dist/docs.json",
|
|
50
|
+
"build": "npm run clean && tsc && rollup -c rollup.config.mjs",
|
|
51
|
+
"clean": "rimraf ./dist",
|
|
52
|
+
"watch": "tsc --watch",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"test:watch": "vitest",
|
|
55
|
+
"test:coverage": "vitest run --coverage",
|
|
56
|
+
"prepublishOnly": "npm run build"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@capacitor/android": "^7.0.0",
|
|
60
|
+
"@capacitor/core": "^7.6.6",
|
|
61
|
+
"@capacitor/docgen": "^0.3.0",
|
|
62
|
+
"@capacitor/ios": "^7.0.0",
|
|
63
|
+
"@ionic/eslint-config": "^0.4.0",
|
|
64
|
+
"@ionic/prettier-config": "^4.0.0",
|
|
65
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
66
|
+
"eslint": "^8.57.0",
|
|
67
|
+
"jsdom": "^25.0.1",
|
|
68
|
+
"prettier": "^3.4.2",
|
|
69
|
+
"rimraf": "^6.1.3",
|
|
70
|
+
"rollup": "^4.62.0",
|
|
71
|
+
"typescript": "~5.4.5",
|
|
72
|
+
"vitest": "^2.1.9"
|
|
73
|
+
},
|
|
74
|
+
"peerDependencies": {
|
|
75
|
+
"@capacitor/core": ">=7.0.0 <8.0.0"
|
|
76
|
+
},
|
|
77
|
+
"capacitor": {
|
|
78
|
+
"ios": {
|
|
79
|
+
"src": "ios"
|
|
80
|
+
},
|
|
81
|
+
"android": {
|
|
82
|
+
"src": "android"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"engines": {
|
|
86
|
+
"node": ">=20.0.0"
|
|
87
|
+
},
|
|
88
|
+
"publishConfig": {
|
|
89
|
+
"access": "public"
|
|
90
|
+
},
|
|
91
|
+
"sideEffects": false,
|
|
92
|
+
"prettier": "@ionic/prettier-config",
|
|
93
|
+
"eslintConfig": {
|
|
94
|
+
"extends": "@ionic/eslint-config/recommended"
|
|
95
|
+
}
|
|
96
|
+
}
|