summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-embedded/test-embedded.cjs
blob: bc5bf908668c1e5a03945fa6c368b22cf9ccd1a0 (plain)
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
/*
 This file is part of GNU Taler
 (C) 2022 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 <http://www.gnu.org/licenses/>
 */

// This file demonstrates how to use the single-file embedded wallet.

// Load the embedded wallet
const embedded = require("./dist/taler-wallet-embedded.cjs");

// Some bookkeeping to correlate requests to responses.
const requestMap = {};
let requestCounter = 1;

// Install __native_onMessage in the global namespace.
// The __native_onMessage handles messages from the host,
// i.e. it handles wallet-core requests from the host application (UI etc.).
embedded.installNativeWalletListener();

// The host application must the __native_sendMessage callback
// to allow wallet-core to respond.
globalThis.__native_sendMessage = (msgStr) => {
  const message = JSON.parse(msgStr);
  if (message.type === "notification") {
    console.log("got notification:", JSON.stringify(message.payload));
    return;
  }
  if (message.type === "response") {
    console.log("got response", JSON.parse(msgStr));
    const msgId = message.id;
    requestMap[msgId](message);
    delete requestMap[msgId];
    return;
  }
  throw Error("not reached");
};

async function makeRequest(operation, payload = {}) {
  return new Promise((resolve, reject) => {
    const reqId = `req-${requestCounter++}`;
    requestMap[reqId] = (x) => resolve(x);
    __native_onMessage(
      JSON.stringify({
        operation,
        args: payload,
        id: reqId,
      }),
    );
  });
}

async function testMain() {
  const resp = await makeRequest("init");
  console.log("response from init", JSON.stringify(resp));
}

testMain();