summaryrefslogtreecommitdiff
path: root/dev-wallet-wx.rst
blob: 5790f8012f624bac303383d3ccda2ee0e1b50142 (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
=====================
WebExtensions Wallet
=====================

------------
Introduction
------------

The WebExtensions Wallet (*wxwallet*) can be used to pay with GNU Taler on web
sites from within modern web browsers.  The `WebExtensions
<https://wiki.mozilla.org/WebExtensions>`_ API interface that enables the
development cross-browser extensions.  Google Chrome / Chromium, Mozilla
Firefox, Opera and Microsoft Edge will all offer support for WebExtensions in
the future.

Currently Chrome hast the best support for WebExtensions (since the API is a superset
of Chrome's extension API).

-----------------------
Development Environment
-----------------------

The *wxwallet* mainly written in the `TypeScript
<http://www.typescriptlang.org/>`_ language, which is a statically typed
superset of JavaScript.

While the *wxwallet* is mainly intended to be run from inside a browser, the
logic is implemented in browser-independent modules that can also be called
from other environments such as `nodejs <https://nodejs.org>`_.  This is
especially useful for automatically running unit tests.


-----------------
Project Structure
-----------------

.. parsed-literal::
  
  **manifest.json**               extension configuration
  **package.json**                node.js package configuration
  **tsconfig.json**               TypeScript compiler configuration
  **lib/**
      **vendor/**                 3rd party libraries
      **wallet/**                 actual application logic
      **emscripten/**             emscripten object file and glue
  **test/**
       **run_tests.js**           nodejs entry point for tests
       **tests/**                 test cases
  **content_scripts/notify.ts**   wallet<->website signaling
  **backgrond/main.ts**           backend entry point
  **img/**                        static image resources
  **style/**                      CSS stylesheets
  **pages/**                      pages shown in browser tabs
  **popup/**                      pages shown the extension popup

----------
Emscripten
----------

`Emscripten <https://kripken.github.io/emscripten-site/index.html>`_ is C/C++
to JavaScript compiler.  Emscripten is used in the *wxwallet* to access
low-level cryptography from *libgcrypt*, and miscellaneous functionality from
*libgnunetutil* and *libtalerwallet*.


--------------------------------------
Target Environments and Modularization
--------------------------------------

Modules in the wallet are declared in TypeScript with
the ES6 module syntax.  These modules are then compiled
to `SystemJS <https://github.com/systemjs/systemjs>`_ `register` modules.

SystemJS modules can be loaded from the browser as well as from nodejs.
However they require special entry points that configure the module system,
load modules and execute code.  Examples are `backgrond/main.ts` for the
browser and `test/run_tests.js` for nodejs.

Note that special care has to be taken when loading the Emscript code,
as it is not compatible with the SystemJS module, even in the `globals`
compatibility mode.

The TypeScript sources in the *wxwallet* are compiled down to ES5, both to
enable running in node.js without transpilers and to avoid a `bug
<https://github.com/Microsoft/TypeScript/issues/6426>`_ in the TypeScript
compiler.

----------------------------
IndexedDB Query Abstractions
----------------------------

The *wxwallet* uses a fluent-style API for queries on IndexedDB.

TODO: say more