From 956bcb66ef54d7098ce825fb8055dd10b5d4b1f5 Mon Sep 17 00:00:00 2001 From: Jonathan Buchanan Date: Wed, 28 Jul 2021 02:51:57 -0400 Subject: download taler-wallet-embedded.js in build and init backend --- Taler/WalletBackend.swift | 130 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 Taler/WalletBackend.swift (limited to 'Taler/WalletBackend.swift') diff --git a/Taler/WalletBackend.swift b/Taler/WalletBackend.swift new file mode 100644 index 0000000..5a28371 --- /dev/null +++ b/Taler/WalletBackend.swift @@ -0,0 +1,130 @@ +/* + * This file is part of GNU Taler + * (C) 2021 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see + */ + +import Foundation +import iono + +protocol WalletBackendRequest { + associatedtype Args: Encodable + + func operation() -> String + func args() -> Args +} + +fileprivate struct WalletBackendRequestData: Encodable { + var operation: String + var id: Int + var args: T.Args + + init(request: T, id: Int) { + operation = request.operation() + self.id = id + args = request.args() + } +} + +fileprivate struct WalletBackendInitRequest: WalletBackendRequest { + struct RequestArgs: Encodable { + var persistentStoragePath: String + } + typealias Args = RequestArgs + private var requestArgs: RequestArgs + + init(persistentStoragePath: String) { + requestArgs = RequestArgs(persistentStoragePath: persistentStoragePath) + } + + func operation() -> String { + return "init" + } + + func args() -> Args { + return requestArgs + } +} + +fileprivate struct WalletBackendGetTransactionsRequest: WalletBackendRequest { + struct RequestArgs: Encodable { + + } + typealias Args = RequestArgs + private var requestArgs: RequestArgs + + init() { + requestArgs = RequestArgs() + } + + func operation() -> String { + return "getTransactions" + } + + func args() -> Args { + return requestArgs + } +} + +enum WalletBackendError: Error { + case serializationError +} + +class WalletBackend: IonoMessageHandler { + private var iono: Iono + private var requestsMade: Int + + init() { + iono = Iono() + requestsMade = 0 + + iono.messageHandler = self + + let js_path = URL(fileURLWithPath: Bundle.main.path(forResource: "taler-wallet-embedded", ofType: "js")!) + do { + let js = try String(contentsOf: js_path, encoding: .utf8) + iono.putModuleCode(modName: "@gnu-taler/taler-wallet-embedded", code: js) + iono.evalNodeCode(source: "require('iono');") + iono.evalNodeCode(source: "tw = require('@gnu-taler/taler-wallet-embedded');") + iono.evalNodeCode(source: "tw.installNativeWalletListener();") + } catch { + + } + + // Send the init message + let documentUrls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) + if (documentUrls.count > 0) { + var storageDir = documentUrls[0] + storageDir.appendPathComponent("talerwalletdb-v30", isDirectory: false) + storageDir.appendPathExtension("json") + try! sendRequest(request: WalletBackendInitRequest(persistentStoragePath: storageDir.path)) + } + //try! sendRequest(request: WalletBackendGetTransactionsRequest()) + } + + func handleMessage(message: String) { + print("received message \(message)") + } + + func sendRequest(request: T) throws { + let data = WalletBackendRequestData(request: request, id: requestsMade) + requestsMade += 1 + do { + let encoded = try JSONEncoder().encode(data) + guard let jsonString = String(data: encoded, encoding: .utf8) else { throw WalletBackendError.serializationError } + iono.sendMessage(message: jsonString) + } catch { + throw WalletBackendError.serializationError + } + } +} -- cgit v1.2.3