Swiftpack.co - Package - surfstudio/NodeKit

Documentation Build status codebeat badge codecov

Гибкая и полностью кастомизируемая библиотека для работы с сетью.

Архитектура библиотеки представляет из себя граф узлов, где узел представляет из себя операцию по преобразовании входных данных. Таким образом мы преобразуем входные данные в ответ от сервера с помощью цепочки узлов. И такое преобразование может быть сколько угодно сложным. Причем подразумевается, что каждый отдельный узел может исполнятся в каком-то другом потоке.

All text

Такая архитектура позволяет гибко подстраиватья под самые разные требования в рамках одного проекта. При этом с точки зрения API все выглядит прозрачно

Как начать

Самый простой вариант:


import NodeKit

enum Endpoint: UrlRouteProvider {
    case loadData

    func url() throws -> URL {
        switch self {
        case .loadData: return try .from("https://http2.pro/api/v1")
        }
    }
}

func makeRequest() -> Observer<Void> {
    return UrlChainsBuilder()
        .default(with: .init(method: .post, route: Endpoint.loadData))
        .process(["key": "value"])
}

Это только пример 🙂 (так делать не надо)

У нас есть гайд. Так же в проекте есть песочницы:

Интересные кейсы

Проблема с маппингом

На одном из проектов был случай, связанный с маппингом ответов.

Более 30 методов работали по следующей схеме:

Code 200 ->
Body:
{
    #some data
}

В случае ошибки же

Code 400 ->
Body:
{
    code: int,
    message: string
}

Затем требования изменились и все новые методы (которые будут созданы) будут работать по другой схеме:

Успех:

Code 200 ->
Body:
{
    #some data
}

Ошибка:

Code 200 ->
Body:
{
    "error": {
        code: int,
        message: string
    }
}

Соответственно нам необходимо поддерживать сразу две схемы маппинга.

Эта задача очень просто решилась добавлением всего одного узла в слой траспорта, который определял что нужно замапить. Ошибку или данные.

Repeat

Было требование для определенных полей ввода организовывать "повторение запроса до успеха". Пользователь вводил данные в эти поля и мы должны были стучаться на сервер до тех пор, пока он не даст нам ответ.

И эта проблема решилась тоже очень просто. Достаточно было написать узел, который в случае ошибки тротлил выполнение цепочки, а затем повторял запрос.

Документация

Contribution Guide

Как этим пользоваться

Как работает библиотека

Существующие узлы

Реализованные цепочки

Про использование моделей

Логирование

Конексты и наблюдатели

Документация кода

Github

link
Stars: 24

Dependencies

Used By

Total: 0

Releases

Небольшой минорный релиз - 2020-02-10 04:04:44

Что сделано:

  • Исправлен RC в узлах для кэширования (Спасибо @avsmirnov567)
  • Синтаксический сахар для RawMappable разделен на соответствующие протоколы (На RawDecodable и RawEncodable) (Спасибо @NagusHate)

Теперь сессия в ChainBuilder-е публичная - 2020-02-08 10:40:17

session в URLChainBuilder теперь публичная.

Теперь можно глушить ошибки кэша - 2020-02-07 06:54:04

Теперь узлу UrlCacheReaderNode можно указать, что не надо выкидывать ошибку в случае, если при чтении их кэша произошла ошибка.

UrlCache subspec - 2020-02-06 09:43:12

Добавлена сабспека для узлов с URL-кэшом

Кастомизация RequestManager - 2020-01-21 07:07:36

В UrlChainsBuilder теперь можно установить пользовательскую (свою собственную) Alamofire.Session. В случае, если этого не делать - будет использоваться сессия по-умолчанию.

Огромное спасибо @Alelenka за релиз!

Исправлен баг с логами - 2019-12-19 11:17:26

Исправлен баг с филтрацией логов

Теперь при паркинге возвращается ошибка - 2019-12-19 09:33:49

Исправил косяк с обработкой ошибки для VoidOutput цепочки

Исправлена операция cancel - 2019-12-19 07:16:58

Исправлена операция отмены запроса. Сейчас в случае вызова context.cancel() все "слушатели" затираются.

Ренейминг, Рефакторинг, Декларативщина - 2019-11-26 14:51:45

Что сделано: • Убрана модель UrlChainConfigModel. Теперь все эти параметры можно задавать (или не задавать) декларативно. • Переименован default в build потому что давно пора! • Добавлена возможность передавать хедеры с помощью протокола-провайдера (тоже декларативно между-прочим!) • Добавлена возможность указывать какие логи надо исключить без переcборки цепочки. Прямо из сервиса • Сломал жизнь всем, кто пользуется библиотекой потому что придется мигрировать :blush:

URL-Query в каждый запрос! - 2019-11-19 20:19:57

  • Добавлена возможность вставлять url-query для любого запроса (лишь бы был URL)
  • Добавлен сахар для декларативного конфигурирования

Теперь можно сделать вот так:

func update(params:[String], desc: Bool, map: [String: Any], users: [User]) -> Observer<Void> {
        return UrlChainBuilder()
            .set(query: ["params": params], "desc": desc, "map": map, "max": 20)
            .set(boolEncodingStartegy: .asBool)
            .set(arrayEncodingStrategy: .noBrackets)
            .default(with: UrlChainConfigModel(method: .post, route: RegistrationRoute.taskState)
            .process(users) 
    }

Parsing error logging - 2019-10-25 09:03:41

Теперь ошибки Парсинга логируются!

CoreEvents 2.0.1 - 2019-10-12 10:49:48

Обновил CoreEvents до 2.0.1

Multipart-запросы - 2019-09-22 18:41:01

Добавлены multipart-запросы Обновлена документация Добавлен сахар для конвертации nullable-моделей:

var foo: RawMappable? = ...
var bar: DTOConvertible? = .from(dto: foo)

Обновлена документация в коде и в репозитории

Улучшение логи и работа с бинарными данными - 2019-06-14 09:14:28

Улучшили логи (2.0.1) Добавили возможность загружать с сервера какие-то бинарные данные. Например PDF или картинки. В связи с этим расширился API у узла маппинга (он теперь Generic).

Improve logs - 2019-06-14 08:09:08

Исправили логи:

  • Теперь логи выводятся в определенном порядке, а не как придется.
  • Убрал из логов метрики ответа
  • Исправил формат

1.3.0 - 2019-05-15 15:40:53