|
- //
- // MessageChannelPlugin.swift
- // webview_universal
- //
- // Created by Bin Yang on 2021/11/19.
- //
-
- import FlutterMacOS
- import Foundation
-
- public class ClientMessageChannelPlugin: NSObject, FlutterPlugin {
- public init(methodChannel: FlutterMethodChannel) {
- self.methodChannel = methodChannel
- super.init()
- }
-
- public static func register(with registrar: FlutterPluginRegistrar) {
- let channel = FlutterMethodChannel(name: "webview_message/client_channel", binaryMessenger: registrar.messenger)
- let instance = ClientMessageChannelPlugin(methodChannel: channel)
- registrar.addMethodCallDelegate(instance, channel: channel)
- ServerMessageChannel.shared.addClient(client: instance)
- }
-
- private let methodChannel: FlutterMethodChannel
-
- public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
- ServerMessageChannel.shared.dispatchMethodCall(call: call, from: self)
- // this is a boardcast, so we complete this with sucess.
- result(nil)
- }
-
- fileprivate func invokeMethod(_ call: FlutterMethodCall) {
- methodChannel.invokeMethod(call.method, arguments: call.arguments)
- }
- }
-
- class ServerMessageChannel {
- static let shared: ServerMessageChannel = ServerMessageChannel()
-
- private var clients: [ClientMessageChannelPlugin] = []
-
- func addClient(client: ClientMessageChannelPlugin) {
- clients.append(client)
- }
-
- func removeClient(client: ClientMessageChannelPlugin) {
- if let index = clients.firstIndex(of: client) {
- clients.remove(at: index)
- }
- }
-
- func dispatchMethodCall(call: FlutterMethodCall, from clientFrom: ClientMessageChannelPlugin) {
- for client in clients {
- if client != clientFrom {
- client.invokeMethod(call)
- }
- }
- }
- }
|