Plugin.swift 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. import WebKit
  5. import os.log
  6. struct RegisterListenerArgs: Decodable {
  7. let event: String
  8. let handler: Channel
  9. }
  10. struct RemoveListenerArgs: Decodable {
  11. let event: String
  12. let channelId: UInt64
  13. }
  14. open class Plugin: NSObject {
  15. public let manager: PluginManager = PluginManager.shared
  16. var config: String = "{}"
  17. private var listeners = [String: [Channel]]()
  18. internal func setConfig(_ config: String) {
  19. self.config = config
  20. }
  21. public func parseConfig<T: Decodable>(_ type: T.Type) throws -> T {
  22. let jsonData = self.config.data(using: .utf8)!
  23. let decoder = JSONDecoder()
  24. return try decoder.decode(type, from: jsonData)
  25. }
  26. @objc open func load(webview: WKWebView) {}
  27. @objc open func checkPermissions(_ invoke: Invoke) {
  28. invoke.resolve()
  29. }
  30. @objc open func requestPermissions(_ invoke: Invoke) {
  31. invoke.resolve()
  32. }
  33. public func trigger(_ event: String, data: JSObject) {
  34. if let eventListeners = listeners[event] {
  35. for channel in eventListeners {
  36. channel.send(data)
  37. }
  38. }
  39. }
  40. public func trigger<T: Encodable>(_ event: String, data: T) throws {
  41. if let eventListeners = listeners[event] {
  42. for channel in eventListeners {
  43. try channel.send(data)
  44. }
  45. }
  46. }
  47. @objc func registerListener(_ invoke: Invoke) throws {
  48. let args = try invoke.parseArgs(RegisterListenerArgs.self)
  49. if var eventListeners = listeners[args.event] {
  50. eventListeners.append(args.handler)
  51. } else {
  52. listeners[args.event] = [args.handler]
  53. }
  54. invoke.resolve()
  55. }
  56. @objc func removeListener(_ invoke: Invoke) throws {
  57. let args = try invoke.parseArgs(RemoveListenerArgs.self)
  58. if let eventListeners = listeners[args.event] {
  59. listeners[args.event] = eventListeners.filter { $0.id != args.channelId }
  60. }
  61. invoke.resolve()
  62. }
  63. }