summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-04-26 02:02:22 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-04-26 02:02:22 +0200
commit72b28c3201f2a2cdd3e88b3916f722e050895998 (patch)
tree60c2c3636743869de36029a7015cc2817c6d747c
parent22a84231b7b831d8cd92b4076456568d7d5730be (diff)
downloadweb-common-72b28c3201f2a2cdd3e88b3916f722e050895998.tar.gz
web-common-72b28c3201f2a2cdd3e88b3916f722e050895998.tar.bz2
web-common-72b28c3201f2a2cdd3e88b3916f722e050895998.zip
make taler-wallet-lib a proper module and output it in UMD format
-rw-r--r--taler-wallet-lib.js697
-rw-r--r--taler-wallet-lib.ts3
-rw-r--r--tsconfig.json1
3 files changed, 357 insertions, 344 deletions
diff --git a/taler-wallet-lib.js b/taler-wallet-lib.js
index fd2845f..2fe1c20 100644
--- a/taler-wallet-lib.js
+++ b/taler-wallet-lib.js
@@ -27,409 +27,420 @@
@author Marcello Stanisci
@author Florian Dold
*/
-var taler;
-(function (taler) {
- "use strict";
- var logVerbose = false;
- try {
- logVerbose = !!localStorage.getItem("taler-log-verbose");
+(function (factory) {
+ if (typeof module === "object" && typeof module.exports === "object") {
+ var v = factory(require, exports);
+ if (v !== undefined) module.exports = v;
}
- catch (e) {
+ else if (typeof define === "function" && define.amd) {
+ define(["require", "exports"], factory);
}
- var presentHandlers = [];
- var absentHandlers = [];
- // Are we running as the content script of an
- // extension (and not just from a normal page)?
- var runningInExtension = false;
- var callSeqId = 1;
- var installed = false;
- var probeExecuted = false;
- var pageLoaded = false;
- var errorHandler = undefined;
- var sheet;
- function onError(handler) {
- if (errorHandler) {
- console.warn("Overriding error handler");
+})(function (require, exports) {
+ "use strict";
+ var taler;
+ (function (taler) {
+ "use strict";
+ var logVerbose = false;
+ try {
+ logVerbose = !!localStorage.getItem("taler-log-verbose");
}
- errorHandler = handler;
- }
- taler.onError = onError;
- /**
- * Error handler for things that go wrong in the merchant
- * frontend browser code.
- */
- function raise_error(reason, detail) {
- if (errorHandler) {
- errorHandler(reason, detail);
- return;
+ catch (e) {
}
- alert("Failure: " + reason + ". No error handler installed. Open the developer console for more information.");
- console.error(reason, detail);
- console.warn("No custom error handler set.");
- }
- function callWallet(funcName, args, onResult) {
- var detail = JSON.parse(JSON.stringify(args || {}));
- var callId = callSeqId++;
- detail.callId = callId;
- var onTimeout = function () {
- console.warn("timeout for invocation of " + funcName);
- };
- var timeoutHandle = setTimeout(onTimeout, 1000);
- var handler = function (evt) {
- if (evt.detail.callId !== callId) {
- return;
+ var presentHandlers = [];
+ var absentHandlers = [];
+ // Are we running as the content script of an
+ // extension (and not just from a normal page)?
+ var runningInExtension = false;
+ var callSeqId = 1;
+ var installed = false;
+ var probeExecuted = false;
+ var pageLoaded = false;
+ var errorHandler = undefined;
+ var sheet;
+ function onError(handler) {
+ if (errorHandler) {
+ console.warn("Overriding error handler");
}
- if (onResult) {
- onResult(evt.detail);
+ errorHandler = handler;
+ }
+ taler.onError = onError;
+ /**
+ * Error handler for things that go wrong in the merchant
+ * frontend browser code.
+ */
+ function raise_error(reason, detail) {
+ if (errorHandler) {
+ errorHandler(reason, detail);
+ return;
}
- clearTimeout(timeoutHandle);
- document.removeEventListener(funcName + "-result", handler);
- };
- document.addEventListener(funcName + "-result", handler);
- var evt = new CustomEvent(funcName, { detail: detail });
- document.dispatchEvent(evt);
- }
- /**
- * Confirm that a reserve was created.
- *
- * Used by tightly integrated bank portals.
- */
- function confirmReserve(reservePub) {
- if (!installed) {
- logVerbose && console.log("delaying confirmReserve");
- taler.onPresent(function () {
- confirmReserve(reservePub);
- });
- return;
+ alert("Failure: " + reason + ". No error handler installed. Open the developer console for more information.");
+ console.error(reason, detail);
+ console.warn("No custom error handler set.");
}
- callWallet("taler-confirm-reserve", { reserve_pub: reservePub });
- }
- taler.confirmReserve = confirmReserve;
- function createReserve(callbackUrl, amount, wtTypes, suggestedExchangeUrl) {
- if (!installed) {
- logVerbose && console.log("delaying createReserve");
- taler.onPresent(function () {
- createReserve(callbackUrl, amount, wtTypes, suggestedExchangeUrl);
- });
- return;
+ function callWallet(funcName, args, onResult) {
+ var detail = JSON.parse(JSON.stringify(args || {}));
+ var callId = callSeqId++;
+ detail.callId = callId;
+ var onTimeout = function () {
+ console.warn("timeout for invocation of " + funcName);
+ };
+ var timeoutHandle = setTimeout(onTimeout, 1000);
+ var handler = function (evt) {
+ if (evt.detail.callId !== callId) {
+ return;
+ }
+ if (onResult) {
+ onResult(evt.detail);
+ }
+ clearTimeout(timeoutHandle);
+ document.removeEventListener(funcName + "-result", handler);
+ };
+ document.addEventListener(funcName + "-result", handler);
+ var evt = new CustomEvent(funcName, { detail: detail });
+ document.dispatchEvent(evt);
}
- var args = {
- callback_url: callbackUrl,
- amount: amount,
- wt_types: wtTypes,
- suggested_exchange_url: suggestedExchangeUrl
- };
- callWallet("taler-create-reserve", args);
- }
- taler.createReserve = createReserve;
- function handlePaymentResponse(walletResp) {
/**
- * Handle a failed payment.
+ * Confirm that a reserve was created.
*
- * Try to notify the wallet first, before we show a potentially
- * synchronous error message (such as an alert) or leave the page.
+ * Used by tightly integrated bank portals.
*/
- function handleFailedPayment(r) {
- var timeoutHandle = null;
- function err() {
- raise_error("pay-failed", { status: r.status, response: r.responseText });
- }
- function onResp() {
- if (timeoutHandle != null) {
- clearTimeout(timeoutHandle);
- timeoutHandle = null;
- }
- err();
+ function confirmReserve(reservePub) {
+ if (!installed) {
+ logVerbose && console.log("delaying confirmReserve");
+ taler.onPresent(function () {
+ confirmReserve(reservePub);
+ });
+ return;
}
- function onTimeout() {
- timeoutHandle = null;
- err();
+ callWallet("taler-confirm-reserve", { reserve_pub: reservePub });
+ }
+ taler.confirmReserve = confirmReserve;
+ function createReserve(callbackUrl, amount, wtTypes, suggestedExchangeUrl) {
+ if (!installed) {
+ logVerbose && console.log("delaying createReserve");
+ taler.onPresent(function () {
+ createReserve(callbackUrl, amount, wtTypes, suggestedExchangeUrl);
+ });
+ return;
}
- callWallet("taler-payment-failed", { H_contract: walletResp.H_contract }, onResp);
- timeoutHandle = setTimeout(onTimeout, 200);
+ var args = {
+ callback_url: callbackUrl,
+ amount: amount,
+ wt_types: wtTypes,
+ suggested_exchange_url: suggestedExchangeUrl
+ };
+ callWallet("taler-create-reserve", args);
}
- logVerbose && console.log("handling taler-notify-payment: ", walletResp);
- // Payment timeout in ms.
- var timeout_ms = 1000;
- // Current request.
- var r;
- var timeoutHandle = null;
- function sendPay() {
- r = new XMLHttpRequest();
- r.open("post", walletResp.contract.pay_url);
- r.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
- r.send(JSON.stringify(walletResp.payReq));
- r.onload = function () {
- if (!r) {
- return;
+ taler.createReserve = createReserve;
+ function handlePaymentResponse(walletResp) {
+ /**
+ * Handle a failed payment.
+ *
+ * Try to notify the wallet first, before we show a potentially
+ * synchronous error message (such as an alert) or leave the page.
+ */
+ function handleFailedPayment(r) {
+ var timeoutHandle = null;
+ function err() {
+ raise_error("pay-failed", { status: r.status, response: r.responseText });
}
- switch (r.status) {
- case 200:
- var merchantResp = JSON.parse(r.responseText);
- logVerbose && console.log("got success from pay_url");
- callWallet("taler-payment-succeeded", { H_contract: walletResp.H_contract, merchantSig: merchantResp.sig }, function () {
- var nextUrl = walletResp.contract.fulfillment_url;
- logVerbose && console.log("taler-payment-succeeded done, going to", nextUrl);
- window.location.href = nextUrl;
- window.location.reload(true);
- });
- break;
- default:
- handleFailedPayment(r);
- break;
+ function onResp() {
+ if (timeoutHandle != null) {
+ clearTimeout(timeoutHandle);
+ timeoutHandle = null;
+ }
+ err();
}
- r = null;
- if (timeoutHandle != null) {
- clearTimeout(timeoutHandle);
+ function onTimeout() {
timeoutHandle = null;
+ err();
}
- };
- function retry() {
- if (r) {
- r.abort();
+ callWallet("taler-payment-failed", { H_contract: walletResp.H_contract }, onResp);
+ timeoutHandle = setTimeout(onTimeout, 200);
+ }
+ logVerbose && console.log("handling taler-notify-payment: ", walletResp);
+ // Payment timeout in ms.
+ var timeout_ms = 1000;
+ // Current request.
+ var r;
+ var timeoutHandle = null;
+ function sendPay() {
+ r = new XMLHttpRequest();
+ r.open("post", walletResp.contract.pay_url);
+ r.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
+ r.send(JSON.stringify(walletResp.payReq));
+ r.onload = function () {
+ if (!r) {
+ return;
+ }
+ switch (r.status) {
+ case 200:
+ var merchantResp = JSON.parse(r.responseText);
+ logVerbose && console.log("got success from pay_url");
+ callWallet("taler-payment-succeeded", { H_contract: walletResp.H_contract, merchantSig: merchantResp.sig }, function () {
+ var nextUrl = walletResp.contract.fulfillment_url;
+ logVerbose && console.log("taler-payment-succeeded done, going to", nextUrl);
+ window.location.href = nextUrl;
+ window.location.reload(true);
+ });
+ break;
+ default:
+ handleFailedPayment(r);
+ break;
+ }
r = null;
+ if (timeoutHandle != null) {
+ clearTimeout(timeoutHandle);
+ timeoutHandle = null;
+ }
+ };
+ function retry() {
+ if (r) {
+ r.abort();
+ r = null;
+ }
+ timeout_ms = Math.min(timeout_ms * 2, 10 * 1000);
+ logVerbose && console.log("sendPay timed out, retrying in ", timeout_ms, "ms");
+ sendPay();
}
- timeout_ms = Math.min(timeout_ms * 2, 10 * 1000);
- logVerbose && console.log("sendPay timed out, retrying in ", timeout_ms, "ms");
- sendPay();
+ timeoutHandle = setTimeout(retry, timeout_ms);
}
- timeoutHandle = setTimeout(retry, timeout_ms);
+ sendPay();
}
- sendPay();
- }
- function onPresent(f) {
- presentHandlers.push(f);
- }
- taler.onPresent = onPresent;
- function onAbsent(f) {
- absentHandlers.push(f);
- }
- taler.onAbsent = onAbsent;
- function internalPay(p) {
- // either the callback gets called,
- // or the wallet will redirect the browser
- callWallet("taler-pay", p, handlePaymentResponse);
- }
- taler.internalPay = internalPay;
- function pay(p) {
- if (!installed) {
- logVerbose && console.log("delaying call to 'pay' until GNU Taler wallet is present");
- taler.onPresent(function () {
- pay(p);
- });
- return;
+ function onPresent(f) {
+ presentHandlers.push(f);
}
- internalPay(p);
- }
- taler.pay = pay;
- function internalAddAuditor(d) {
- // either the callback gets called,
- // or the wallet will redirect the browser
- callWallet("taler-add-auditor", d);
- }
- taler.internalAddAuditor = internalAddAuditor;
- function addAuditor(d) {
- if (!installed) {
- logVerbose && console.log("delaying call to 'addAuditor' until GNU Taler wallet is present");
- taler.onPresent(function () {
- addAuditor(d);
- });
- return;
+ taler.onPresent = onPresent;
+ function onAbsent(f) {
+ absentHandlers.push(f);
}
- internalAddAuditor(d);
- }
- taler.addAuditor = addAuditor;
- function internalCheckAuditor(url) {
- return new Promise(function (resolve, reject) {
- callWallet("taler-check-auditor", url, function (x) { return resolve(x); });
- });
- }
- taler.internalCheckAuditor = internalCheckAuditor;
- /**
- * Check if an auditor is already added to the wallet.
- *
- * Same-origin restrictions apply.
- */
- function checkAuditor(url) {
- if (!installed) {
- logVerbose && console.log("delaying call to 'checkAuditor' until GNU Taler wallet is present");
- return new Promise(function (resolve, reject) {
+ taler.onAbsent = onAbsent;
+ function internalPay(p) {
+ // either the callback gets called,
+ // or the wallet will redirect the browser
+ callWallet("taler-pay", p, handlePaymentResponse);
+ }
+ taler.internalPay = internalPay;
+ function pay(p) {
+ if (!installed) {
+ logVerbose && console.log("delaying call to 'pay' until GNU Taler wallet is present");
taler.onPresent(function () {
- resolve(checkAuditor(url));
+ pay(p);
});
- });
+ return;
+ }
+ internalPay(p);
}
- return internalCheckAuditor(url);
- }
- taler.checkAuditor = checkAuditor;
- function initTaler() {
- function handleUninstall() {
- installed = false;
- // not really true, but we want "uninstalled" to be shown
- firstTimeoutCalled = true;
- announce();
+ taler.pay = pay;
+ function internalAddAuditor(d) {
+ // either the callback gets called,
+ // or the wallet will redirect the browser
+ callWallet("taler-add-auditor", d);
}
- function handleProbe() {
- probeExecuted = true;
+ taler.internalAddAuditor = internalAddAuditor;
+ function addAuditor(d) {
if (!installed) {
- logVerbose && console.log("taler install detected");
- installed = true;
- announce();
+ logVerbose && console.log("delaying call to 'addAuditor' until GNU Taler wallet is present");
+ taler.onPresent(function () {
+ addAuditor(d);
+ });
+ return;
}
+ internalAddAuditor(d);
}
- function probeTaler() {
- probeExecuted = false;
- var eve = new Event("taler-probe");
- document.dispatchEvent(eve);
- }
- var firstTimeoutCalled = false;
- function onProbeTimeout() {
- if (!probeExecuted) {
- if (installed || !firstTimeoutCalled) {
- installed = false;
- firstTimeoutCalled = true;
- logVerbose && console.log("taler uninstall detected");
- announce();
- }
- }
- // try again, maybe it'll be installed ...
- probeTaler();
+ taler.addAuditor = addAuditor;
+ function internalCheckAuditor(url) {
+ return new Promise(function (resolve, reject) {
+ callWallet("taler-check-auditor", url, function (x) { return resolve(x); });
+ });
}
+ taler.internalCheckAuditor = internalCheckAuditor;
/**
- * Announce presence/absence and update stylesheets.
+ * Check if an auditor is already added to the wallet.
*
- * Only called after document.readyState is at least "interactive".
+ * Same-origin restrictions apply.
*/
- function announce() {
- if (!pageLoaded) {
- logVerbose && console.log("page not loaded yet, announcing later");
- return;
+ function checkAuditor(url) {
+ if (!installed) {
+ logVerbose && console.log("delaying call to 'checkAuditor' until GNU Taler wallet is present");
+ return new Promise(function (resolve, reject) {
+ taler.onPresent(function () {
+ resolve(checkAuditor(url));
+ });
+ });
}
- setStyles();
- if (installed) {
- logVerbose && console.log("announcing installed");
- for (var i = 0; i < presentHandlers.length; i++) {
- presentHandlers[i]();
+ return internalCheckAuditor(url);
+ }
+ taler.checkAuditor = checkAuditor;
+ function initTaler() {
+ function handleUninstall() {
+ installed = false;
+ // not really true, but we want "uninstalled" to be shown
+ firstTimeoutCalled = true;
+ announce();
+ }
+ function handleProbe() {
+ probeExecuted = true;
+ if (!installed) {
+ logVerbose && console.log("taler install detected");
+ installed = true;
+ announce();
}
}
- else {
- if (firstTimeoutCalled) {
- logVerbose && console.log("announcing uninstalled");
- for (var i = 0; i < absentHandlers.length; i++) {
- absentHandlers[i]();
+ function probeTaler() {
+ probeExecuted = false;
+ var eve = new Event("taler-probe");
+ document.dispatchEvent(eve);
+ }
+ var firstTimeoutCalled = false;
+ function onProbeTimeout() {
+ if (!probeExecuted) {
+ if (installed || !firstTimeoutCalled) {
+ installed = false;
+ firstTimeoutCalled = true;
+ logVerbose && console.log("taler uninstall detected");
+ announce();
+ }
+ }
+ // try again, maybe it'll be installed ...
+ probeTaler();
+ }
+ /**
+ * Announce presence/absence and update stylesheets.
+ *
+ * Only called after document.readyState is at least "interactive".
+ */
+ function announce() {
+ if (!pageLoaded) {
+ logVerbose && console.log("page not loaded yet, announcing later");
+ return;
+ }
+ setStyles();
+ if (installed) {
+ logVerbose && console.log("announcing installed");
+ for (var i = 0; i < presentHandlers.length; i++) {
+ presentHandlers[i]();
}
}
else {
- logVerbose && console.log("announcing nothing");
+ if (firstTimeoutCalled) {
+ logVerbose && console.log("announcing uninstalled");
+ for (var i = 0; i < absentHandlers.length; i++) {
+ absentHandlers[i]();
+ }
+ }
+ else {
+ logVerbose && console.log("announcing nothing");
+ }
}
}
- }
- function setStyles() {
- if (!sheet || !sheet.cssRules) {
- return;
- }
- while (sheet.cssRules.length > 0) {
- sheet.deleteRule(0);
- }
- if (installed) {
- sheet.insertRule(".taler-installed-hide { display: none; }", 0);
- sheet.insertRule(".taler-probed-hide { display: none; }", 0);
- }
- else {
- sheet.insertRule(".taler-installed-show { display: none; }", 0);
- if (firstTimeoutCalled) {
+ function setStyles() {
+ if (!sheet || !sheet.cssRules) {
+ return;
+ }
+ while (sheet.cssRules.length > 0) {
+ sheet.deleteRule(0);
+ }
+ if (installed) {
+ sheet.insertRule(".taler-installed-hide { display: none; }", 0);
sheet.insertRule(".taler-probed-hide { display: none; }", 0);
}
else {
- // We're still doing the detection
- sheet.insertRule(".taler-installed-hide { display: none; }", 0);
+ sheet.insertRule(".taler-installed-show { display: none; }", 0);
+ if (firstTimeoutCalled) {
+ sheet.insertRule(".taler-probed-hide { display: none; }", 0);
+ }
+ else {
+ // We're still doing the detection
+ sheet.insertRule(".taler-installed-hide { display: none; }", 0);
+ }
}
}
- }
- function initStyle() {
- logVerbose && console.log("taking over styles");
- var name = "taler-presence-stylesheet";
- var content = "/* Taler stylesheet controlled by JS */";
- var style = document.getElementById(name);
- if (!style) {
- style = document.createElement("style");
- // Needed by WebKit
- style.appendChild(document.createTextNode(content));
- style.id = name;
- document.head.appendChild(style);
- sheet = style.sheet;
- }
- else {
- // We've taken over the stylesheet now,
- // make it clear by clearing all the rules in it
- // and making it obvious in the DOM.
- if (style.tagName.toLowerCase() === "style") {
- style.innerText = content;
+ function initStyle() {
+ logVerbose && console.log("taking over styles");
+ var name = "taler-presence-stylesheet";
+ var content = "/* Taler stylesheet controlled by JS */";
+ var style = document.getElementById(name);
+ if (!style) {
+ style = document.createElement("style");
+ // Needed by WebKit
+ style.appendChild(document.createTextNode(content));
+ style.id = name;
+ document.head.appendChild(style);
+ sheet = style.sheet;
}
- if (!style.sheet) {
- throw Error("taler-presence-stylesheet should be a style sheet (<link> or <style>)");
+ else {
+ // We've taken over the stylesheet now,
+ // make it clear by clearing all the rules in it
+ // and making it obvious in the DOM.
+ if (style.tagName.toLowerCase() === "style") {
+ style.innerText = content;
+ }
+ if (!style.sheet) {
+ throw Error("taler-presence-stylesheet should be a style sheet (<link> or <style>)");
+ }
+ sheet = style.sheet;
+ while (sheet.cssRules.length > 0) {
+ sheet.deleteRule(0);
+ }
}
- sheet = style.sheet;
- while (sheet.cssRules.length > 0) {
- sheet.deleteRule(0);
+ }
+ function onPageLoad() {
+ pageLoaded = true;
+ if (document.readyState == "complete") {
+ initStyle();
}
+ else {
+ var listener = function () {
+ initStyle();
+ setStyles();
+ };
+ window.addEventListener("load", listener);
+ }
+ // We only start the timeout after the page is interactive.
+ window.setInterval(onProbeTimeout, 300);
+ announce();
}
- }
- function onPageLoad() {
- pageLoaded = true;
- if (document.readyState == "complete") {
- initStyle();
+ probeTaler();
+ document.addEventListener("taler-probe-result", handleProbe, false);
+ document.addEventListener("taler-uninstall", handleUninstall, false);
+ // Handle the case where the JavaScript is loaded after the page
+ // has been loaded for the first time.
+ if (document.readyState == "loading") {
+ document.addEventListener("DOMContentLoaded", onPageLoad, false);
}
else {
- var listener = function () {
- initStyle();
- setStyles();
- };
- window.addEventListener("load", listener);
+ onPageLoad();
}
- // We only start the timeout after the page is interactive.
- window.setInterval(onProbeTimeout, 300);
- announce();
}
- probeTaler();
- document.addEventListener("taler-probe-result", handleProbe, false);
- document.addEventListener("taler-uninstall", handleUninstall, false);
- // Handle the case where the JavaScript is loaded after the page
- // has been loaded for the first time.
- if (document.readyState == "loading") {
- document.addEventListener("DOMContentLoaded", onPageLoad, false);
+ function onPageLoadInExtension() {
+ if (document.documentElement.getAttribute("data-taler-nojs")) {
+ logVerbose && console.log("doing taler initialization from extension (nojs)");
+ initTaler();
+ }
}
- else {
- onPageLoad();
+ var caught = false;
+ try {
+ chrome.runtime.sendMessage({ type: "ping" });
}
- }
- function onPageLoadInExtension() {
- if (document.documentElement.getAttribute("data-taler-nojs")) {
- logVerbose && console.log("doing taler initialization from extension (nojs)");
- initTaler();
+ catch (e) {
+ caught = true;
}
- }
- var caught = false;
- try {
- chrome.runtime.sendMessage({ type: "ping" });
- }
- catch (e) {
- caught = true;
- }
- if (caught) {
- logVerbose && console.log("running taler-wallet-lib from page");
- initTaler();
- }
- else {
- logVerbose && console.log("running taler-wallet-lib from extension");
- runningInExtension = true;
- // Wait for even style sheets to load
- if (document.readyState != "complete") {
- window.addEventListener("load", function () { return onPageLoadInExtension(); });
+ if (caught) {
+ logVerbose && console.log("running taler-wallet-lib from page");
+ initTaler();
}
else {
- onPageLoadInExtension();
+ logVerbose && console.log("running taler-wallet-lib from extension");
+ runningInExtension = true;
+ // Wait for even style sheets to load
+ if (document.readyState != "complete") {
+ window.addEventListener("load", function () { return onPageLoadInExtension(); });
+ }
+ else {
+ onPageLoadInExtension();
+ }
}
- }
-})(taler || (taler = {}));
+ })(taler = exports.taler || (exports.taler = {}));
+});
// @license-end
diff --git a/taler-wallet-lib.ts b/taler-wallet-lib.ts
index 1a56e95..cbf32e8 100644
--- a/taler-wallet-lib.ts
+++ b/taler-wallet-lib.ts
@@ -28,7 +28,8 @@
@author Florian Dold
*/
-namespace taler {
+
+export namespace taler {
"use strict";
let logVerbose: boolean = false;
diff --git a/tsconfig.json b/tsconfig.json
index 1a14563..7d51196 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,6 +2,7 @@
"compilerOptions": {
"target": "es3",
"jsx": "react",
+ "module": "umd",
"experimentalDecorators": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,