walletd
Version:
Universal headless digital asset wallet for machines
155 lines (77 loc) • 2.05 kB
text/typescript
import {existsSync} from 'fs';
var configFile;
if (existsSync(`${process.env.HOME}/.walletd/config.js`)) {
configFile = require(`${process.env.HOME}/.walletd/config.js`);
} else if (existsSync(`${process.env.HOME}/.walletd/config.ts`)) {
configFile = require(`${process.env.HOME}/.walletd/config.ts`);
} else {
configFile = require("../../config");
}
let packageJSON = require("../../package");
class WalletPlugin {
name: string;
module: any;
code: any;
constructor(name, pkg) {
this.name = name;
this.module = pkg;
}
init(walletData): WalletPlugin {
this.code = this.module.init(walletData);
return this;
}
}
class Template {
}
interface WalletData {
data: any;
}
class Wallet {
plugin: WalletPlugin;
data: WalletData;
constructor(plugin: WalletPlugin, data: WalletData) {
this.plugin = plugin.init(data);
this.data = data;
}
async getBalance() {
return this.plugin.code.getBalance();
}
async sendPayment() {
return this.plugin.code.sendPayment();
}
async receivePayment() {
return this.plugin.code.receivePayment();
}
async listPayments() {
return this.plugin.code.listPayments();
}
}
function parseNPMPlugins(packageJSON) {
let pluginPackages = Object.entries(packageJSON.dependencies).filter(dep => {
return dep[0].match(/^walletd-plugin-/);
});
return pluginPackages.map(pkg => {
let plugin = require(pkg[0]);
plugin.name = pkg[0].split('walletd-plugin-')[1];
plugin.version = pkg[1];
return plugin;
});
}
async function init() {
let pluginPackages = parseNPMPlugins(packageJSON);
let wallets = {};
let plugins = {};
pluginPackages.forEach(pkg => {
plugins[pkg.name] = new WalletPlugin(pkg.name, pkg);
});
Object.entries(configFile.wallets).forEach(([name, config]) => {
let wallet = new Wallet(plugins[config.plugin], config.data);
wallets[name] = wallet;
});
return wallets;
}
export {
init,
WalletPlugin,
Wallet
}