This commit is contained in:
Max Goedjen
2025-09-06 18:01:57 -07:00
parent 2efba1bc21
commit be28d59873
5 changed files with 76 additions and 58 deletions

View File

@@ -1,27 +0,0 @@
import Foundation
import Brief
final class ReleasesDownloader: NSObject, ReleasesDownloaderProtocol {
@objc func downloadReleases(with reply: @escaping (Data?, (any Error)?) -> Void) {
Task {
do {
let (data, _) = try await URLSession.shared.data(from: Constants.updateURL)
let releases = try JSONDecoder().decode([Release].self, from: data)
print(releases)
let jsonOut = try JSONEncoder().encode(releases)
reply(jsonOut, nil)
} catch {
reply(nil, error)
}
}
}
}
extension ReleasesDownloader {
enum Constants {
static let updateURL = URL(string: "https://api.github.com/repos/maxgoedjen/secretive/releases")!
}
}

View File

@@ -1,18 +1,44 @@
import Foundation
import XPC
import OSLog
import Brief
class ServiceDelegate: NSObject, NSXPCListenerDelegate {
func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
newConnection.exportedInterface = NSXPCInterface(with: (any ReleasesDownloaderProtocol).self)
let exportedObject = ReleasesDownloader()
newConnection.exportedObject = exportedObject
newConnection.resume()
return true
private let logger = Logger(subsystem: "com.maxgoedjen.secretive.ReleasesDownloader", category: "ReleasesDownloader")
enum Constants {
static let updateURL = URL(string: "https://api.github.com/repos/maxgoedjen/secretive/releases")!
}
func handleRequest(_ request: XPCListener.IncomingSessionRequest) -> XPCListener.IncomingSessionRequest.Decision {
logger.log("ReleasesDownloader received inbound request")
return request.accept { xpcDictionary in
xpcDictionary.handoffReply(to: .global(qos: .userInteractive)) {
logger.log("ReleasesDownloader accepted inbound request")
Task {
do {
let (data, _) = try await URLSession.shared.data(from: Constants.updateURL)
let releases = try JSONDecoder().decode([Release].self, from: data)
xpcDictionary.reply(releases)
} catch {
logger.error("ReleasesDownloader failed with unknown error \(error)")
xpcDictionary.reply([] as [Release])
}
}
}
}
}
let delegate = ServiceDelegate()
let listener = NSXPCListener.service()
listener.delegate = delegate
listener.resume()
do {
if #available(macOS 26.0, *) {
_ = try XPCListener(
service: "com.maxgoedjen.Secretive.ReleasesDownloader",
requirement: .isFromSameTeam(),
incomingSessionHandler: handleRequest(_:)
)
} else {
_ = try XPCListener(service: "com.maxgoedjen.Secretive.ReleasesDownloader", incomingSessionHandler: handleRequest(_:))
}
logger.log("ReleasesDownloader initialized")
dispatchMain()
} catch {
logger.error("Failed to create ReleasesDownloader, error: \(error)")
}