js-waku-examples/relay-js/index.html

116 lines
4.5 KiB
HTML
Raw Normal View History

2022-06-17 00:48:15 +00:00
<!DOCTYPE html>
<html lang='en'>
<head>
2022-08-31 03:05:59 +00:00
<meta charset='UTF-8'/>
<meta content='width=device-width, initial-scale=1.0' name='viewport'/>
<title>JS-Waku Chat</title>
2022-06-17 00:48:15 +00:00
</head>
<body>
<div><h1>Waku Node Status</h1></div>
<div id='status'></div>
2022-09-20 00:05:31 +00:00
<label for='textInput'>Message text</label>
2022-09-26 05:01:33 +00:00
<input id='textInput' placeholder='Type your message here' type='text' disabled>
<button id='sendButton' type='button' disabled>Send Message using Relay</button>
2022-06-17 00:48:15 +00:00
<div><h1>Messages</h1></div>
<div id='messages'></div>
2022-08-31 03:05:59 +00:00
<script type='module'>
/**
* Demonstrate usage of js-waku in the browser. Use relay, gossip sub protocol to send and receive messages.
* Recommended payload is protobuf. Using simple utf-8 string for demo purposes only.
*/
import {utils} from 'https://unpkg.com/js-waku@0.30.0/bundle/index.js';
import {createPrivacyNode} from 'https://unpkg.com/js-waku@0.30.0/bundle/lib/create_waku.js'
import {waitForRemotePeer} from 'https://unpkg.com/js-waku@0.30.0/bundle/lib/wait_for_remote_peer.js'
import {DecoderV0, EncoderV0} from "https://unpkg.com/js-waku@0.30.0/bundle/lib/waku_message/version_0.js";
2022-08-31 03:05:59 +00:00
const statusDiv = document.getElementById('status');
const messagesDiv = document.getElementById('messages');
const textInput = document.getElementById('textInput');
const sendButton = document.getElementById('sendButton');
// Every Waku Message has a content topic that categorizes it.
// It is always encoded in clear text.
// Recommendation: `/dapp-name/version/functionality/codec`
// We recommend to use protobuf as codec (`proto`), this demo uses utf-8
// for simplicity's sake.
const contentTopic = '/js-waku-examples/1/chat/utf8';
2022-08-31 03:05:59 +00:00
// Prepare encoder and decoder, `V0` for clear text messages.
const encoder = new EncoderV0(contentTopic);
const decoder = new DecoderV0(contentTopic);
2022-08-31 03:05:59 +00:00
try {
statusDiv.innerHTML = '<p>Starting</p>';
// Create and starts a Waku node.
// `default: true` bootstraps by connecting to pre-defined/hardcoded Waku nodes.
// We are currently working on migrating this method to DNS Discovery.
2022-06-17 00:48:15 +00:00
//
// https://js.waku.org/functions/lib_create_waku.createPrivacyNode.html
2022-09-15 06:30:54 +00:00
const waku = await createPrivacyNode({defaultBootstrap: true});
2022-08-31 03:05:59 +00:00
await waku.start();
2022-06-17 00:48:15 +00:00
2022-08-31 03:05:59 +00:00
// Had a hook to process all incoming messages on a specified content topic.
2022-06-17 00:48:15 +00:00
//
2022-08-31 03:05:59 +00:00
// https://js-waku.wakuconnect.dev/classes/waku_relay.WakuRelay.html#addObserver
waku.relay.addObserver(decoder, (message) => {
2022-08-31 03:05:59 +00:00
// Checks there is a payload on the message.
// Waku Message is encoded in protobuf, in proto v3 fields are always optional.
//
// https://js-waku.wakuconnect.dev/classes/waku_message.WakuMessage.html#payload
if (!message.payload)
2022-08-31 03:05:59 +00:00
return;
// Helper method to decode the payload to utf-8. A production dApp should
// use `wakuMessage.payload` (Uint8Array) which enables encoding a data
// structure of their choice.
//
// https://js-waku.wakuconnect.dev/classes/waku_message.WakuMessage.html#payloadAsUtf8
const text = utils.bytesToUtf8(message.payload);
2022-08-31 03:05:59 +00:00
messagesDiv.innerHTML = `<p>${text}</p><br />` + messagesDiv.innerHTML;
}, [contentTopic]);
statusDiv.innerHTML = '<p>Connecting to a peer</p>';
// Best effort method that waits for the Waku node to be connected to remote
// waku nodes (peers) and for appropriate handshakes to be done.
//
// https://js-waku.wakuconnect.dev/classes/waku.Waku.html#waitForRemotePeer
await waitForRemotePeer(waku);
// We are now connected to a remote peer, let's define the `sendMessage`
// function that sends the text input over Waku Relay, the gossipsub
// protocol.
sendButton.onclick = async () => {
const payload = utils.utf8ToBytes(textInput.value)
await waku.relay.send(encoder, {payload});
2022-08-31 03:05:59 +00:00
console.log('Message sent!');
// Reset the text input.
textInput.value = null;
};
// Ready to send & receive messages, enable text input.
textInput.disabled = false;
sendButton.disabled = false;
statusDiv.innerHTML = '<p>Ready!</p>';
} catch (e) {
statusDiv.innerHTML = 'Failed to start application';
console.log(e);
}
2022-06-17 00:48:15 +00:00
</script>
</body>
</html>