UNPKG

machinomy

Version:

Micropayments powered by Ethereum

103 lines 4.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const AbstractChannelsDatabase_1 = require("../AbstractChannelsDatabase"); class PostgresChannelsDatabase extends AbstractChannelsDatabase_1.default { save(paymentChannel) { return this.engine.exec((client) => client.query('INSERT INTO channel("channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil") ' + 'VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)', [ paymentChannel.channelId, this.kind, paymentChannel.sender, paymentChannel.receiver, paymentChannel.value.toString(), paymentChannel.spent.toString(), paymentChannel.state, paymentChannel.tokenContract, paymentChannel.settlementPeriod, paymentChannel.settlingUntil.toString() ])); } firstById(channelId) { return this.engine.exec((client) => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel ' + 'WHERE "channelId" = $1 LIMIT 1', [ channelId.toString() ])).then((res) => this.inflatePaymentChannel(res.rows[0])); } spend(channelId, spent) { return this.engine.exec((client) => client.query('UPDATE channel SET spent = $2 WHERE "channelId" = $1', [ channelId.toString(), spent.toString() ])); } async deposit(channelId, value) { return this.engine.exec(async (client) => { const channel = await this.firstById(channelId); if (!channel) { throw new Error('Channel not found.'); } const newValue = channel.value.add(value); return client.query('UPDATE channel SET value = $2 WHERE "channelId" = $1', [ channelId.toString(), newValue.toString() ]); }); } all() { return this.engine.exec((client) => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel')).then((res) => this.inflatePaymentChannels(res.rows)); } allOpen() { return this.engine.exec(client => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel ' + 'WHERE state = 0')).then((res) => this.inflatePaymentChannels(res.rows)) .then((chans) => this.filterByState(0, chans)); } async findUsable(sender, receiver, amount) { const res = await this.engine.exec(client => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel ' + 'WHERE sender = $1 AND receiver = $2 AND value >= spent + $3 AND state = 0', [ sender, receiver, amount.toString() ])); const channels = await Promise.all(res.rows.map(r => this.inflatePaymentChannel(r))); const nonEmpty = channels.reduce((acc, chan) => { if (chan) { acc.push(chan); } return acc; }, []); if (nonEmpty.length) { return this.filterByState(0, nonEmpty)[0]; } else { return null; } } findBySenderReceiver(sender, receiver) { return this.engine.exec((client) => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel ' + 'WHERE sender = $1 AND receiver = $2', [ sender, receiver ])).then((res) => this.inflatePaymentChannels(res.rows)); } findBySenderReceiverChannelId(sender, receiver, channelId) { return this.engine.exec((client) => client.query('SELECT "channelId", kind, sender, receiver, value, spent, state, "tokenContract", "settlementPeriod", "settlingUntil" FROM channel ' + 'WHERE sender = $1 AND receiver = $2 AND "channelId" = $3 LIMIT 1', [ sender, receiver, channelId.toString() ])).then((res) => this.inflatePaymentChannel(res.rows[0])); } updateState(channelId, state) { return this.engine.exec((client) => client.query('UPDATE channel SET state = $1 WHERE "channelId" = $2', [ state, channelId.toString() ])); } updateSettlingUntil(channelId, settlingUntil) { return this.engine.exec((client) => client.query('UPDATE channel SET "settlingUntil" = $1 WHERE "channelId" = $2', [ settlingUntil.toString(), channelId.toString() ])); } } exports.default = PostgresChannelsDatabase; //# sourceMappingURL=PostgresChannelsDatabase.js.map