mirror of
https://github.com/fluencelabs/registry-demo
synced 2025-04-25 00:02:14 +00:00
WIP
This commit is contained in:
parent
3a0e71f892
commit
0700c8ec54
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
bundle/
|
||||
/dist/
|
||||
/worker/dist/
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
.idea
|
||||
|
||||
# fluence
|
||||
|
||||
public/*.wasm
|
||||
public/runnerScript.web.js
|
8
.prettierrc.js
Normal file
8
.prettierrc.js
Normal file
@ -0,0 +1,8 @@
|
||||
module.exports = {
|
||||
semi: true,
|
||||
trailingComma: 'all',
|
||||
singleQuote: true,
|
||||
printWidth: 120,
|
||||
tabWidth: 4,
|
||||
useTabs: false,
|
||||
};
|
3
aqua/export.aqua
Normal file
3
aqua/export.aqua
Normal file
@ -0,0 +1,3 @@
|
||||
module Export
|
||||
import advertiseMyself, getMembers from "hello-registry.aqua"
|
||||
export advertiseMyself, getMembers
|
36
aqua/hello-registry.aqua
Normal file
36
aqua/hello-registry.aqua
Normal file
@ -0,0 +1,36 @@
|
||||
module HelloRegistry declares advertiseMyself, getMembers
|
||||
|
||||
import initTopicAndSubscribe, findSubscribers from "@fluencelabs/aqua-dht/pubsub.aqua"
|
||||
import "@fluencelabs/aqua-dht/dht.aqua"
|
||||
import "@fluencelabs/aqua-lib/builtin.aqua"
|
||||
|
||||
alias PeerId: string
|
||||
|
||||
service MessagingService("messaging"):
|
||||
receiveMessage(msg: string)
|
||||
|
||||
func advertiseMyself(label: string) -> string:
|
||||
relay_id: ?string
|
||||
relay_id <<- HOST_PEER_ID
|
||||
initTopicAndSubscribe(label, "myValue", relay_id, nil)
|
||||
<- "ok"
|
||||
|
||||
func getMembers(label: string) -> []string:
|
||||
res <- Op.array("1", "2", "3", "4")
|
||||
<- res
|
||||
|
||||
func callSubscriber(sub: Record, msg: string):
|
||||
on sub.peer_id via sub.relay_id:
|
||||
MessagingService.receiveMessage(msg)
|
||||
|
||||
func sendMyself(hostPeerId: string, relayPeerId: string, msg: string) -> string:
|
||||
on hostPeerId via relayPeerId:
|
||||
MessagingService.receiveMessage(msg)
|
||||
<- "ok"
|
||||
|
||||
func sendEveryone(topic: string, msg: string) -> string:
|
||||
on HOST_PEER_ID:
|
||||
subscribers <- findSubscribers(topic)
|
||||
for sub <- subscribers par:
|
||||
callSubscriber(sub, msg)
|
||||
<- "ok"
|
28
index.html
Normal file
28
index.html
Normal file
@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>Webpack App</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app" class="hidden">
|
||||
<div>your peer id: <span id="peerid"></span></div>
|
||||
<div>
|
||||
<label>your name</label>
|
||||
<input type="text" id="name" value="my name" />
|
||||
</div>
|
||||
<div>
|
||||
<button id="start">start room</button>
|
||||
</div>
|
||||
<div>
|
||||
<canvas id="qrcode" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<span>users in room</span>
|
||||
<ul id="room-list"></ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="loading">loading</div>
|
||||
</body>
|
||||
</html>
|
23787
package-lock.json
generated
Normal file
23787
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
45
package.json
Normal file
45
package.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"name": "registry-demo",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"postinstall": "copy-avm-public public",
|
||||
"start": "webpack serve",
|
||||
"prestart": "npm run compile-aqua",
|
||||
"prebuild": "npm run compile-aqua",
|
||||
"copy-public": "copy-avm public && copy-avm-runner public",
|
||||
"build": "webpack --mode=production --node-env=production",
|
||||
"build:dev": "webpack --mode=development",
|
||||
"build:prod": "webpack --mode=production --node-env=production",
|
||||
"watch": "webpack --watch",
|
||||
"serve": "webpack serve",
|
||||
"compile-aqua": "aqua -i ./aqua/ -o ./src/_aqua",
|
||||
"watch-aqua": "chokidar \"**/*.aqua\" -c \"npm run compile-aqua\""
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@fluencelabs/fluence": "^0.20.1",
|
||||
"@fluencelabs/fluence-network-environment": "^1.0.13",
|
||||
"process": "^0.11.10",
|
||||
"qrcode": "^1.5.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@fluencelabs/aqua": "^0.6.1-279",
|
||||
"@fluencelabs/aqua-dht": "^0.2.5",
|
||||
"@fluencelabs/aqua-lib": "^0.4.0",
|
||||
"@fluencelabs/marine-js": "^0.1.0",
|
||||
"@types/qrcode": "^1.4.2",
|
||||
"@webpack-cli/generators": "^2.4.1",
|
||||
"css-loader": "^6.5.1",
|
||||
"html-webpack-plugin": "^5.5.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-loader": "^8.3.0",
|
||||
"typescript": "^4.5.4",
|
||||
"util": "^0.12.4",
|
||||
"webpack": "^5.65.0",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"webpack-dev-server": "^4.6.0"
|
||||
}
|
||||
}
|
179
src/_aqua/export.ts
Normal file
179
src/_aqua/export.ts
Normal file
@ -0,0 +1,179 @@
|
||||
/**
|
||||
*
|
||||
* This file is auto-generated. Do not edit manually: changes may be erased.
|
||||
* Generated by Aqua compiler: https://github.com/fluencelabs/aqua/.
|
||||
* If you find any bugs, please write an issue on GitHub: https://github.com/fluencelabs/aqua/issues
|
||||
* Aqua version: 0.6.1-279
|
||||
*
|
||||
*/
|
||||
import { Fluence, FluencePeer } from '@fluencelabs/fluence';
|
||||
import {
|
||||
CallParams,
|
||||
callFunction,
|
||||
registerService,
|
||||
} from '@fluencelabs/fluence/dist/internal/compilerSupport/v2';
|
||||
|
||||
|
||||
// Services
|
||||
|
||||
// Functions
|
||||
|
||||
|
||||
export function getMembers(
|
||||
label: string,
|
||||
config?: {ttl?: number}
|
||||
): Promise<string[]>;
|
||||
|
||||
export function getMembers(
|
||||
peer: FluencePeer,
|
||||
label: string,
|
||||
config?: {ttl?: number}
|
||||
): Promise<string[]>;
|
||||
|
||||
export function getMembers(...args: any) {
|
||||
|
||||
let script = `
|
||||
(xor
|
||||
(seq
|
||||
(seq
|
||||
(seq
|
||||
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
|
||||
(call %init_peer_id% ("getDataSrv" "label") [] label)
|
||||
)
|
||||
(call %init_peer_id% ("op" "array") ["1" "2" "3" "4"] res)
|
||||
)
|
||||
(xor
|
||||
(call %init_peer_id% ("callbackSrv" "response") [res])
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
|
||||
)
|
||||
)
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
|
||||
)
|
||||
`
|
||||
return callFunction(
|
||||
args,
|
||||
{
|
||||
"functionName" : "getMembers",
|
||||
"returnType" : {
|
||||
"tag" : "primitive"
|
||||
},
|
||||
"argDefs" : [
|
||||
{
|
||||
"name" : "label",
|
||||
"argType" : {
|
||||
"tag" : "primitive"
|
||||
}
|
||||
}
|
||||
],
|
||||
"names" : {
|
||||
"relay" : "-relay-",
|
||||
"getDataSrv" : "getDataSrv",
|
||||
"callbackSrv" : "callbackSrv",
|
||||
"responseSrv" : "callbackSrv",
|
||||
"responseFnName" : "response",
|
||||
"errorHandlingSrv" : "errorHandlingSrv",
|
||||
"errorFnName" : "error"
|
||||
}
|
||||
},
|
||||
script
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
||||
export function advertiseMyself(
|
||||
label: string,
|
||||
config?: {ttl?: number}
|
||||
): Promise<string>;
|
||||
|
||||
export function advertiseMyself(
|
||||
peer: FluencePeer,
|
||||
label: string,
|
||||
config?: {ttl?: number}
|
||||
): Promise<string>;
|
||||
|
||||
export function advertiseMyself(...args: any) {
|
||||
|
||||
let script = `
|
||||
(xor
|
||||
(seq
|
||||
(seq
|
||||
(seq
|
||||
(call %init_peer_id% ("getDataSrv" "-relay-") [] -relay-)
|
||||
(call %init_peer_id% ("getDataSrv" "label") [] label)
|
||||
)
|
||||
(new $relay_id
|
||||
(seq
|
||||
(ap -relay- $relay_id)
|
||||
(xor
|
||||
(seq
|
||||
(seq
|
||||
(call -relay- ("op" "string_to_b58") [label] k)
|
||||
(call -relay- ("kad" "neighborhood") [k [] []] nodes)
|
||||
)
|
||||
(par
|
||||
(fold nodes n
|
||||
(par
|
||||
(xor
|
||||
(xor
|
||||
(seq
|
||||
(seq
|
||||
(call n ("peer" "timestamp_sec") [] t)
|
||||
(call n ("aqua-dht" "register_key") [label t false 0])
|
||||
)
|
||||
(call n ("aqua-dht" "put_value") [label "myValue" t $relay_id [] 0])
|
||||
)
|
||||
(null)
|
||||
)
|
||||
(seq
|
||||
(call -relay- ("op" "noop") [])
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 1])
|
||||
)
|
||||
)
|
||||
(next n)
|
||||
)
|
||||
)
|
||||
(null)
|
||||
)
|
||||
)
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 2])
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(xor
|
||||
(call %init_peer_id% ("callbackSrv" "response") ["ok"])
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 3])
|
||||
)
|
||||
)
|
||||
(call %init_peer_id% ("errorHandlingSrv" "error") [%last_error% 4])
|
||||
)
|
||||
`
|
||||
return callFunction(
|
||||
args,
|
||||
{
|
||||
"functionName" : "advertiseMyself",
|
||||
"returnType" : {
|
||||
"tag" : "primitive"
|
||||
},
|
||||
"argDefs" : [
|
||||
{
|
||||
"name" : "label",
|
||||
"argType" : {
|
||||
"tag" : "primitive"
|
||||
}
|
||||
}
|
||||
],
|
||||
"names" : {
|
||||
"relay" : "-relay-",
|
||||
"getDataSrv" : "getDataSrv",
|
||||
"callbackSrv" : "callbackSrv",
|
||||
"responseSrv" : "callbackSrv",
|
||||
"responseFnName" : "response",
|
||||
"errorHandlingSrv" : "errorHandlingSrv",
|
||||
"errorFnName" : "error"
|
||||
}
|
||||
},
|
||||
script
|
||||
)
|
||||
}
|
3
src/index.css
Normal file
3
src/index.css
Normal file
@ -0,0 +1,3 @@
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
54
src/index.ts
Normal file
54
src/index.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import './index.css';
|
||||
|
||||
import { Fluence } from '@fluencelabs/fluence';
|
||||
import { krasnodar } from '@fluencelabs/fluence-network-environment';
|
||||
import QRCode from 'qrcode';
|
||||
import { advertiseMyself, getMembers } from './_aqua/export';
|
||||
|
||||
const label = 'registry-demo';
|
||||
|
||||
async function main() {
|
||||
await Fluence.start({
|
||||
connectTo: krasnodar[4],
|
||||
});
|
||||
|
||||
const selfPeerId = Fluence.getStatus().peerId;
|
||||
|
||||
const peerIdElem = document.getElementById('peerid')!;
|
||||
peerIdElem.textContent = selfPeerId;
|
||||
|
||||
const startElem = document.getElementById('start')!;
|
||||
|
||||
startElem.onclick = async () => {
|
||||
const res = await advertiseMyself(label);
|
||||
// if(res is not fine)
|
||||
// throw
|
||||
|
||||
const qrcodeElem = document.getElementById('qrcode')!;
|
||||
const link = window.location.origin + '?join=' + selfPeerId;
|
||||
await QRCode.toCanvas(qrcodeElem, link, {
|
||||
width: 640,
|
||||
});
|
||||
|
||||
setTimeout(async () => {
|
||||
const members = await getMembers(label);
|
||||
console.log(members);
|
||||
const liElems = members.map((x) => {
|
||||
const el = document.createElement('li');
|
||||
el.textContent = x;
|
||||
return el;
|
||||
});
|
||||
const roomElem = document.getElementById('room-list');
|
||||
roomElem?.replaceChildren(...liElems);
|
||||
}, 1000);
|
||||
};
|
||||
|
||||
document.getElementById('loading')!.classList.add('hidden');
|
||||
document.getElementById('app')!.classList.remove('hidden');
|
||||
|
||||
// console.log('stopping fluence');
|
||||
|
||||
// await Fluence.stop();
|
||||
}
|
||||
|
||||
main();
|
26
tsconfig.json
Normal file
26
tsconfig.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"es2015",
|
||||
"dom"
|
||||
],
|
||||
"outDir": "./dist/",
|
||||
"target": "es5",
|
||||
"module": "commonjs",
|
||||
"strict": true,
|
||||
"esModuleInterop": true,
|
||||
"skipLibCheck": true,
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"declaration": true,
|
||||
"declarationMap": false,
|
||||
"sourceMap": true,
|
||||
"noImplicitAny": false
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"dist"
|
||||
],
|
||||
"include": [
|
||||
"src"
|
||||
]
|
||||
}
|
67
webpack.config.js
Normal file
67
webpack.config.js
Normal file
@ -0,0 +1,67 @@
|
||||
// Generated using webpack-cli https://github.com/webpack/webpack-cli
|
||||
|
||||
const webpack = require('webpack');
|
||||
const path = require('path');
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||
|
||||
// const isProduction = process.env.NODE_ENV == 'production';
|
||||
const isProduction = false;
|
||||
|
||||
const stylesHandler = 'style-loader';
|
||||
|
||||
const config = {
|
||||
entry: './src/index.ts',
|
||||
output: {
|
||||
path: path.resolve(__dirname, 'dist'),
|
||||
},
|
||||
devServer: {
|
||||
open: true,
|
||||
host: 'localhost',
|
||||
static: {
|
||||
directory: path.join(__dirname, 'public'),
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
new HtmlWebpackPlugin({
|
||||
template: 'index.html',
|
||||
}),
|
||||
new webpack.ProvidePlugin({
|
||||
process: 'process/browser',
|
||||
}),
|
||||
|
||||
// Add your plugins here
|
||||
// Learn more about plugins from https://webpack.js.org/configuration/plugins/
|
||||
],
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.(ts|tsx)$/i,
|
||||
loader: 'ts-loader',
|
||||
exclude: ['/node_modules/'],
|
||||
},
|
||||
{
|
||||
test: /\.css$/i,
|
||||
use: [stylesHandler, 'css-loader'],
|
||||
},
|
||||
{
|
||||
test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
|
||||
type: 'asset',
|
||||
},
|
||||
|
||||
// Add your rules for custom modules here
|
||||
// Learn more about loaders from https://webpack.js.org/loaders/
|
||||
],
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.ts', '.js', 'css'],
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = () => {
|
||||
if (isProduction) {
|
||||
config.mode = 'production';
|
||||
} else {
|
||||
config.mode = 'development';
|
||||
}
|
||||
return config;
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user