/* * 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 } } }