@aeternity/aepp-sdk
Version:
SDK for the æternity blockchain
690 lines (601 loc) • 24.7 kB
JavaScript
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
import _merge from "ramda/src/merge";
import _typeof from "@babel/runtime-corejs3/helpers/typeof";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context20; _forEachInstanceProperty(_context20 = ownKeys(Object(source), true)).call(_context20, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context21; _forEachInstanceProperty(_context21 = ownKeys(Object(source))).call(_context21, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; }
import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
import _Set from "@babel/runtime-corejs3/core-js-stable/set";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _setInterval from "@babel/runtime-corejs3/core-js-stable/set-interval";
import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
/*
* ISC License (ISC)
* Copyright (c) 2018 aeternity developers
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* Oracle module - routines to interact with the æternity oracle system
*
* The high-level description of the oracle system is
* https://github.com/aeternity/protocol/blob/master/ORACLE.md in the protocol
* repository.
* @module @aeternity/aepp-sdk/es/ae/oracle
* @export Oracle
* @example import { Oracle } from '@aeternity/aepp-sdk'
*/
import Ae from './';
import { decodeBase64Check, assertedType } from '../utils/crypto';
import { pause } from '../utils/other';
import { oracleQueryId } from '../tx/builder/helpers';
import { unpackTx } from '../tx/builder';
import { ORACLE_TTL, QUERY_FEE, QUERY_TTL, RESPONSE_TTL } from '../tx/builder/schema';
/**
* Constructor for Oracle Object (helper object for using Oracle)
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @return {Promise<Object>} Oracle object
*/
function getOracleObject(_x) {
return _getOracleObject.apply(this, arguments);
}
/**
* Poll for oracle queries
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @param {String} oracleId Oracle public key
* @param {Function} onQuery OnQuery callback
* @param {Object} [options] Options object
* @param {Number} [options.interval] Poll interval(default: 5000)
* @return {Function} stopPolling - Stop polling function
*/
function _getOracleObject() {
_getOracleObject = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(oracleId) {
var _context3, _context4, _context5, _context6, _context7;
var oracle, _yield$this$api$getOr, queries;
return _regeneratorRuntime.wrap(function _callee2$(_context8) {
while (1) {
switch (_context8.prev = _context8.next) {
case 0:
_context8.next = 2;
return this.api.getOracleByPubkey(oracleId);
case 2:
oracle = _context8.sent;
_context8.next = 5;
return this.api.getOracleQueriesByPubkey(oracleId);
case 5:
_yield$this$api$getOr = _context8.sent;
queries = _yield$this$api$getOr.oracleQueries;
return _context8.abrupt("return", _objectSpread(_objectSpread({}, oracle), {}, {
queries: queries,
pollQueries: _bindInstanceProperty(_context3 = this.pollForQueries).call(_context3, this, oracleId),
postQuery: _bindInstanceProperty(_context4 = this.postQueryToOracle).call(_context4, this, oracleId),
respondToQuery: _bindInstanceProperty(_context5 = this.respondToQuery).call(_context5, this, oracleId),
extendOracle: _bindInstanceProperty(_context6 = this.extendOracleTtl).call(_context6, this, oracleId),
getQuery: _bindInstanceProperty(_context7 = this.getQueryObject).call(_context7, this, oracleId)
}));
case 8:
case "end":
return _context8.stop();
}
}
}, _callee2, this);
}));
return _getOracleObject.apply(this, arguments);
}
function pollForQueries(oracleId, onQuery) {
var _this = this;
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
_ref$interval = _ref.interval,
interval = _ref$interval === void 0 ? 5000 : _ref$interval;
var knownQueryIds = new _Set();
var checkNewQueries = /*#__PURE__*/function () {
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var _context;
var queries;
return _regeneratorRuntime.wrap(function _callee$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.t0 = _filterInstanceProperty;
_context2.next = 3;
return _this.api.getOracleQueriesByPubkey(oracleId);
case 3:
_context2.t1 = _context2.sent.oracleQueries;
if (_context2.t1) {
_context2.next = 6;
break;
}
_context2.t1 = [];
case 6:
_context2.t2 = _context = _context2.t1;
queries = (0, _context2.t0)(_context2.t2).call(_context, function (_ref3) {
var id = _ref3.id;
return !knownQueryIds.has(id);
});
_forEachInstanceProperty(queries).call(queries, function (_ref4) {
var id = _ref4.id;
return knownQueryIds.add(id);
});
if (queries.length) onQuery(queries);
case 10:
case "end":
return _context2.stop();
}
}
}, _callee);
}));
return function checkNewQueries() {
return _ref2.apply(this, arguments);
};
}();
checkNewQueries();
var intervalId = _setInterval(checkNewQueries, interval);
return function () {
return clearInterval(intervalId);
};
}
/**
* Constructor for OracleQuery Object (helper object for using OracleQuery)
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @param {String} queryId Oracle Query id
* @return {Promise<Object>} OracleQuery object
*/
function getQueryObject(_x2, _x3) {
return _getQueryObject.apply(this, arguments);
}
/**
* Poll for oracle query response
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @param {String} queryId Oracle Query id
* @param {Object} [options] Options object
* @param {Object} [options.attempts] Poll attempt's(default: 20)
* @param {Object} [options.interval] Poll interval(default: 5000)
* @return {Promise<Object>} OracleQuery object
*/
function _getQueryObject() {
_getQueryObject = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(oracleId, queryId) {
var _context9, _context10, _context11, _context12;
var q;
return _regeneratorRuntime.wrap(function _callee3$(_context13) {
while (1) {
switch (_context13.prev = _context13.next) {
case 0:
_context13.next = 2;
return this.api.getOracleQueryByPubkeyAndQueryId(oracleId, queryId);
case 2:
q = _context13.sent;
return _context13.abrupt("return", _objectSpread(_objectSpread({}, q), {}, {
decodedQuery: decodeBase64Check(_sliceInstanceProperty(_context9 = q.query).call(_context9, 3)).toString(),
decodedResponse: decodeBase64Check(_sliceInstanceProperty(_context10 = q.response).call(_context10, 3)).toString(),
respond: _bindInstanceProperty(_context11 = this.respondToQuery).call(_context11, this, oracleId, queryId),
pollForResponse: _bindInstanceProperty(_context12 = this.pollForQueryResponse).call(_context12, this, oracleId, queryId),
decode: function decode(data) {
return decodeBase64Check(_sliceInstanceProperty(data).call(data, 3));
}
}));
case 4:
case "end":
return _context13.stop();
}
}
}, _callee3, this);
}));
return _getQueryObject.apply(this, arguments);
}
export function pollForQueryResponse(_x4, _x5) {
return _pollForQueryResponse.apply(this, arguments);
}
/**
* Register oracle
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} queryFormat Format of query
* @param {String} responseFormat Format of query response
* @param {Object} [options={}] Options
* @param {String|Number} [options.queryFee] queryFee Oracle query Fee
* @param {Object} [options.oracleTtl] oracleTtl OracleTtl object {type: 'delta|block', value: 'number'}
* @param {Number} [options.abiVersion] abiVersion Always 0 (do not use virtual machine)
* @param {Number|String} [options.fee] fee Transaction fee
* @param {Number|String} [options.ttl] Transaction time to leave
* @return {Promise<Object>} Oracle object
*/
function _pollForQueryResponse() {
_pollForQueryResponse = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(oracleId, queryId) {
var _this2 = this;
var _ref5,
_ref5$attempts,
attempts,
_ref5$interval,
interval,
_loop,
i,
_ret,
_args5 = arguments;
return _regeneratorRuntime.wrap(function _callee4$(_context15) {
while (1) {
switch (_context15.prev = _context15.next) {
case 0:
_ref5 = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : {}, _ref5$attempts = _ref5.attempts, attempts = _ref5$attempts === void 0 ? 20 : _ref5$attempts, _ref5$interval = _ref5.interval, interval = _ref5$interval === void 0 ? 5000 : _ref5$interval;
_loop = /*#__PURE__*/_regeneratorRuntime.mark(function _loop(i) {
var _yield$_this2$api$get, response, responseBuffer;
return _regeneratorRuntime.wrap(function _loop$(_context14) {
while (1) {
switch (_context14.prev = _context14.next) {
case 0:
if (!i) {
_context14.next = 3;
break;
}
_context14.next = 3;
return pause(interval);
case 3:
_context14.next = 5;
return _this2.api.getOracleQueryByPubkeyAndQueryId(oracleId, queryId);
case 5:
_yield$_this2$api$get = _context14.sent;
response = _yield$_this2$api$get.response;
responseBuffer = decodeBase64Check(assertedType(response, 'or'));
if (!responseBuffer.length) {
_context14.next = 10;
break;
}
return _context14.abrupt("return", {
v: {
response: response,
decode: function decode() {
return responseBuffer;
}
}
});
case 10:
case "end":
return _context14.stop();
}
}
}, _loop);
});
i = 0;
case 3:
if (!(i < attempts)) {
_context15.next = 11;
break;
}
return _context15.delegateYield(_loop(i), "t0", 5);
case 5:
_ret = _context15.t0;
if (!(_typeof(_ret) === "object")) {
_context15.next = 8;
break;
}
return _context15.abrupt("return", _ret.v);
case 8:
i++;
_context15.next = 3;
break;
case 11:
throw new Error("Giving up after ".concat((attempts - 1) * interval, "ms"));
case 12:
case "end":
return _context15.stop();
}
}
}, _callee4);
}));
return _pollForQueryResponse.apply(this, arguments);
}
function registerOracle(_x6, _x7) {
return _registerOracle.apply(this, arguments);
}
/**
* Post query to oracle
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @param {String} query Oracle query object
* @param {Object} [options={}]
* @param {String|Number} [options.queryTtl] queryTtl Oracle query time to leave
* @param {String|Number} [options.responseTtl] queryFee Oracle query response time to leave
* @param {String|Number} [options.queryFee] queryFee Oracle query fee
* @param {Number} [options.fee] fee Transaction fee
* @param {Number} [options.ttl] Transaction time to leave
* @return {Promise<Object>} Query object
*/
function _registerOracle() {
_registerOracle = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(queryFormat, responseFormat) {
var options,
opt,
accountId,
oracleRegisterTx,
_args6 = arguments;
return _regeneratorRuntime.wrap(function _callee5$(_context16) {
while (1) {
switch (_context16.prev = _context16.next) {
case 0:
options = _args6.length > 2 && _args6[2] !== undefined ? _args6[2] : {};
opt = _merge(this.Ae.defaults, options); // Preset VmVersion for oracle
_context16.next = 4;
return this.address(opt);
case 4:
accountId = _context16.sent;
_context16.next = 7;
return this.oracleRegisterTx(_merge(opt, {
accountId: accountId,
queryFormat: queryFormat,
responseFormat: responseFormat
}));
case 7:
oracleRegisterTx = _context16.sent;
_context16.t0 = _objectSpread;
_context16.t1 = _objectSpread;
_context16.t2 = {};
_context16.next = 13;
return this.send(oracleRegisterTx, opt);
case 13:
_context16.t3 = _context16.sent;
_context16.t4 = (0, _context16.t1)(_context16.t2, _context16.t3);
_context16.next = 17;
return this.getOracleObject("ok_".concat(_sliceInstanceProperty(accountId).call(accountId, 3)));
case 17:
_context16.t5 = _context16.sent;
return _context16.abrupt("return", (0, _context16.t0)(_context16.t4, _context16.t5));
case 19:
case "end":
return _context16.stop();
}
}
}, _callee5, this);
}));
return _registerOracle.apply(this, arguments);
}
function postQueryToOracle(_x8, _x9) {
return _postQueryToOracle.apply(this, arguments);
}
/**
* Extend oracle ttl
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @param {String} oracleTtl Oracle time to leave for extend
* @param {Object} [options={}]
* @param {Number} [options.fee] fee Transaction fee
* @param {Number} [options.ttl] Transaction time to leave
* @return {Promise<Object>} Oracle object
*/
function _postQueryToOracle() {
_postQueryToOracle = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6(oracleId, query) {
var options,
opt,
senderId,
oracleRegisterTx,
queryId,
_args7 = arguments;
return _regeneratorRuntime.wrap(function _callee6$(_context17) {
while (1) {
switch (_context17.prev = _context17.next) {
case 0:
options = _args7.length > 2 && _args7[2] !== undefined ? _args7[2] : {};
opt = _merge(this.Ae.defaults, options);
_context17.next = 4;
return this.address(opt);
case 4:
senderId = _context17.sent;
_context17.next = 7;
return this.oraclePostQueryTx(_merge(opt, {
oracleId: oracleId,
senderId: senderId,
query: query
}));
case 7:
oracleRegisterTx = _context17.sent;
queryId = oracleQueryId(senderId, unpackTx(oracleRegisterTx).tx.nonce, oracleId);
_context17.t0 = _objectSpread;
_context17.t1 = _objectSpread;
_context17.t2 = {};
_context17.next = 14;
return this.send(oracleRegisterTx, opt);
case 14:
_context17.t3 = _context17.sent;
_context17.t4 = (0, _context17.t1)(_context17.t2, _context17.t3);
_context17.next = 18;
return this.getQueryObject(oracleId, queryId);
case 18:
_context17.t5 = _context17.sent;
return _context17.abrupt("return", (0, _context17.t0)(_context17.t4, _context17.t5));
case 20:
case "end":
return _context17.stop();
}
}
}, _callee6, this);
}));
return _postQueryToOracle.apply(this, arguments);
}
function extendOracleTtl(_x10, _x11) {
return _extendOracleTtl.apply(this, arguments);
}
/**
* Extend oracle ttl
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @instance
* @function
* @category async
* @param {String} oracleId Oracle public key
* @param {String} queryId Oracle query id
* @param {String} response Oracle query response
* @param {Object} [options={}]
* @param {Number} [options.responseTtl] responseTtl Query response time to leave
* @param {Number} [options.fee] Transaction fee
* @param {Number} [options.ttl] Transaction time to leave
* @return {Promise<Object>} Oracle object
*/
function _extendOracleTtl() {
_extendOracleTtl = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7(oracleId, oracleTtl) {
var options,
opt,
callerId,
oracleExtendTx,
_args8 = arguments;
return _regeneratorRuntime.wrap(function _callee7$(_context18) {
while (1) {
switch (_context18.prev = _context18.next) {
case 0:
options = _args8.length > 2 && _args8[2] !== undefined ? _args8[2] : {};
opt = _merge(this.Ae.defaults, options);
_context18.next = 4;
return this.address(opt);
case 4:
callerId = _context18.sent;
_context18.next = 7;
return this.oracleExtendTx(_merge(opt, {
oracleId: oracleId,
callerId: callerId,
oracleTtl: oracleTtl
}));
case 7:
oracleExtendTx = _context18.sent;
_context18.t0 = _objectSpread;
_context18.t1 = _objectSpread;
_context18.t2 = {};
_context18.next = 13;
return this.send(oracleExtendTx, opt);
case 13:
_context18.t3 = _context18.sent;
_context18.t4 = (0, _context18.t1)(_context18.t2, _context18.t3);
_context18.next = 17;
return this.getOracleObject(oracleId);
case 17:
_context18.t5 = _context18.sent;
return _context18.abrupt("return", (0, _context18.t0)(_context18.t4, _context18.t5));
case 19:
case "end":
return _context18.stop();
}
}
}, _callee7, this);
}));
return _extendOracleTtl.apply(this, arguments);
}
function respondToQuery(_x12, _x13, _x14) {
return _respondToQuery.apply(this, arguments);
}
/**
* Oracle Stamp
*
* Oracle provides oracle-system related methods atop
* {@link module:@aeternity/aepp-sdk/es/ae--Ae} clients.
* @function
* @alias module:@aeternity/aepp-sdk/es/ae/oracle
* @rtype Stamp
* @param {Object} [options={}] - Initializer object
* @return {Object} Oracle instance
*/
function _respondToQuery() {
_respondToQuery = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8(oracleId, queryId, response) {
var options,
opt,
callerId,
oracleRespondTx,
_args9 = arguments;
return _regeneratorRuntime.wrap(function _callee8$(_context19) {
while (1) {
switch (_context19.prev = _context19.next) {
case 0:
options = _args9.length > 3 && _args9[3] !== undefined ? _args9[3] : {};
opt = _merge(this.Ae.defaults, options);
_context19.next = 4;
return this.address(opt);
case 4:
callerId = _context19.sent;
_context19.next = 7;
return this.oracleRespondTx(_merge(opt, {
oracleId: oracleId,
queryId: queryId,
callerId: callerId,
response: response
}));
case 7:
oracleRespondTx = _context19.sent;
_context19.t0 = _objectSpread;
_context19.t1 = _objectSpread;
_context19.t2 = {};
_context19.next = 13;
return this.send(oracleRespondTx, opt);
case 13:
_context19.t3 = _context19.sent;
_context19.t4 = (0, _context19.t1)(_context19.t2, _context19.t3);
_context19.next = 17;
return this.getOracleObject(oracleId);
case 17:
_context19.t5 = _context19.sent;
return _context19.abrupt("return", (0, _context19.t0)(_context19.t4, _context19.t5));
case 19:
case "end":
return _context19.stop();
}
}
}, _callee8, this);
}));
return _respondToQuery.apply(this, arguments);
}
var Oracle = Ae.compose({
methods: {
registerOracle: registerOracle,
respondToQuery: respondToQuery,
extendOracleTtl: extendOracleTtl,
postQueryToOracle: postQueryToOracle,
pollForQueryResponse: pollForQueryResponse,
pollForQueries: pollForQueries,
getOracleObject: getOracleObject,
getQueryObject: getQueryObject
},
deepProps: {
Ae: {
defaults: {
queryFee: QUERY_FEE,
oracleTtl: ORACLE_TTL,
queryTtl: QUERY_TTL,
responseTtl: RESPONSE_TTL
}
}
}
});
export default Oracle;
//# sourceMappingURL=oracle.js.map