Call Javascript func from Swift, get 'undefined'

I am trying to generate RSA key pair using KEYUTIL.generateKeypair("RSA", 2048) from a JavaScript file from Swift. However, the result is undefined.

Below is the JavaScript file:

var myPublicKey = function myKeyFunction() {
  return KEYUTIL.generateKeypair("RSA", 2048);
}
var key = KEYUTIL.generateKeypair("RSA", 2048);
pm.environment.set("private_key_client", KEYUTIL.getPEM(key.prvKeyObj, "PKCS8PRV").split("\r\n").join("\n"));
pm.environment.set("public_key_client", KEYUTIL.getPEM(key.pubKeyObj).split("\r\n").join("\n"));

The Swift code I am using is:

if let jsSourcePath = Bundle.main.url(forResource: "rsakeygenerator", withExtension: "js") {
            do {
                let jsHandler = JSCommunicationHandler()
                jsHandler.loadSourceFile(atUrl: jsSourcePath)
                let result = jsHandler.evaluateJavaScript("myPublicKey")
            }
            catch {
                print(error.localizedDescription)
            }
        }

My helper class is:

class JSCommunicationHandler {
private let context = JSContext()

init() {
    context?.exceptionHandler = {context, exception in
        if let exception = exception {
            print(exception.toString()!)
        }
    }
}

func callFunction<T>(functionName:String, withData dataObject:Codable, type:T.Type) -> JSValue? where T:Codable {
    var dataString = ""
    if let string = getString(fromObject: dataObject, type:type) {
        dataString = string
    }
    let functionString = functionName + "(\(dataString))"
    let result = context?.evaluateScript(functionString)
    return result
}

func loadSourceFile(atUrl url:URL) {
    guard let stringFromUrl = try? String(contentsOf: url) else {return}
    context?.evaluateScript(stringFromUrl)
}

func evaluateJavaScript(_ jsString:String) -> JSValue? {
    context?.evaluateScript(jsString)
}

func setObject(object:Any, withName:String) {
    context?.setObject(object, forKeyedSubscript: withName as NSCopying & NSObjectProtocol)
}
}

extension JSCommunicationHandler {
    private func getString<T>(fromObject jsonObject:Codable, type:T.Type) -> String? where T:Codable {
        let encoder = JSONEncoder()
        guard let dataObject = jsonObject as? T,
            let data = try? encoder.encode(dataObject),
            let string = String(data:data, encoding:.utf8) else  {
                return nil
        }
        return string
    }
}

I am trying to generate RSA key pair using KEYUTIL.generateKeypair("RSA", 2048) from a JavaScript file from Swift. However, the result is undefined. The JavaScript file and Swift code I am using is provided below.

JS File:

var myPublicKey = function myKeyFunction() {
  return KEYUTIL.generateKeypair("RSA", 2048);
}
var key = KEYUTIL.generateKeypair("RSA", 2048);
pm.environment.set("private_key_client", KEYUTIL.getPEM(key.prvKeyObj, "PKCS8PRV").split("\r\n").join("\n"));
pm.environment.set("public_key_client", KEYUTIL.getPEM(key.pubKeyObj).split("\r\n").join("\n"));

Swift Code:

if let jsSourcePath = Bundle.main.url(forResource: "rsakeygenerator", withExtension: "js") {
            do {
                let jsHandler = JSCommunicationHandler()
                jsHandler.loadSourceFile(atUrl: jsSourcePath)
                let result = jsHandler.evaluateJavaScript("myPublicKey")
            }
            catch {
                print(error.localizedDescription)
            }
        }

Helper Class:

class JSCommunicationHandler {
private let context = JSContext()

init() {
    context?.exceptionHandler = {context, exception in
        if let exception = exception {
            print(exception.toString()!)
        }
    }
}

func callFunction<T>(functionName:String, withData dataObject:Codable, type:T.Type) -> JSValue? where T:Codable {
    var dataString = ""
    if let string = getString(fromObject: dataObject, type:type) {
        dataString = string
    }
    let functionString = functionName + "(\(dataString))"
    let result = context?.evaluateScript(functionString)
    return result
}

func loadSourceFile(atUrl url:URL) {
    guard let stringFromUrl = try? String(contentsOf: url) else {return}
    context?.evaluateScript(stringFromUrl)
}

func evaluateJavaScript(_ jsString:String) -> JSValue? {
    context?.evaluateScript(jsString)
}

func setObject(object:Any, withName:String) {
    context?.setObject(object, forKeyedSubscript: withName as NSCopying & NSObjectProtocol)
}
}

extension JSCommunicationHandler {
    private func getString<T>(fromObject jsonObject:Codable, type:T.Type) -> String? where T:Codable {
        let encoder = JSONEncoder()
        guard let dataObject = jsonObject as? T,
            let data = try? encoder.encode(dataObject),
            let string = String(data:data, encoding:.utf8) else  {
                return nil
        }
        return string
    }
}

I am trying to generate an RSA key pair from a JavaScript file using Swift. I am using the KEYUTIL.generateKeypair("RSA", 2048) function, but the result is undefined. The JavaScript file, Swift code, and helper class used are provided below.

JavaScript File:

var myPublicKey = function myKeyFunction() {
  return KEYUTIL.generateKeypair("RSA", 2048);
}
var key = KEYUTIL.generateKeypair("RSA", 2048);
pm.environment.set("private_key_client", KEYUTIL.getPEM(key.prvKeyObj, "PKCS8PRV").split("\r\n").join("\n"));
pm.environment.set("public_key_client", KEYUTIL.getPEM(key.pubKeyObj).split("\r\n").join("\n"));

Swift Code:

if let jsSourcePath = Bundle.main.url(forResource: "rsakeygenerator", withExtension: "js") {
            do {
                let jsHandler = JSCommunicationHandler()
                jsHandler.loadSourceFile(atUrl: jsSourcePath)
                let result = jsHandler.evaluateJavaScript("myPublicKey")
            }
            catch {
                print(error.localizedDescription)
            }
        }

Helper Class:

class JSCommunicationHandler {
private let context = JSContext()

init() {
    context?.exceptionHandler = {context, exception in
        if let exception = exception {
            print(exception.toString()!)
        }
    }
}

func callFunction<T>(functionName:String, withData dataObject:Codable, type:T.Type) -> JSValue? where T:Codable {
    var dataString = ""
    if let string = getString(fromObject: dataObject, type:type) {
        dataString = string
    }
    let functionString = functionName + "(\(dataString))"
    let result = context?.evaluateScript(functionString)
    return result
}

The myPublicKey function in the JavaScript file is not being called. You need to call it using jsHandler.evaluateJavaScript("myPublicKey()") instead of jsHandler.evaluateJavaScript("myPublicKey"). Update the Swift code as shown below:

if let jsSourcePath = Bundle.main.url(forResource: "rsakeygenerator", withExtension: "js") {
    do {
        let jsHandler = JSCommunicationHandler()
        jsHandler.loadSourceFile(atUrl: jsSourcePath)
        let result = jsHandler.evaluateJavaScript("myPublicKey()")
    }
    catch {
        print(error.localizedDescription)
    }
}