42 lines
1.0 KiB
Swift
42 lines
1.0 KiB
Swift
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
|
|
private let lockQueue = DispatchQueue(label: "expo.modules.domWebView.RegistryQueue")
|
|
|
|
internal typealias WebViewId = Int
|
|
|
|
internal final class DomWebViewRegistry {
|
|
static var shared = DomWebViewRegistry()
|
|
|
|
private var registry: [WebViewId: WeakDomWebViewRef] = [:]
|
|
private var nextWebViewId: WebViewId = 0
|
|
|
|
func get(webViewId: WebViewId) -> DomWebView? {
|
|
return lockQueue.sync {
|
|
return self.registry[webViewId]?.ref
|
|
}
|
|
}
|
|
|
|
func add(webView: DomWebView) -> WebViewId {
|
|
return lockQueue.sync {
|
|
let webViewId = self.nextWebViewId
|
|
self.registry[webViewId] = WeakDomWebViewRef(ref: webView)
|
|
self.nextWebViewId += 1
|
|
return webViewId
|
|
}
|
|
}
|
|
|
|
@discardableResult
|
|
func remove(webViewId: WebViewId) -> DomWebView? {
|
|
return lockQueue.sync {
|
|
return self.registry.removeValue(forKey: webViewId)?.ref
|
|
}
|
|
}
|
|
|
|
func reset() {
|
|
lockQueue.sync {
|
|
self.registry.removeAll()
|
|
self.nextWebViewId = 0
|
|
}
|
|
}
|
|
}
|