
[!IMPORTANT] Disclaimer: This is an unofficial, community-maintained library. It is not officially endorsed by, affiliated with, or sponsored by any official OFD provider or government authority.
Дисклеймер: Данный проект является неофициальной библиотекой, поддерживаемой сообществом. Он не связан, не спонсируется и не утверждался официальными провайдерами ОФД или государственными органами.
A lightweight, high-performance, and coroutine-based Kotlin Multiplatform (KMP) TCP client designed for data exchange with OFD (Operator of Fiscal Data) servers that support the CPCR protocol.
It implements a stateless, short-lived socket connection pattern ("one connection per request/response transaction"), which is highly resilient for mobile environments and cellular networks (LTE/3G/Wi-Fi).
io.ktor:ktor-network for fully asynchronous and non-blocking I/O.sendAndReceive call opens exactly one TCP socket, sends the complete request, reads one complete response, and closes the socket.headerSize.4 as an unsigned little-endian 32-bit integer.headerSize or larger than maxResponseBytes fails with OfdProtocolViolation.OfdTimeoutNoResponse.OfdTransportFailure.Result.failure.maxResponseBytes is 5 MiB.val client = OfdTcpNetworkClient(
headerSize = 18,
timeoutMillis = 7_000,
maxResponseBytes = 5 * 1024 * 1024,
)
val result = client.sendAndReceive(
endpoint = OfdEndpoint(host = "ofd.example.kz", port = 12345),
request = requestBytes,
)All library failures inherit from OfdNetworkClientException.
| Error | Side | Meaning |
|---|---|---|
OfdRequestTooShort |
Client | Local request is smaller than headerSize. |
OfdResponseHeaderIncomplete |
Server | Server closed the connection before a full response header was read. |
OfdResponsePayloadIncomplete |
Server | Server closed the connection before the declared payload was read. |
OfdResponseSizeTooSmall |
Server | Response header declared a size smaller than headerSize. |
OfdResponseSizeTooLarge |
Server | Response header declared a size larger than local maxResponseBytes. |
OfdTimeoutNoResponse |
Network | No complete response was received within timeoutMillis. |
OfdTransportFailure |
Network/Unknown | Socket I/O or unexpected platform/runtime failure. |
OfdProtocolViolation, OfdTimeoutNoResponse, and OfdTransportFailure also expose machine-readable reason and side properties.
Add the dependency to your shared commonMain source set inside build.gradle.kts:
kotlin {
sourceSets {
commonMain {
dependencies {
implementation("io.github.texport:ofd-network-client:1.2.0")
}
}
}
}You can integrate this library directly into your iOS project using Xcode's Swift Package Manager:
https://github.com/texport/ofd-network-client.git
1.2.0.The ofd-network-client operates as a low-level network transport library and enforces a clear boundary between pure connection/protocol logic and application-level responsibilities:
4).maxResponseBytes, headerSize) to prevent Out Of Memory (OOM) failures before allocating response buffers.superkassa-offline-queue).Легковесный и высокопроизводительный асинхронный TCP-клиент на Kotlin Multiplatform (KMP) для обмена данными с серверами ОФД (операторов фискальных данных), поддерживающими протокол CPCR.
Библиотека реализует модель короткоживущих сокетов («один сокет на одну транзакцию запрос-ответ»), что является наиболее отказоустойчивым решением для мобильных устройств и сотовых сетей (LTE/3G/Wi-Fi), где постоянные TCP-соединения часто обрываются или блокируются файрволами.
io.ktor:ktor-network.sendAndReceive открывает ровно один TCP-сокет, отправляет полный запрос, читает один полный ответ и закрывает сокет.headerSize.4 как unsigned little-endian 32-bit integer.headerSize или больше maxResponseBytes завершается ошибкой OfdProtocolViolation.OfdTimeoutNoResponse.OfdTransportFailure.Result.failure.maxResponseBytes по умолчанию равно 5 MiB.val client = OfdTcpNetworkClient(
headerSize = 18,
timeoutMillis = 7_000,
maxResponseBytes = 5 * 1024 * 1024,
)
val result = client.sendAndReceive(
endpoint = OfdEndpoint(host = "ofd.example.kz", port = 12345),
request = requestBytes,
)Все ошибки библиотеки наследуются от OfdNetworkClientException.
| Ошибка | Сторона | Значение |
|---|---|---|
OfdRequestTooShort |
Client | Локальный запрос меньше headerSize. |
OfdResponseHeaderIncomplete |
Server | Сервер закрыл соединение до полного чтения заголовка ответа. |
OfdResponsePayloadIncomplete |
Server | Сервер закрыл соединение до полного чтения заявленного тела ответа. |
OfdResponseSizeTooSmall |
Server | Заголовок ответа объявил размер меньше headerSize. |
OfdResponseSizeTooLarge |
Server | Заголовок ответа объявил размер больше локального maxResponseBytes. |
OfdTimeoutNoResponse |
Network | Полный ответ не получен за timeoutMillis. |
OfdTransportFailure |
Network/Unknown | Socket I/O ошибка или неожиданная platform/runtime ошибка. |
OfdProtocolViolation, OfdTimeoutNoResponse и OfdTransportFailure также содержат машинно-читаемые свойства reason и side.
Добавьте зависимость в ваш общий набор исходников commonMain в build.gradle.kts:
kotlin {
sourceSets {
commonMain {
dependencies {
implementation("io.github.texport:ofd-network-client:1.2.0")
}
}
}
}Вы можете подключить библиотеку непосредственно в iOS-приложение с помощью Swift Package Manager в Xcode:
https://github.com/texport/ofd-network-client.git
1.2.0.Библиотека ofd-network-client выполняет роль низкоуровневого сетевого транспорта и четко разделяет ответственность между чистой логикой подключения/протокола и прикладным уровнем:
4).maxResponseBytes, headerSize) для предотвращения переполнения памяти (OOM) до выделения буфера под тело ответа.superkassa-offline-queue).
[!IMPORTANT] Disclaimer: This is an unofficial, community-maintained library. It is not officially endorsed by, affiliated with, or sponsored by any official OFD provider or government authority.
Дисклеймер: Данный проект является неофициальной библиотекой, поддерживаемой сообществом. Он не связан, не спонсируется и не утверждался официальными провайдерами ОФД или государственными органами.
A lightweight, high-performance, and coroutine-based Kotlin Multiplatform (KMP) TCP client designed for data exchange with OFD (Operator of Fiscal Data) servers that support the CPCR protocol.
It implements a stateless, short-lived socket connection pattern ("one connection per request/response transaction"), which is highly resilient for mobile environments and cellular networks (LTE/3G/Wi-Fi).
io.ktor:ktor-network for fully asynchronous and non-blocking I/O.sendAndReceive call opens exactly one TCP socket, sends the complete request, reads one complete response, and closes the socket.headerSize.4 as an unsigned little-endian 32-bit integer.headerSize or larger than maxResponseBytes fails with OfdProtocolViolation.OfdTimeoutNoResponse.OfdTransportFailure.Result.failure.maxResponseBytes is 5 MiB.val client = OfdTcpNetworkClient(
headerSize = 18,
timeoutMillis = 7_000,
maxResponseBytes = 5 * 1024 * 1024,
)
val result = client.sendAndReceive(
endpoint = OfdEndpoint(host = "ofd.example.kz", port = 12345),
request = requestBytes,
)All library failures inherit from OfdNetworkClientException.
| Error | Side | Meaning |
|---|---|---|
OfdRequestTooShort |
Client | Local request is smaller than headerSize. |
OfdResponseHeaderIncomplete |
Server | Server closed the connection before a full response header was read. |
OfdResponsePayloadIncomplete |
Server | Server closed the connection before the declared payload was read. |
OfdResponseSizeTooSmall |
Server | Response header declared a size smaller than headerSize. |
OfdResponseSizeTooLarge |
Server | Response header declared a size larger than local maxResponseBytes. |
OfdTimeoutNoResponse |
Network | No complete response was received within timeoutMillis. |
OfdTransportFailure |
Network/Unknown | Socket I/O or unexpected platform/runtime failure. |
OfdProtocolViolation, OfdTimeoutNoResponse, and OfdTransportFailure also expose machine-readable reason and side properties.
Add the dependency to your shared commonMain source set inside build.gradle.kts:
kotlin {
sourceSets {
commonMain {
dependencies {
implementation("io.github.texport:ofd-network-client:1.2.0")
}
}
}
}You can integrate this library directly into your iOS project using Xcode's Swift Package Manager:
https://github.com/texport/ofd-network-client.git
1.2.0.The ofd-network-client operates as a low-level network transport library and enforces a clear boundary between pure connection/protocol logic and application-level responsibilities:
4).maxResponseBytes, headerSize) to prevent Out Of Memory (OOM) failures before allocating response buffers.superkassa-offline-queue).Легковесный и высокопроизводительный асинхронный TCP-клиент на Kotlin Multiplatform (KMP) для обмена данными с серверами ОФД (операторов фискальных данных), поддерживающими протокол CPCR.
Библиотека реализует модель короткоживущих сокетов («один сокет на одну транзакцию запрос-ответ»), что является наиболее отказоустойчивым решением для мобильных устройств и сотовых сетей (LTE/3G/Wi-Fi), где постоянные TCP-соединения часто обрываются или блокируются файрволами.
io.ktor:ktor-network.sendAndReceive открывает ровно один TCP-сокет, отправляет полный запрос, читает один полный ответ и закрывает сокет.headerSize.4 как unsigned little-endian 32-bit integer.headerSize или больше maxResponseBytes завершается ошибкой OfdProtocolViolation.OfdTimeoutNoResponse.OfdTransportFailure.Result.failure.maxResponseBytes по умолчанию равно 5 MiB.val client = OfdTcpNetworkClient(
headerSize = 18,
timeoutMillis = 7_000,
maxResponseBytes = 5 * 1024 * 1024,
)
val result = client.sendAndReceive(
endpoint = OfdEndpoint(host = "ofd.example.kz", port = 12345),
request = requestBytes,
)Все ошибки библиотеки наследуются от OfdNetworkClientException.
| Ошибка | Сторона | Значение |
|---|---|---|
OfdRequestTooShort |
Client | Локальный запрос меньше headerSize. |
OfdResponseHeaderIncomplete |
Server | Сервер закрыл соединение до полного чтения заголовка ответа. |
OfdResponsePayloadIncomplete |
Server | Сервер закрыл соединение до полного чтения заявленного тела ответа. |
OfdResponseSizeTooSmall |
Server | Заголовок ответа объявил размер меньше headerSize. |
OfdResponseSizeTooLarge |
Server | Заголовок ответа объявил размер больше локального maxResponseBytes. |
OfdTimeoutNoResponse |
Network | Полный ответ не получен за timeoutMillis. |
OfdTransportFailure |
Network/Unknown | Socket I/O ошибка или неожиданная platform/runtime ошибка. |
OfdProtocolViolation, OfdTimeoutNoResponse и OfdTransportFailure также содержат машинно-читаемые свойства reason и side.
Добавьте зависимость в ваш общий набор исходников commonMain в build.gradle.kts:
kotlin {
sourceSets {
commonMain {
dependencies {
implementation("io.github.texport:ofd-network-client:1.2.0")
}
}
}
}Вы можете подключить библиотеку непосредственно в iOS-приложение с помощью Swift Package Manager в Xcode:
https://github.com/texport/ofd-network-client.git
1.2.0.Библиотека ofd-network-client выполняет роль низкоуровневого сетевого транспорта и четко разделяет ответственность между чистой логикой подключения/протокола и прикладным уровнем:
4).maxResponseBytes, headerSize) для предотвращения переполнения памяти (OOM) до выделения буфера под тело ответа.superkassa-offline-queue).