/
Invoke.swift
88 lines (73 loc) · 2.34 KB
/
Invoke.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
import Foundation
import UIKit
let CHANNEL_PREFIX = "__CHANNEL__:"
@objc public class Invoke: NSObject, JSValueContainer, BridgedJSValueContainer {
public var dictionaryRepresentation: NSDictionary {
return data as NSDictionary
}
public static var jsDateFormatter: ISO8601DateFormatter = {
return ISO8601DateFormatter()
}()
public var command: String
var callback: UInt64
var error: UInt64
public var data: JSObject
var sendResponse: (UInt64, JsonValue?) -> Void
public init(command: String, callback: UInt64, error: UInt64, sendResponse: @escaping (UInt64, JsonValue?) -> Void, data: JSObject?) {
self.command = command
self.callback = callback
self.error = error
self.data = data ?? [:]
self.sendResponse = sendResponse
}
public func resolve() {
sendResponse(callback, nil)
}
public func resolve(_ data: JsonObject) {
resolve(.dictionary(data))
}
public func resolve(_ data: JsonValue) {
sendResponse(callback, data)
}
public func reject(_ message: String, _ code: String? = nil, _ error: Error? = nil, _ data: JsonValue? = nil) {
let payload: NSMutableDictionary = ["message": message, "code": code ?? "", "error": error ?? ""]
if let data = data {
switch data {
case .dictionary(let dict):
for entry in dict {
payload[entry.key] = entry.value
}
}
}
sendResponse(self.error, .dictionary(payload as! JsonObject))
}
public func unimplemented() {
unimplemented("not implemented")
}
public func unimplemented(_ message: String) {
sendResponse(error, .dictionary(["message": message]))
}
public func unavailable() {
unavailable("not available")
}
public func unavailable(_ message: String) {
sendResponse(error, .dictionary(["message": message]))
}
public func getChannel(_ key: String) -> Channel? {
let channelDef = getString(key, "")
if channelDef.starts(with: CHANNEL_PREFIX) {
let index = channelDef.index(channelDef.startIndex, offsetBy: CHANNEL_PREFIX.count)
guard let callback = UInt64(channelDef[index...]) else {
return nil
}
return Channel(callback: callback, handler: { (res: JsonValue) -> Void in
self.sendResponse(callback, res)
})
} else {
return nil
}
}
}