JavaScriptWorker.swift 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // JavaScriptWorker.swift
  3. // FreeAPS
  4. //
  5. // Created by Ivan Valkou on 29.01.2021.
  6. //
  7. import Foundation
  8. import JavaScriptCore
  9. final class JavaScriptWorker {
  10. private let processQueue = DispatchQueue(label: "DispatchQueue.JavaScriptWorker")
  11. private let virtualMachine: JSVirtualMachine
  12. private let context: JSContext
  13. init() {
  14. virtualMachine = processQueue.sync { JSVirtualMachine()! }
  15. context = JSContext(virtualMachine: virtualMachine)!
  16. context.exceptionHandler = { _, exception in
  17. if let error = exception?.toString() {
  18. print(error)
  19. }
  20. }
  21. }
  22. // lazy var require: @convention(block) (String) -> (JSValue?) = { path in
  23. // return nil
  24. // }
  25. @discardableResult
  26. func evaluate(script: Script) -> JSValue! {
  27. context.evaluateScript(script.body)
  28. }
  29. @discardableResult
  30. func evaluate(string: String) -> JSValue! {
  31. context.evaluateScript(string)
  32. }
  33. subscript(key: String) -> JSValue! {
  34. context.objectForKeyedSubscript(key)
  35. }
  36. func json(for string: String) -> JSON {
  37. evaluate(string: "JSON.stringify(\(string));")!.toString()!
  38. }
  39. func call(function: String, with arguments: [JSON]) -> JSON {
  40. let joined = arguments.map(\.string).joined(separator: ",")
  41. return json(for: "\(function)(\(joined))")
  42. }
  43. func setEnviromentValue(_ value: JSON, forKey key: String) {
  44. evaluate(string: "freeaps.\(key) = \(value.string);")
  45. }
  46. var log: String {
  47. context.objectForKeyedSubscript("freeaps")!.objectForKeyedSubscript("log")!.toString()!
  48. }
  49. }