@tangle-js/anchors
Version:
Anchoring messages to the Tangle. Powered by IOTA Streams
83 lines • 7.46 kB
JavaScript
import { Author, Subscriber, Address, ChannelType, StreamsClient } from "@tangle.js/streams-wasm/node/streams.js";
import { AnchoringChannelError } from "../errors/anchoringChannelError.mjs";
import { AnchoringChannelErrorNames } from "../errors/anchoringChannelErrorNames.mjs";
import { ChannelHelper } from "../helpers/channelHelper.mjs";
/**
* Service to interact with IOTA Streams Channels
*
*/
export default class ChannelService {
/**
* Creates a new Channel
* @param client The client to use
* @param seed The channel's seed
* @param isPrivate Whether the channel is private or not
* @param psks Preshared keys for the channel
* @returns The address of the channel created and the announce message ID
*/
static async createChannel(client, seed, isPrivate, psks) {
try {
const auth = Author.fromClient(client, seed, ChannelType.SingleBranch);
const response = await auth.clone().send_announce();
const announceLink = response.link.copy();
let keyLoadMsgID;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare
if (isPrivate === true) {
const presharedKeys = psks || [];
keyLoadMsgID = await this.preparePrivateChannel(announceLink, auth, presharedKeys);
}
return {
announceMsgID: announceLink.msgId.toString(),
channelAddress: auth.channel_address(),
authorPk: auth.get_public_key(),
keyLoadMsgID
};
}
catch (error) {
throw new AnchoringChannelError(AnchoringChannelErrorNames.OTHER_ERROR, error.message);
}
}
/**
* Binds to a channel by creating the corresponding IOTA Streams Subscriber and reading
* the announce message
*
* @param request The channel details
* @returns IOTA Streams Subscriber object
*/
static async bindToChannel(request) {
let subscriber;
let keyLoadReceived = true;
try {
subscriber = Subscriber.fromClient(request.client, request.seed);
const channel = request.channelID;
const [channelAddr, announceMsgID, keyLoadMsgID] = channel.split(":");
const announceLink = ChannelHelper.parseAddress(`${channelAddr}:${announceMsgID}`);
await subscriber.clone().receive_announcement(announceLink);
if (request.isPrivate) {
if (request.presharedKey) {
subscriber.clone().store_psk(request.presharedKey);
}
const keyLoadLinkStr = `${request.channelID.split(":")[0]}:${keyLoadMsgID}`;
const keyLoadLink = ChannelHelper.parseAddress(keyLoadLinkStr);
keyLoadReceived = await subscriber.clone().receive_keyload(keyLoadLink);
}
}
catch {
throw new AnchoringChannelError(AnchoringChannelErrorNames.CHANNEL_BINDING_ERROR, `Cannot bind to channel ${request.channelID}`);
}
// If the "keyload" has not been received we cannot continue it is a not allowed subscriber
if (!keyLoadReceived) {
throw new AnchoringChannelError(AnchoringChannelErrorNames.CHANNEL_BINDING_PERMISSION_ERROR, `Not allowed to bind to ${request.channelID}.`);
}
return { subscriber, authorPk: subscriber.author_public_key() };
}
static async preparePrivateChannel(announceLink, auth, psks) {
for (const psk of psks) {
auth.store_psk(psk);
}
const keyLoadResponse = await auth.clone().send_keyload_for_everyone(announceLink.copy());
const keyLoadLinkCopy = keyLoadResponse.link.copy();
return keyLoadLinkCopy.msgId.toString();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbFNlcnZpY2UubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL2NoYW5uZWxTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sY0FBYztJQUMvQjs7Ozs7OztPQU9HO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBcUIsRUFBRSxJQUFZLEVBQUUsU0FBa0IsRUFBRSxJQUFlO1FBRXRHLElBQUk7WUFDQSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXZFLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFMUMsSUFBSSxZQUFvQixDQUFDO1lBRXpCLHFGQUFxRjtZQUNyRixJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQ3RGO1lBRUQsT0FB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