@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.
Files changed (100) hide show
  1. package/DelicityThermalPrinter.podspec +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +649 -0
  4. package/android/build.gradle +122 -0
  5. package/android/src/main/AndroidManifest.xml +38 -0
  6. package/android/src/main/java/com/delicity/thermalprinter/Logger.kt +50 -0
  7. package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterEngine.kt +528 -0
  8. package/android/src/main/java/com/delicity/thermalprinter/ThermalPrinterPlugin.kt +334 -0
  9. package/android/src/main/java/com/delicity/thermalprinter/adapters/BleAdapter.kt +125 -0
  10. package/android/src/main/java/com/delicity/thermalprinter/adapters/BrotherAdapter.kt +206 -0
  11. package/android/src/main/java/com/delicity/thermalprinter/adapters/EpsonAdapter.kt +384 -0
  12. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosAdapter.kt +160 -0
  13. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosCommands.kt +42 -0
  14. package/android/src/main/java/com/delicity/thermalprinter/adapters/EscPosTextEncoder.kt +138 -0
  15. package/android/src/main/java/com/delicity/thermalprinter/adapters/PrinterAdapter.kt +95 -0
  16. package/android/src/main/java/com/delicity/thermalprinter/adapters/RawTcpAdapter.kt +96 -0
  17. package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkContract.kt +158 -0
  18. package/android/src/main/java/com/delicity/thermalprinter/adapters/SdkReflect.kt +104 -0
  19. package/android/src/main/java/com/delicity/thermalprinter/adapters/StarAdapter.kt +322 -0
  20. package/android/src/main/java/com/delicity/thermalprinter/adapters/UsbAdapter.kt +248 -0
  21. package/android/src/main/java/com/delicity/thermalprinter/adapters/ZebraAdapter.kt +207 -0
  22. package/android/src/main/java/com/delicity/thermalprinter/discovery/AdapterPriority.kt +39 -0
  23. package/android/src/main/java/com/delicity/thermalprinter/discovery/BleScanner.kt +70 -0
  24. package/android/src/main/java/com/delicity/thermalprinter/discovery/BluetoothClassicScanner.kt +112 -0
  25. package/android/src/main/java/com/delicity/thermalprinter/discovery/DiscoveryManager.kt +136 -0
  26. package/android/src/main/java/com/delicity/thermalprinter/discovery/TcpScanner.kt +96 -0
  27. package/android/src/main/java/com/delicity/thermalprinter/image/ImageCache.kt +88 -0
  28. package/android/src/main/java/com/delicity/thermalprinter/image/ImageProcessor.kt +220 -0
  29. package/android/src/main/java/com/delicity/thermalprinter/image/TextRasterizer.kt +99 -0
  30. package/android/src/main/java/com/delicity/thermalprinter/model/Models.kt +206 -0
  31. package/android/src/main/java/com/delicity/thermalprinter/model/PrintItem.kt +100 -0
  32. package/android/src/main/java/com/delicity/thermalprinter/store/PrinterStore.kt +71 -0
  33. package/android/src/main/java/com/delicity/thermalprinter/transport/BleGattClient.kt +201 -0
  34. package/android/src/main/java/com/delicity/thermalprinter/transport/BluetoothSppTransport.kt +110 -0
  35. package/android/src/main/java/com/delicity/thermalprinter/transport/ByteTransport.kt +18 -0
  36. package/android/src/main/java/com/delicity/thermalprinter/transport/TcpTransport.kt +83 -0
  37. package/dist/esm/adapters/dedup.d.ts +26 -0
  38. package/dist/esm/adapters/dedup.js +66 -0
  39. package/dist/esm/adapters/dedup.js.map +1 -0
  40. package/dist/esm/adapters/priority.d.ts +29 -0
  41. package/dist/esm/adapters/priority.js +55 -0
  42. package/dist/esm/adapters/priority.js.map +1 -0
  43. package/dist/esm/core/enums.d.ts +61 -0
  44. package/dist/esm/core/enums.js +25 -0
  45. package/dist/esm/core/enums.js.map +1 -0
  46. package/dist/esm/core/errors.d.ts +16 -0
  47. package/dist/esm/core/errors.js +53 -0
  48. package/dist/esm/core/errors.js.map +1 -0
  49. package/dist/esm/core/escpos-text.d.ts +33 -0
  50. package/dist/esm/core/escpos-text.js +239 -0
  51. package/dist/esm/core/escpos-text.js.map +1 -0
  52. package/dist/esm/core/imaging.d.ts +91 -0
  53. package/dist/esm/core/imaging.js +184 -0
  54. package/dist/esm/core/imaging.js.map +1 -0
  55. package/dist/esm/core/models.d.ts +131 -0
  56. package/dist/esm/core/models.js +2 -0
  57. package/dist/esm/core/models.js.map +1 -0
  58. package/dist/esm/core/options.d.ts +154 -0
  59. package/dist/esm/core/options.js +2 -0
  60. package/dist/esm/core/options.js.map +1 -0
  61. package/dist/esm/core/text.d.ts +138 -0
  62. package/dist/esm/core/text.js +14 -0
  63. package/dist/esm/core/text.js.map +1 -0
  64. package/dist/esm/definitions.d.ts +155 -0
  65. package/dist/esm/definitions.js +2 -0
  66. package/dist/esm/definitions.js.map +1 -0
  67. package/dist/esm/index.d.ts +15 -0
  68. package/dist/esm/index.js +18 -0
  69. package/dist/esm/index.js.map +1 -0
  70. package/dist/esm/web.d.ts +63 -0
  71. package/dist/esm/web.js +112 -0
  72. package/dist/esm/web.js.map +1 -0
  73. package/dist/plugin.cjs.js +224 -0
  74. package/dist/plugin.cjs.js.map +1 -0
  75. package/dist/plugin.js +227 -0
  76. package/dist/plugin.js.map +1 -0
  77. package/ios/Plugin/Adapters/BrotherAdapter.swift +139 -0
  78. package/ios/Plugin/Adapters/EpsonAdapter.swift +131 -0
  79. package/ios/Plugin/Adapters/EscPosAdapter.swift +106 -0
  80. package/ios/Plugin/Adapters/EscPosCommands.swift +32 -0
  81. package/ios/Plugin/Adapters/EscPosTextEncoder.swift +115 -0
  82. package/ios/Plugin/Adapters/PrinterAdapter.swift +44 -0
  83. package/ios/Plugin/Adapters/RawTcpAdapter.swift +70 -0
  84. package/ios/Plugin/Adapters/StarAdapter.swift +305 -0
  85. package/ios/Plugin/Adapters/ZebraAdapter.swift +119 -0
  86. package/ios/Plugin/Discovery/AdapterPriority.swift +21 -0
  87. package/ios/Plugin/Discovery/BonjourScanner.swift +51 -0
  88. package/ios/Plugin/Discovery/DiscoveryManager.swift +86 -0
  89. package/ios/Plugin/Image/ImageCache.swift +73 -0
  90. package/ios/Plugin/Image/ImageProcessor.swift +168 -0
  91. package/ios/Plugin/Image/TextRasterizer.swift +81 -0
  92. package/ios/Plugin/Logger.swift +33 -0
  93. package/ios/Plugin/Model/Models.swift +174 -0
  94. package/ios/Plugin/Model/PrintItem.swift +111 -0
  95. package/ios/Plugin/Store/PrinterStore.swift +51 -0
  96. package/ios/Plugin/ThermalPrinterEngine.swift +395 -0
  97. package/ios/Plugin/ThermalPrinterPlugin.m +22 -0
  98. package/ios/Plugin/ThermalPrinterPlugin.swift +258 -0
  99. package/ios/Plugin/Transport/TcpTransport.swift +89 -0
  100. 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
+ }