@nitra/zebra 7.1.3 → 7.1.4

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.
@@ -87,10 +87,13 @@ 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
+ /// Чи отримано openCompleted на output; перший запис лише після готовності сесії (див. readyToWrite).
91
+ private var outputOpenCompleted = false
92
+ /// Чи отримано openCompleted на input (якщо є). Події InputStream: openCompleted, hasBytesAvailable, errorOccurred, endEncountered.
93
+ /// Використовуємо input.openCompleted як сигнал "з'єднання з обох боків відкрите", щоб не покладатися на фіксовані таймаути.
94
+ private var inputOpenCompleted = false
95
+ /// Якщо inputStream відсутній, після output.openCompleted чекаємо цю затримку перед першим записом.
96
+ private static let delayAfterOpenWhenNoInput: TimeInterval = 0.35
94
97
 
95
98
  init(owner: Zebra, session: EASession, output: OutputStream, data: [UInt8], address: String, timeout: TimeInterval = 5.0, completion: @escaping (Result<PrintResult, ZebraError>) -> Void) {
96
99
  self.owner = owner
@@ -160,29 +163,55 @@ import ExternalAccessory
160
163
  owner?.log("StreamWriter finished with", result)
161
164
  }
162
165
 
166
+ /// Сесія готова до запису: output відкрито і (якщо є input) input теж відкрито — уникаємо фіксованих таймаутів.
167
+ private var readyToWrite: Bool {
168
+ guard outputOpenCompleted else { return false }
169
+ guard let input = session.inputStream else {
170
+ return true
171
+ }
172
+ return inputOpenCompleted
173
+ }
174
+
163
175
  func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
164
- // Події input-потоку ігноруємо (потрібен лише для коректного життєвого циклу сесії)
165
- guard aStream === output else { return }
176
+ // Події input-потоку: openCompleted, hasBytesAvailable, errorOccurred, endEncountered (для читання відповідей принтера, якщо протокол підтримує)
177
+ if aStream !== output {
178
+ switch eventCode {
179
+ case .openCompleted:
180
+ owner?.log("Input stream open completed")
181
+ inputOpenCompleted = true
182
+ case .hasBytesAvailable:
183
+ // Можна читати input.read() для відповідей принтера — зараз не використовуємо
184
+ break
185
+ case .errorOccurred:
186
+ let reason = aStream.streamError?.localizedDescription ?? "Невідома помилка"
187
+ owner?.log("Input stream error:", reason)
188
+ case .endEncountered:
189
+ owner?.log("Input stream end encountered")
190
+ default:
191
+ break
192
+ }
193
+ return
194
+ }
195
+
166
196
  if Date().timeIntervalSince(startTime) > timeout {
167
197
  owner?.log("StreamWriter timeout")
168
198
  close(with: .failure(.writeFailed("Таймаут запису")))
169
199
  return
170
200
  }
201
+
171
202
  switch eventCode {
172
203
  case .openCompleted:
173
- // Потік відкрито; даємо час EA встановити з'єднання з пристроєм перед першим записом
174
- owner?.log("Stream open completed")
175
- openCompleted = true
204
+ owner?.log("Output stream open completed")
205
+ outputOpenCompleted = true
176
206
  case .hasSpaceAvailable:
177
- // Не пишемо до отримання openCompleted (порядок подій не гарантований)
178
- guard openCompleted else { return }
179
- // Після першого openCompleted чекаємо невелику затримку перед першим записом (при першому визові printZpl з'єднання може ще не бути готове)
180
- if totalWritten == 0 {
181
- let deadline = Date().addingTimeInterval(StreamWriter.delayAfterOpen)
207
+ guard readyToWrite else { return }
208
+ // Якщо input потоку немає — після output.openCompleted все одно даємо коротку затримку (fallback)
209
+ if totalWritten == 0, session.inputStream == nil {
210
+ let deadline = Date().addingTimeInterval(StreamWriter.delayAfterOpenWhenNoInput)
182
211
  while Date() < deadline {
183
212
  RunLoop.current.run(mode: .default, before: Date().addingTimeInterval(0.05))
184
213
  }
185
- owner?.log("Delay after open done, starting write")
214
+ owner?.log("Delay after open (no input stream), starting write")
186
215
  }
187
216
  // Є простір для запису, пишемо дані порціями
188
217
  if totalWritten >= data.count {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/zebra",
3
- "version": "7.1.3",
3
+ "version": "7.1.4",
4
4
  "description": "Zebra printer",
5
5
  "keywords": [
6
6
  "capacitor",