@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
|
|
92
|
-
///
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
openCompleted = true
|
|
204
|
+
owner?.log("Output stream open completed")
|
|
205
|
+
outputOpenCompleted = true
|
|
176
206
|
case .hasSpaceAvailable:
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
|
214
|
+
owner?.log("Delay after open (no input stream), starting write")
|
|
186
215
|
}
|
|
187
216
|
// Є простір для запису, пишемо дані порціями
|
|
188
217
|
if totalWritten >= data.count {
|