UNPKG

@aeternity/aepp-sdk

Version:
690 lines (601 loc) 24.7 kB
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