@gear-js/api
Version:
A JavaScript library that provides functionality to connect GEAR Component APIs.
89 lines (86 loc) • 3.01 kB
JavaScript
;
class GearEvents {
api;
constructor(gearApi) {
this.api = gearApi;
}
subscribeToGearEvent(method, callback, fromBlock, blocks = 'latest') {
const handler = (events) => {
events
.filter(({ event }) => event.method === method)
.forEach(({ event }) => {
callback(event);
});
};
if (fromBlock) {
return this.api.blocks.subscribeToHeadsFrom(fromBlock, (header) => {
this.api
.at(header.hash)
.then((apiAt) => apiAt.query.system.events())
.then(handler);
}, blocks);
}
if (blocks === 'latest') {
return this.api.query.system.events(handler);
}
return this.api.rpc.chain.subscribeFinalizedHeads((header) => {
this.api
.at(header.hash)
.then((apiAt) => apiAt.query.system.events())
.then(handler);
});
}
subscribeToGearVoucherEvent(method, callback) {
return this.api.query.system.events((events) => {
events
.filter(({ event }) => event.method === method)
.forEach(({ event }) => {
callback(event);
});
});
}
#umsActorsMatch(from, to, event) {
if (event.data.message.source.eq(from) || event.data.message.destination.eq(to)) {
return true;
}
return false;
}
subscribeToUserMessageSentByActor(options, callback) {
return this.api.query.system.events((events) => {
events
.filter(({ event }) => event.method === 'UserMessageSent')
.forEach(({ event }) => {
if (this.#umsActorsMatch(options.from, options.to, event)) {
callback(event);
}
});
});
}
subscribeToTransferEvents(callback) {
return this.api.query.system.events((events) => {
events
.filter(({ event }) => this.api.events.balances.Transfer.is(event))
.forEach(({ event }) => {
callback(event);
});
});
}
/**
* @deprecated Use api.blocks.subscribeNewHeads instead
*/
subscribeToNewBlocks(callback) {
return this.api.rpc.chain.subscribeNewHeads((header) => {
callback(header);
});
}
async subscribeToBalanceChanges(accountAddress, callback) {
let { data: { free: previousFree }, } = (await this.api.query.system.account(accountAddress));
return this.api.query.system.account(accountAddress, ({ data: { free: currentFree } }) => {
if (!currentFree.sub(previousFree).isZero()) {
callback(this.api.createType('Balance', currentFree));
previousFree = currentFree;
}
});
}
}
exports.GearEvents = GearEvents;