Added logging for js modules, and for modules(adding/removing)

This commit is contained in:
Seiike 2025-01-20 02:17:03 +01:00
parent 9eab39a3bc
commit 292c5ca770
3 changed files with 37 additions and 27 deletions

View file

@ -17,45 +17,52 @@ class JSController: ObservableObject {
private func setupContext() { private func setupContext() {
let logFunction: @convention(block) (String) -> Void = { message in let logFunction: @convention(block) (String) -> Void = { message in
Logger.shared.log("JavaScript log: \(message)") Logger.shared.log("JavaScript log: \(message)", level: .info)
} }
context.setObject(logFunction, forKeyedSubscript: "log" as NSString) context.setObject(logFunction, forKeyedSubscript: "log" as NSString)
// Override console.log
let consoleLogOverride = """
var console = {
log: function() {
var message = Array.from(arguments).map(String).join(" ");
log(message);
}
};
"""
context.evaluateScript(consoleLogOverride)
// Add other JavaScript functions like fetchNative
let fetchNativeFunction: @convention(block) (String, JSValue, JSValue) -> Void = { urlString, resolve, reject in let fetchNativeFunction: @convention(block) (String, JSValue, JSValue) -> Void = { urlString, resolve, reject in
guard let url = URL(string: urlString) else { guard let url = URL(string: urlString) else {
Logger.shared.log("Invalid URL") Logger.shared.log("Invalid URL", level: .error)
reject.call(withArguments: ["Invalid URL"]) reject.call(withArguments: ["Invalid URL"])
return return
} }
let task = URLSession.custom.dataTask(with: url) { data, _, error in let task = URLSession.shared.dataTask(with: url) { data, _, error in
if let error = error { if let error = error {
Logger.shared.log("Network error in fetchNativeFunction: \(error.localizedDescription)") Logger.shared.log("Network error in fetchNative: \(error.localizedDescription)", level: .error)
reject.call(withArguments: [error.localizedDescription]) reject.call(withArguments: [error.localizedDescription])
return return
} }
guard let data = data else { guard let data = data, let text = String(data: data, encoding: .utf8) else {
Logger.shared.log("No data in response") Logger.shared.log("Failed to decode response data", level: .error)
reject.call(withArguments: ["No data"]) reject.call(withArguments: ["Failed to decode response data"])
return return
} }
if let text = String(data: data, encoding: .utf8) { resolve.call(withArguments: [text])
resolve.call(withArguments: [text])
} else {
Logger.shared.log("Unable to decode data to text")
reject.call(withArguments: ["Unable to decode data"])
}
} }
task.resume() task.resume()
} }
context.setObject(fetchNativeFunction, forKeyedSubscript: "fetchNative" as NSString) context.setObject(fetchNativeFunction, forKeyedSubscript: "fetchNative" as NSString)
let fetchDefinition = """ let fetchDefinition = """
function fetch(url) { function fetch(url) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
fetchNative(url, resolve, reject); fetchNative(url, resolve, reject);
}); });
} }
""" """
context.evaluateScript(fetchDefinition) context.evaluateScript(fetchDefinition)
} }
@ -182,6 +189,7 @@ class JSController: ObservableObject {
if let parseFunction = self.context.objectForKeyedSubscript("extractStreamUrl"), if let parseFunction = self.context.objectForKeyedSubscript("extractStreamUrl"),
let streamUrl = parseFunction.call(withArguments: [html]).toString() { let streamUrl = parseFunction.call(withArguments: [html]).toString() {
Logger.shared.log("Staring stream from: \(streamUrl)", level: .info)
DispatchQueue.main.async { DispatchQueue.main.async {
completion(streamUrl) completion(streamUrl)
} }
@ -230,13 +238,13 @@ class JSController: ObservableObject {
} }
} else { } else {
Logger.shared.log("Failed to parse JSON") Logger.shared.log("Failed to parse JSON", level: .error)
DispatchQueue.main.async { DispatchQueue.main.async {
completion([]) completion([])
} }
} }
} catch { } catch {
Logger.shared.log("JSON parsing error: \(error)") Logger.shared.log("JSON parsing error: \(error)", level: .error)
DispatchQueue.main.async { DispatchQueue.main.async {
completion([]) completion([])
} }

View file

@ -35,7 +35,7 @@ class Logger {
let dateFormatter = DateFormatter() let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
return logs.map { "[\(dateFormatter.string(from: $0.timestamp))] [\($0.level.rawValue)] \($0.message)" } return logs.map { "[\(dateFormatter.string(from: $0.timestamp))] [\($0.level.rawValue)] \($0.message)" }
.joined(separator: "\n---\n") .joined(separator: "\n----------------------------------------------------------\n")
} }
func clearLogs() { func clearLogs() {
@ -82,4 +82,4 @@ class Logger {
} }
} }
} }
} }

View file

@ -103,19 +103,21 @@ class ModuleManager: ObservableObject {
DispatchQueue.main.async { DispatchQueue.main.async {
self.modules.append(module) self.modules.append(module)
self.saveModules() self.saveModules()
Logger.shared.log("Added module: \(module.metadata.sourceName)")
} }
return module return module
} }
func deleteModule(_ module: ScrapingModule) { func deleteModule(_ module: ScrapingModule) {
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath) let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
try? fileManager.removeItem(at: localUrl) try? fileManager.removeItem(at: localUrl)
modules.removeAll { $0.id == module.id } modules.removeAll { $0.id == module.id }
saveModules() saveModules()
Logger.shared.log("Deleted module: \(module.metadata.sourceName)")
} }
func getModuleContent(_ module: ScrapingModule) throws -> String { func getModuleContent(_ module: ScrapingModule) throws -> String {
let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath) let localUrl = getDocumentsDirectory().appendingPathComponent(module.localPath)
return try String(contentsOf: localUrl, encoding: .utf8) return try String(contentsOf: localUrl, encoding: .utf8)