-
Notifications
You must be signed in to change notification settings - Fork 1
/
Plugin.swift
50 lines (32 loc) · 1.42 KB
/
Plugin.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//
// Read more at https://jjv360.me/programming/javascript-in-swift
import Foundation
import JavaScriptCore
public class Plugin {
var ctx : JSContext!
public var onmessage : ((_ data : Any?) -> Void)?
public init(file : URL) {
// Create Javascript context
ctx = JSContext()
ctx.name = "My Javascript Context"
// Create postMessage code block that will get exposed to Javascript as a function
let postMessageBlock : @convention(block) (AnyObject?) -> Void = { [weak self] (data) in
// Pass message to host app
self?.onmessage?(data)
}
// Expose the postMessage code block as a Javascript function
ctx.globalObject.setValue(unsafeBitCast(postMessageBlock, to: AnyObject.self), forProperty: "postMessage")
// Read the Javascript code into a string
if let code = try? String(contentsOf: file, encoding: .utf8) {
// Execute the Javascript code
ctx.evaluateScript(code, withSourceURL: file)
}
}
/** Sends a message to the plugin */
public func postMessage(data : Any) {
// Find the plugin's onmessage handler
let handler = ctx.globalObject.forProperty("onmessage")
// Send message
handler?.call(withArguments: [data])
}
}