UNPKG

@tanglemesh/message.js

Version:

A simple package to do messaging tasks for publishing to the tangle (eg. MAM)

93 lines (77 loc) 3.44 kB
const Provider = require ('./provider'); const Mam = require ('@iota/mam'); const Message = require ('../message'); module.exports = class IOTAProvider extends Provider { constructor (provider, publisher = null, attatchToTangle = null, depth = 3, minWeightMagnitude = 14) { super (provider, publisher, attatchToTangle); this._depth = depth; this._minWeightMagnitude = minWeightMagnitude; } async createStream (messageStream) { //Nothing has to be done, because the channel on iota will automatically be created when publishing the first message } async updateState (messageStream) { //Fetch all available messages to get the latest mam-state const fetchResult = await Mam.fetch ( messageStream.State.Root, messageStream.State.Mode, messageStream.State.SideKey === null ? undefined : messageStream.State.SideKey, ); messageStream.State.NextRoot = fetchResult.nextRoot; messageStream.State.Start = messageStream.State.Start + fetchResult.messages.length; // Return the updated state return messageStream.State; } async publishMessages (messageStream, ...messages) { //Set attatchToTangle method if (this._attatchToTangle !== null) { Mam.setAttachToTangle (this._attatchToTangle); } //Send the messages to the tangle for (const message of messages) { const mamMessage = Mam.create (messageStream.State.MamState, message.Trytes); // await Mam.attach(payload, address, depth, minWeightMagnitude, tag) // => mamMessage.state, mamMessage.payload, mamMessage.root, mamMessage.address message.Transactions = await Mam.attach (mamMessage.payload, mamMessage.address, this._depth, this._minWeightMagnitude); messageStream.State.MamState = mamMessage.state; } return messages; } async fetchMessages (messageStream, filters = { fromRoot: null, limit: null, }) { //Set provider if it was set if (this._provider !== null) { Mam.setIOTA (this._provider); } //Use the filters to modify the fetch-result filters.fromRoot = !filters.fromRoot ? messageStream.State.NextRoot : filters.fromRoot; filters.limit = !filters.limit ? undefined : filters.limit; // await Mam.fetch(root, mode, sidekey, callback, limit) // => nextRoot, messages const fetchResult = await Mam.fetch ( filters.fromRoot, messageStream.State.Mode, messageStream.State.SideKey === null ? undefined : messageStream.State.SideKey, undefined, filters.limit ); //Create the messages if (!Array.isArray (fetchResult.messages)) { throw new Error ("@tanglemesh/message.js/stream.js: Error fetching the messages of the stream!"); } let messages = []; for (const message of fetchResult.messages) { messages.push ( new Message (messageStream, message) ); } //Update state if (messages.length >= 1) { messageStream.State.NextRoot = fetchResult.nextRoot; messageStream.State.Start = messageStream.State.Start + messages.length; } return messages; } };