Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SPT-1998 LoggerContext #121

Merged
merged 4 commits into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions NodeKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
390E697B2A13660C007F2304 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E69782A13660C007F2304 /* MultipartFormData.swift */; };
390E697C2A13660C007F2304 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E69792A13660C007F2304 /* AFError.swift */; };
390E697D2A13660C007F2304 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 390E697A2A13660C007F2304 /* HTTPHeaders.swift */; };
502F9D972BAA36CF00151A8D /* LoggingContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D962BAA36CF00151A8D /* LoggingContext.swift */; };
502F9D9A2BAA389500151A8D /* LoggingContextTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D992BAA389500151A8D /* LoggingContextTests.swift */; };
502F9D9D2BAA39F400151A8D /* Log+Equatalbe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */; };
90B608D4283E1110006F4309 /* NodeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 90B608CB283E1110006F4309 /* NodeKit.framework */; };
90B608DA283E1110006F4309 /* NodeKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 90B608CE283E1110006F4309 /* NodeKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
90B6090E283E1268006F4309 /* UrlCacheReaderNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B608E4283E1268006F4309 /* UrlCacheReaderNode.swift */; };
Expand Down Expand Up @@ -159,6 +162,9 @@
390E69782A13660C007F2304 /* MultipartFormData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormData.swift; sourceTree = "<group>"; };
390E69792A13660C007F2304 /* AFError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AFError.swift; sourceTree = "<group>"; };
390E697A2A13660C007F2304 /* HTTPHeaders.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPHeaders.swift; sourceTree = "<group>"; };
502F9D962BAA36CF00151A8D /* LoggingContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingContext.swift; sourceTree = "<group>"; };
502F9D992BAA389500151A8D /* LoggingContextTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingContextTests.swift; sourceTree = "<group>"; };
502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Log+Equatalbe.swift"; sourceTree = "<group>"; };
90B608CB283E1110006F4309 /* NodeKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NodeKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
90B608CE283E1110006F4309 /* NodeKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NodeKit.h; sourceTree = "<group>"; };
90B608D3283E1110006F4309 /* NodeKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = NodeKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -343,6 +349,23 @@
path = EndToEndTests;
sourceTree = "<group>";
};
502F9D982BAA385E00151A8D /* Utils */ = {
isa = PBXGroup;
children = (
502F9D9B2BAA39E700151A8D /* Equatable */,
502F9D992BAA389500151A8D /* LoggingContextTests.swift */,
);
path = Utils;
sourceTree = "<group>";
};
502F9D9B2BAA39E700151A8D /* Equatable */ = {
isa = PBXGroup;
children = (
502F9D9C2BAA39F400151A8D /* Log+Equatalbe.swift */,
);
path = Equatable;
sourceTree = "<group>";
};
90B608C1283E1110006F4309 = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -380,6 +403,7 @@
90B608D7283E1110006F4309 /* NodeKitTests */ = {
isa = PBXGroup;
children = (
502F9D982BAA385E00151A8D /* Utils */,
39EF561B2A0E28C3004B77C0 /* EndToEndTests */,
90B609E2283E16DC006F4309 /* Infrastructure */,
90B60A1A283E19C5006F4309 /* Resources */,
Expand Down Expand Up @@ -756,6 +780,7 @@
90B60980283E1287006F4309 /* Logable.swift */,
90B60981283E1287006F4309 /* LoggerExtensions.swift */,
90B60982283E1287006F4309 /* Log.swift */,
502F9D962BAA36CF00151A8D /* LoggingContext.swift */,
);
path = Logging;
sourceTree = "<group>";
Expand Down Expand Up @@ -1136,6 +1161,7 @@
90B6098D283E1287006F4309 /* Method.swift in Sources */,
90B6092B283E1268006F4309 /* Debouncer.swift in Sources */,
90B609C2283E1287006F4309 /* MockerProxyConfigNode.swift in Sources */,
502F9D972BAA36CF00151A8D /* LoggingContext.swift in Sources */,
90B60988283E1287006F4309 /* URLQueryArrayKeyEncodingStartegy.swift in Sources */,
390E69752A136591007F2304 /* RequestEncodingModel.swift in Sources */,
90B609AF283E1287006F4309 /* RequestCreatorNode.swift in Sources */,
Expand Down Expand Up @@ -1175,10 +1201,12 @@
90B609F8283E16DC006F4309 /* EncodingTests.swift in Sources */,
90B609F1283E16DC006F4309 /* ChainConfiguratorNodeTests.swift in Sources */,
90B609F6283E16DC006F4309 /* URLQueryInjectorNodeTests.swift in Sources */,
502F9D9A2BAA389500151A8D /* LoggingContextTests.swift in Sources */,
90B609FD283E16DC006F4309 /* UrlETagReaderNodeTests.swift in Sources */,
90B609F7283E16DC006F4309 /* TokenRefresherNodeTests.swift in Sources */,
90B609F4283E16DC006F4309 /* URLQueryArrayKeyEncodingBracketsStartegyTests.swift in Sources */,
90B609EF283E16DC006F4309 /* DTOMapperNodeTests.swift in Sources */,
502F9D9D2BAA39F400151A8D /* Log+Equatalbe.swift in Sources */,
90B60A09283E16DC006F4309 /* AbortingTests.swift in Sources */,
90B609FB283E16DC006F4309 /* TestUtls.swift in Sources */,
90B60A08283E16DC006F4309 /* Credentials.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"originHash" : "1d2e6911b0388532b33f83466feee8deadacbc6241719180eb45fd871a5091ac",
chausovSurfStudio marked this conversation as resolved.
Show resolved Hide resolved
"pins" : [
{
"identity" : "coreevents",
Expand All @@ -10,5 +11,5 @@
}
}
],
"version" : 2
"version" : 3
}
8 changes: 4 additions & 4 deletions NodeKit/CacheNode/ETag/UrlETagReaderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import Foundation

/// Этот узел читает eTag-токен из хранилища и добавляет его к запросу.
open class UrlETagReaderNode: TransportLayerNode {
open class UrlETagReaderNode: Node {
chausovSurfStudio marked this conversation as resolved.
Show resolved Hide resolved

// Следующий узел для обработки.
public var next: TransportLayerNode
public var next: any TransportLayerNode

/// Ключ, по которому необходимо получить eTag-токен из хедеров.
/// По-молчанию имеет значение `eTagRequestHeaderKey`
Expand All @@ -23,15 +23,15 @@ open class UrlETagReaderNode: TransportLayerNode {
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - eTagHeaderKey: Ключ, по которому необходимо добавить eTag-токен к запросу.
public init(next: TransportLayerNode,
public init(next: some TransportLayerNode,
etagHeaderKey: String = ETagConstants.eTagRequestHeaderKey) {
self.next = next
self.etagHeaderKey = etagHeaderKey
}

/// Пытается прочесть eTag-токен из хранилища и добавить его к запросу.
/// В случае, если прочесть токен не удалось, то управление просто передается дальше.
open override func process(_ data: TransportUrlRequest) -> Observer<Json> {
open func process(_ data: TransportUrlRequest) -> Observer<Json> {
guard let tag = UserDefaults.etagStorage?.value(forKey: data.url.absoluteString) as? String else {
return next.process(data)
}
Expand Down
8 changes: 4 additions & 4 deletions NodeKit/CacheNode/ETag/UrlETagSaverNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ extension UserDefaults {

/// Этот узел сохраняет пришедшие eTag-токены.
/// В качестве ключа используется абсолютный URL до endpoint-a.
open class UrlETagSaverNode: ResponsePostprocessorLayerNode {
open class UrlETagSaverNode: Node {

/// Следующий узел для обработки.
public var next: ResponsePostprocessorLayerNode?
public var next: (any ResponsePostprocessorLayerNode)?

/// Ключ, по которому необходимо получить eTag-токен из хедеров.
/// По-молчанию имеет значение `ETagConstants.eTagResponseHeaderKey`
Expand All @@ -34,14 +34,14 @@ open class UrlETagSaverNode: ResponsePostprocessorLayerNode {
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - eTagHeaderKey: Ключ, по которому необходимо получить eTag-токен из хедеров.
public init(next: ResponsePostprocessorLayerNode?, eTagHeaderKey: String = ETagConstants.eTagResponseHeaderKey) {
public init(next: (any ResponsePostprocessorLayerNode)?, eTagHeaderKey: String = ETagConstants.eTagResponseHeaderKey) {
self.next = next
self.eTagHeaderKey = eTagHeaderKey
}

/// Пытается получить eTag-токен по ключу `UrlETagSaverNode.eTagHeaderKey`.
/// В любом случае передает управление дальше.
open override func process(_ data: UrlProcessedResponse) -> Observer<Void> {
open func process(_ data: UrlProcessedResponse) -> Observer<Void> {
guard let tag = data.response.allHeaderFields[self.eTagHeaderKey] as? String,
let url = data.request.url,
let urlAsKey = url.withOrderedQuery()
Expand Down
10 changes: 5 additions & 5 deletions NodeKit/CacheNode/FirstCachePolicyNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public enum BaseFirstCachePolicyNodeError: Error {
/// Этот узел реализует политику кэширования
/// "Сначала читаем из кэша, а затем запрашиваем у сервера"
/// - Important: В ообщем случае слушатель может быть оповещен дважды. Первый раз, когда ответ прочитан из кэша, а второй раз, когда он был получен с сервера.
open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
open class FirstCachePolicyNode: Node {

// MARK: - Nested

Expand All @@ -33,10 +33,10 @@ open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
// MARK: - Properties

/// Следующий узел для обработки.
public var next: NextProcessorNode
public var next: any NextProcessorNode

/// Узел для чтения из кэша.
public var cacheReaderNode: CacheReaderNode
public var cacheReaderNode: any CacheReaderNode

// MARK: - Init and Deinit

Expand All @@ -45,7 +45,7 @@ open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
/// - Parameters:
/// - cacheReaderNode: Следующий узел для обработки.
/// - next: Узел для чтения из кэша.
mrandrewsmith marked this conversation as resolved.
Show resolved Hide resolved
public init(cacheReaderNode: CacheReaderNode, next: NextProcessorNode) {
public init(cacheReaderNode: any CacheReaderNode, next: any NextProcessorNode) {
self.cacheReaderNode = cacheReaderNode
self.next = next
}
Expand All @@ -56,7 +56,7 @@ open class FirstCachePolicyNode: Node<RawUrlRequest, Json> {
/// а затем, передает управление следующему узлу.
/// В случае, если получить `URLRequest` не удалось,
/// то управление просто передается следующему узлу
open override func process(_ data: RawUrlRequest) -> Context<Json> {
open func process(_ data: RawUrlRequest) -> Observer<Json> {
let result = Context<Json>()

if let request = data.toUrlRequest() {
Expand Down
10 changes: 5 additions & 5 deletions NodeKit/CacheNode/IfServerFailsFromCacheNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,27 @@ import Foundation

/// Узел реализует политику кэширования "Если интернета нет, то запросить данные из кэша"
/// Этот узел работает с URL кэшом.
open class IfConnectionFailedFromCacheNode: Node<URLRequest, Json> {
open class IfConnectionFailedFromCacheNode: Node {

/// Следующий узел для обработки.
public var next: Node<URLRequest, Json>
public var next: any Node<URLRequest, Json>
/// Узел, считывающий данные из URL кэша.
public var cacheReaderNode: Node<UrlNetworkRequest, Json>
public var cacheReaderNode: any Node<UrlNetworkRequest, Json>

/// Инициаллизирует узел.
///
/// - Parameters:
/// - next: Следующий узел для обработки.
/// - cacheReaderNode: Узел, считывающий данные из URL кэша.
public init(next: Node<URLRequest, Json>, cacheReaderNode: Node<UrlNetworkRequest, Json>) {
public init(next: any Node<URLRequest, Json>, cacheReaderNode: any Node<UrlNetworkRequest, Json>) {
self.next = next
self.cacheReaderNode = cacheReaderNode
}

/// Проверяет, произошла ли ошибка связи в ответ на запрос.
/// Если ошибка произошла, то возвращает успешный ответ из кэша.
/// В противном случае передает управление следующему узлу.
open override func process(_ data: URLRequest) -> Observer<Json> {
open func process(_ data: URLRequest) -> Observer<Json> {

return self.next.process(data).mapError { error -> Observer<Json> in
var logMessage = self.logViewObjectName
Expand Down
5 changes: 2 additions & 3 deletions NodeKit/CacheNode/UrlCacheReaderNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ public enum BaseUrlCacheReaderError: Error {

/// Этот узел отвечает за чтение данных из URL кэша.
/// Сам по себе узел является листом и не может быть встроен в сквозную цепочку.
open class UrlCacheReaderNode: Node<UrlNetworkRequest, Json> {

open class UrlCacheReaderNode: Node {
chausovSurfStudio marked this conversation as resolved.
Show resolved Hide resolved

public var needsToThrowError: Bool

Expand All @@ -31,7 +30,7 @@ open class UrlCacheReaderNode: Node<UrlNetworkRequest, Json> {
}

/// Посылает запрос в кэш и пытается сериализовать данные в JSON.
open override func process(_ data: UrlNetworkRequest) -> Context<Json> {
open func process(_ data: UrlNetworkRequest) -> Observer<Json> {

guard let cachedResponse = self.extractCachedUrlResponse(data.urlRequest) else {
return self.needsToThrowError ? .emit(error: BaseUrlCacheReaderError.cantLoadDataFromCache) : Context<Json>()
Expand Down
4 changes: 2 additions & 2 deletions NodeKit/CacheNode/UrlCacheWriterNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ import Foundation
/// - Important: это "глупая" реализация,
/// в которой не учитываются server-side политики и прочее.
/// Подразумечается, что этот узел не входит в цепочку, а является листом одного из узлов.
open class UrlCacheWriterNode: Node<UrlProcessedResponse, Void> {
open class UrlCacheWriterNode: Node {

/// Формирует `CachedURLResponse` с политикой `.allowed`, сохраняет его в кэш,
/// а затем возвращает сообщение об успешной операции.
open override func process(_ data: UrlProcessedResponse) -> Context<Void> {
open func process(_ data: UrlProcessedResponse) -> Observer<Void> {
let cahced = CachedURLResponse(response: data.response, data: data.data, storagePolicy: .allowed)
URLCache.shared.storeCachedResponse(cahced, for: data.request)
return Context<Void>().emit(data: ())
Expand Down
12 changes: 6 additions & 6 deletions NodeKit/CacheNode/UrlNotModifiedTriggerNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ import Foundation

/// Этот узел проверяет код ответа от сервера и в случае, если код равен 304 (NotModified)
/// Узел посылает запрос в URL кэш.
open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {
open class UrlNotModifiedTriggerNode: Node {

// MARK: - Properties

/// Следующий узел для обратки.
public var next: ResponseProcessingLayerNode
public var next: any ResponseProcessingLayerNode

/// Узел для чтения данных из кэша.
public var cacheReader: Node<UrlNetworkRequest, Json>
public var cacheReader: any Node<UrlNetworkRequest, Json>

// MARK: - Init and deinit

Expand All @@ -27,8 +27,8 @@ open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {
/// - Parameters:
/// - next: Следующий узел для обратки.
/// - cacheReader: Узел для чтения данных из кэша.
public init(next: ResponseProcessingLayerNode,
cacheReader: Node<UrlNetworkRequest, Json>) {
public init(next: some ResponseProcessingLayerNode,
cacheReader: some Node<UrlNetworkRequest, Json>) {
self.next = next
self.cacheReader = cacheReader
}
Expand All @@ -37,7 +37,7 @@ open class UrlNotModifiedTriggerNode: ResponseProcessingLayerNode {

/// Проверяет http status-code. Если код соовуетствует NotModified, то возвращает запрос из кэша.
/// В протвином случае передает управление дальше.
open override func process(_ data: UrlDataResponse) -> Observer<Json> {
open func process(_ data: UrlDataResponse) -> Observer<Json> {

var logMessage = self.logViewObjectName
chausovSurfStudio marked this conversation as resolved.
Show resolved Hide resolved

Expand Down
Loading
Loading