Allow getStoriesById to fail in state resolution

This commit is contained in:
Ali
2023-07-27 21:57:47 +04:00
parent f3dd75276d
commit 2f73692d65
4 changed files with 40 additions and 27 deletions

View File

@@ -295,7 +295,7 @@ class Download: NSObject, MTRequestMessageServiceDelegate {
|> retryRequest
}
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), expectedResponseSize: Int32? = nil) -> Signal<T, MTRpcError> {
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), expectedResponseSize: Int32? = nil, automaticFloodWait: Bool = true) -> Signal<T, MTRpcError> {
return Signal { subscriber in
let request = MTRequest()
request.expectedResponseSize = expectedResponseSize ?? 0
@@ -311,6 +311,12 @@ class Download: NSObject, MTRequestMessageServiceDelegate {
request.needsTimeoutTimer = self.useRequestTimeoutTimers
request.shouldContinueExecutionWithErrorContext = { errorContext in
guard let errorContext = errorContext else {
return true
}
if errorContext.floodWaitSeconds > 0 && !automaticFloodWait {
return false
}
return true
}

View File

@@ -2100,8 +2100,9 @@ func resolveStories<T>(postbox: Postbox, source: FetchMessageHistoryHoleSource,
while idOffset < allIds.count {
let bucketLength = min(100, allIds.count - idOffset)
let ids = Array(allIds[idOffset ..< (idOffset + bucketLength)])
signals.append(_internal_getStoriesById(accountPeerId: accountPeerId, postbox: postbox, source: source, peerId: peerId, peerReference: additionalPeers.get(peerId).flatMap(PeerReference.init), ids: ids)
signals.append(_internal_getStoriesById(accountPeerId: accountPeerId, postbox: postbox, source: source, peerId: peerId, peerReference: additionalPeers.get(peerId).flatMap(PeerReference.init), ids: ids, allowFloodWait: false)
|> mapToSignal { result -> Signal<Never, NoError> in
if let result = result {
return postbox.transaction { transaction -> Void in
for id in ids {
let current = transaction.getStory(id: StoryId(peerId: peerId, id: id))
@@ -2119,6 +2120,9 @@ func resolveStories<T>(postbox: Postbox, source: FetchMessageHistoryHoleSource,
}
}
|> ignoreValues
} else {
return .complete()
}
})
idOffset += bucketLength
}

View File

@@ -108,12 +108,12 @@ enum FetchMessageHistoryHoleSource {
case network(Network)
case download(Download)
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>)) -> Signal<T, MTRpcError> {
func request<T>(_ data: (FunctionDescription, Buffer, DeserializeFunctionResponse<T>), automaticFloodWait: Bool = true) -> Signal<T, MTRpcError> {
switch self {
case let .network(network):
return network.request(data)
return network.request(data, automaticFloodWait: automaticFloodWait)
case let .download(download):
return download.request(data)
return download.request(data, automaticFloodWait: automaticFloodWait)
}
}
}

View File

@@ -1435,25 +1435,25 @@ func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, network:
}
}
func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, source: FetchMessageHistoryHoleSource, peerId: PeerId, peerReference: PeerReference?, ids: [Int32]) -> Signal<[Stories.StoredItem], NoError> {
func _internal_getStoriesById(accountPeerId: PeerId, postbox: Postbox, source: FetchMessageHistoryHoleSource, peerId: PeerId, peerReference: PeerReference?, ids: [Int32], allowFloodWait: Bool) -> Signal<[Stories.StoredItem]?, NoError> {
return postbox.transaction { transaction -> Api.InputUser? in
return transaction.getPeer(peerId).flatMap(apiInputUser)
}
|> mapToSignal { inputUser -> Signal<[Stories.StoredItem], NoError> in
|> mapToSignal { inputUser -> Signal<[Stories.StoredItem]?, NoError> in
guard let inputUser = inputUser ?? peerReference?.inputUser else {
return .single([])
}
return source.request(Api.functions.stories.getStoriesByID(userId: inputUser, id: ids))
return source.request(Api.functions.stories.getStoriesByID(userId: inputUser, id: ids), automaticFloodWait: allowFloodWait)
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.stories.Stories?, NoError> in
return .single(nil)
}
|> mapToSignal { result -> Signal<[Stories.StoredItem], NoError> in
|> mapToSignal { result -> Signal<[Stories.StoredItem]?, NoError> in
guard let result = result else {
return .single([])
return .single(nil)
}
return postbox.transaction { transaction -> [Stories.StoredItem] in
return postbox.transaction { transaction -> [Stories.StoredItem]? in
switch result {
case let .stories(_, stories, users):
updatePeers(transaction: transaction, accountPeerId: accountPeerId, peers: AccumulatedPeers(users: users))
@@ -1904,8 +1904,11 @@ func _internal_exportStoryLink(account: Account, peerId: EnginePeer.Id, id: Int3
}
func _internal_refreshStories(account: Account, peerId: PeerId, ids: [Int32]) -> Signal<Never, NoError> {
return _internal_getStoriesById(accountPeerId: account.peerId, postbox: account.postbox, source: .network(account.network), peerId: peerId, peerReference: nil, ids: ids)
return _internal_getStoriesById(accountPeerId: account.peerId, postbox: account.postbox, source: .network(account.network), peerId: peerId, peerReference: nil, ids: ids, allowFloodWait: true)
|> mapToSignal { result -> Signal<Never, NoError> in
guard let result = result else {
return .complete()
}
return account.postbox.transaction { transaction -> Void in
var currentItems = transaction.getStoryItems(peerId: peerId)
for i in 0 ..< currentItems.count {