UNPKG

@ton3/liteclient

Version:
194 lines 8.67 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _LiteApi_events; Object.defineProperty(exports, "__esModule", { value: true }); exports.LiteApi = void 0; const events_1 = __importDefault(require("events")); const debug_1 = __importDefault(require("debug")); const stream_1 = require("../../tl/stream"); const dataTypes = __importStar(require("../../dataTypes")); const functions = __importStar(require("../../functions")); const ton3_core_1 = require("ton3-core"); const debug = (0, debug_1.default)('tonkite:lite-api:client'); let counter = 0; const nextQueryId = () => { const buffer = ton3_core_1.Utils.Helpers.hexToBytes('0000000095d6fecb497dfd0aa5f031e7d412986b5ce720496db512052e8f2d10'); buffer.set((0, stream_1.uintToBytes)(counter++, 4).reverse(), 0); return buffer; }; const createADNLQuery = (queryId, query) => { const queryPadding = 4 - (((query.length + 1) % 4) || 4); const buffer = new Uint8Array(4 + 32 + 1 + query.length + queryPadding); buffer.set((0, stream_1.uintToBytes)(0xb48bf97a, 4).reverse(), 0); buffer.set(queryId, 4); buffer.set([query.length], 4 + 32); buffer.set(query, 4 + 32 + 1); return buffer; }; class LiteApiError extends Error { constructor(message, code) { super(message); this.code = code; } } class LiteApi { constructor(adnlClient) { this.adnlClient = adnlClient; _LiteApi_events.set(this, new events_1.default()); adnlClient.on('data', (data) => { const dataReader = new stream_1.StreamReader(data); const adnlAnswer = dataTypes.adnl.answerMessage.read(dataReader); const [tag, answer] = this.parseLiteServerAnswer(adnlAnswer.answer); __classPrivateFieldGet(this, _LiteApi_events, "f").emit(ton3_core_1.Utils.Helpers.bytesToHex(adnlAnswer.queryId), { tag, answer, }); }); } parseLiteServerAnswer(dataReader) { const tag = dataReader.readInt32LE(); const codecs = Object.values(dataTypes.liteServer); const codec = codecs.find((codec) => codec.tag === tag); if (!codec) { throw new Error(`Data type 0x${tag.toString(16).padStart(8, '0')} is not supported.`); } return [tag, codec.read(dataReader)]; } query(dataWriterFn, wait) { const dataWriter = new stream_1.StreamWriter(); const queryWriter = new stream_1.StreamWriter(); if (wait) { const { seqno, timeout = 10000 } = wait; dataTypes.liteServer.waitMasterchainSeqno.write(dataWriter, seqno, timeout); } dataWriterFn(dataWriter); dataTypes.liteServer.query.write(queryWriter, dataWriter.buffer); const queryId = nextQueryId(); this.adnlClient.write(createADNLQuery(queryId, queryWriter.buffer)); return new Promise((resolve, reject) => { __classPrivateFieldGet(this, _LiteApi_events, "f").once(ton3_core_1.Utils.Helpers.bytesToHex(queryId), ({ tag, answer }) => { if (tag === dataTypes.liteServer.error.tag) { return reject(new LiteApiError(answer.message, answer.code)); } resolve(answer); }); }); } getMasterchainInfo(wait) { debug('query getMasterchainInfo()'); return this.query((dataWriter) => { functions.liteServer.getMasterchainInfo(dataWriter); }, wait); } getTime(wait) { debug('query getTime()'); return this.query((dataWriter) => { functions.liteServer.getTime(dataWriter); }, wait); } getVersion(wait) { debug('query getVersion()'); return this.query((dataWriter) => { functions.liteServer.getVersion(dataWriter); }, wait); } getBlock(blockId, wait) { debug('query getBlock()'); return this.query((dataWriter) => { functions.liteServer.getBlock(dataWriter, blockId); }, wait); } getAllShardsInfo(blockId, wait) { debug('query getAllShardsInfo()'); return this.query((dataWriter) => { functions.liteServer.getAllShardsInfo(dataWriter, blockId); }, wait); } getState(blockId, wait) { debug('query getState()'); return this.query((dataWriter) => { functions.liteServer.getState(dataWriter, blockId); }, wait); } getBlockHeader(data, wait) { debug('query getBlockHeader()'); return this.query((dataWriter) => { functions.liteServer.getBlockHeader(dataWriter, data.blockId, data.mode); }, wait); } lookupBlock(input, wait) { debug('query lookupBlock()'); return this.query((dataWriter) => { functions.liteServer.lookupBlock(dataWriter, input); }, wait); } getAccountState(data, wait) { debug('query getAccountState(%d, %d, %s)', data.blockId.workchain, data.blockId.seqno, `${data.account.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.account.id)}`); return this.query((dataWriter) => { functions.liteServer.getAccountState(dataWriter, data.blockId, data.account); }, wait); } listBlockTransactions(data, wait) { return this.query((dataWriter) => { debug('query listBlockTransactions()'); functions.liteServer.listBlockTransactions(dataWriter, data.blockId, data.count || 20, data.after || null, data?.options?.reverseOrder || false, data?.options?.wantProof || false); }, wait); } getTransactions(data, wait) { debug('query getTransactions(%s, %s, %s)', `${data.account.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.account.id)}`, data.lt.toString(10), ton3_core_1.Utils.Helpers.bytesToHex(data.hash)); return this.query((dataWriter) => { functions.liteServer.getTransactions(dataWriter, data.count || 20, data.account, data.lt, data.hash); }, wait); } getOneTransaction(data, wait) { debug('query getOneTransaction(%s, %s, %s)', `${data.blockId.workchain},${data.blockId.shard.toString(16)},${data.blockId.seqno}`, `${data.accountId.workchain}:${ton3_core_1.Utils.Helpers.bytesToHex(data.accountId.id)}`, data.lt.toString(10)); return this.query((dataWriter) => { functions.liteServer.getOneTransaction(dataWriter, data.blockId, data.accountId, data.lt); }, wait); } runSmcMethod(data, wait) { debug('query runSmcMethod()'); return this.query((dataWriter) => { functions.liteServer.runSmcMethod(dataWriter, data.blockId, data.accountId, data.methodId, data.params); }, wait); } sendMessage(body, wait) { debug('query sendMessage()'); return this.query((dataWriter) => { functions.liteServer.sendMessage(dataWriter, body); }, wait); } } exports.LiteApi = LiteApi; _LiteApi_events = new WeakMap(); //# sourceMappingURL=index.js.map