From 1e9b1520e1207b7e630c23ff5eaa1649169b6057 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 29 Mar 2021 15:41:08 +1100 Subject: [PATCH] Fix auth token handling --- .../Open Groups/V2/OpenGroupAPIV2.swift | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift index 9f544a5b1..9875ef73a 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift @@ -6,6 +6,7 @@ import SessionSnodeKit @objc(SNOpenGroupAPIV2) public final class OpenGroupAPIV2 : NSObject { private static var moderators: [String:[String:Set]] = [:] // Server URL to room ID to set of moderator IDs + private static var requestNewAuthTokenPromise: Promise? public static let defaultServer = "https://sessionopengroup.com" public static let defaultServerPublicKey = "658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231b" public static var getDefaultRoomsPromise: Promise<[Info]>? @@ -124,15 +125,26 @@ public final class OpenGroupAPIV2 : NSObject { if let authToken = storage.getAuthToken(for: room, on: server) { return Promise.value(authToken) } else { - return requestNewAuthToken(for: room, on: server) - .then(on: DispatchQueue.global(qos: .userInitiated)) { claimAuthToken($0, for: room, on: server) } - .then(on: DispatchQueue.global(qos: .userInitiated)) { authToken -> Promise in - let (promise, seal) = Promise.pending() - storage.write(with: { transaction in - storage.setAuthToken(for: room, on: server, to: authToken, using: transaction) - }, completion: { - seal.fulfill(authToken) - }) + if let requestNewAuthTokenPromise = requestNewAuthTokenPromise { + return requestNewAuthTokenPromise + } else { + let promise = requestNewAuthToken(for: room, on: server) + .then(on: DispatchQueue.global(qos: .userInitiated)) { claimAuthToken($0, for: room, on: server) } + .then(on: DispatchQueue.global(qos: .userInitiated)) { authToken -> Promise in + let (promise, seal) = Promise.pending() + storage.write(with: { transaction in + storage.setAuthToken(for: room, on: server, to: authToken, using: transaction) + }, completion: { + seal.fulfill(authToken) + }) + return promise + } + promise.done(on: DispatchQueue.global(qos: .userInitiated)) { _ in + requestNewAuthTokenPromise = nil + }.catch(on: DispatchQueue.global(qos: .userInitiated)) { _ in + requestNewAuthTokenPromise = nil + } + requestNewAuthTokenPromise = promise return promise } }