@nitra/zebra 7.1.1 → 7.1.3

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @nitra/zebra
2
2
 
3
- Capacitor-плагін для друку ZPL на принтерах Zebra з підтримкою веб (Web Serial API), iOS та Android.
3
+ Capacitor-плагін для друку ZPL на принтерах Zebra з підтримкою веб (Web Serial API), iOS та Android
4
4
 
5
5
  ## Вимоги
6
6
 
@@ -16,6 +16,8 @@ npm install @nitra/zebra
16
16
  npx cap sync
17
17
  ```
18
18
 
19
+ Патч-реліз гілки 7.x: за версією — `@nitra/zebra@7.1.2`, або за тегом — `@nitra/zebra@patch` (npm/bun).
20
+
19
21
  ## API
20
22
 
21
23
  ### `print(zpl: string | PrintOptions): Promise<{ sent?: boolean }>`
@@ -37,10 +39,10 @@ npx cap sync
37
39
  **Приклад:**
38
40
 
39
41
  ```javascript
40
- import { Zebra } from '@nitra/zebra'
42
+ import { Zebra } from "@nitra/zebra";
41
43
 
42
- const zpl = '^XA^FO50,50^A0N,28,28^FDHello World^FS^XZ'
43
- await Zebra.print(zpl)
44
+ const zpl = "^XA^FO50,50^A0N,28,28^FDHello World^FS^XZ";
45
+ await Zebra.print(zpl);
44
46
  ```
45
47
 
46
48
  ### `setPrinterAddress(options: { address: string, port?: number }): Promise<{ address }>` (Android / iOS)
@@ -55,8 +57,8 @@ await Zebra.print(zpl)
55
57
  **Приклад (Android):**
56
58
 
57
59
  ```javascript
58
- await Zebra.setPrinterAddress({ address: '00:11:22:33:44:55' })
59
- await Zebra.print(zpl)
60
+ await Zebra.setPrinterAddress({ address: "00:11:22:33:44:55" });
61
+ await Zebra.print(zpl);
60
62
  ```
61
63
 
62
64
  **Приклад (iOS):** використовуйте `address` з `getPairedDevices()` (серійний номер або ім'я принтера).
@@ -68,7 +70,7 @@ await Zebra.print(zpl)
68
70
  **Приклад (Android):**
69
71
 
70
72
  ```javascript
71
- const { devices } = await Zebra.getPairedDevices()
73
+ const { devices } = await Zebra.getPairedDevices();
72
74
  // devices: [{ address: "00:11:22:33:44:55", name: "Zebra ZD420" }, ...]
73
75
  ```
74
76
 
@@ -87,6 +87,10 @@ import ExternalAccessory
87
87
  private weak var owner: Zebra?
88
88
  private var startTime = Date()
89
89
  private let session: EASession
90
+ /// Чи отримано openCompleted; перший запис робимо тільки після нього + невеликої затримки (інакше при першому визові дані можуть не дійти до пристрою)
91
+ private var openCompleted = false
92
+ /// Затримка після відкриття потоку перед першим записом (External Accessory потребує часу на встановлення з'єднання)
93
+ private static let delayAfterOpen: TimeInterval = 0.35
90
94
 
91
95
  init(owner: Zebra, session: EASession, output: OutputStream, data: [UInt8], address: String, timeout: TimeInterval = 5.0, completion: @escaping (Result<PrintResult, ZebraError>) -> Void) {
92
96
  self.owner = owner
@@ -117,7 +121,7 @@ import ExternalAccessory
117
121
 
118
122
  /// Після запису всіх байтів дає час на флаш буфера (iOS може не встигнути відправити на пристрій при миттєвому закритті)
119
123
  private func flushThenClose() {
120
- let flushDuration: TimeInterval = 0.35
124
+ let flushDuration: TimeInterval = 1.2
121
125
  let deadline = Date().addingTimeInterval(flushDuration)
122
126
  while Date() < deadline {
123
127
  RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.05))
@@ -148,7 +152,7 @@ import ExternalAccessory
148
152
  }
149
153
 
150
154
  // 4) Затримка, щоб iOS встиг звільнити EASession до наступного відкриття
151
- Thread.sleep(forTimeInterval: 0.25)
155
+ Thread.sleep(forTimeInterval: 0.6)
152
156
  if let completion = completion {
153
157
  completion(result)
154
158
  }
@@ -166,9 +170,20 @@ import ExternalAccessory
166
170
  }
167
171
  switch eventCode {
168
172
  case .openCompleted:
169
- // Потік відкрито
173
+ // Потік відкрито; даємо час EA встановити з'єднання з пристроєм перед першим записом
170
174
  owner?.log("Stream open completed")
175
+ openCompleted = true
171
176
  case .hasSpaceAvailable:
177
+ // Не пишемо до отримання openCompleted (порядок подій не гарантований)
178
+ guard openCompleted else { return }
179
+ // Після першого openCompleted чекаємо невелику затримку перед першим записом (при першому визові printZpl з'єднання може ще не бути готове)
180
+ if totalWritten == 0 {
181
+ let deadline = Date().addingTimeInterval(StreamWriter.delayAfterOpen)
182
+ while Date() < deadline {
183
+ RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.05))
184
+ }
185
+ owner?.log("Delay after open done, starting write")
186
+ }
172
187
  // Є простір для запису, пишемо дані порціями
173
188
  if totalWritten >= data.count {
174
189
  // Усі байти записані — даємо час на флаш буфера перед закриттям (iOS часто не встигає відправити на пристрій)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/zebra",
3
- "version": "7.1.1",
3
+ "version": "7.1.3",
4
4
  "description": "Zebra printer",
5
5
  "keywords": [
6
6
  "capacitor",