This commit is contained in:
Pavel Murygin 2022-02-23 19:23:44 +03:00
parent 3a0e71f892
commit 0700c8ec54
12 changed files with 24260 additions and 0 deletions

24
.gitignore vendored Normal file
View 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
View 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
View File

@ -0,0 +1,3 @@
module Export
import advertiseMyself, getMembers from "hello-registry.aqua"
export advertiseMyself, getMembers

36
aqua/hello-registry.aqua Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

45
package.json Normal file
View 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
View 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
View File

@ -0,0 +1,3 @@
.hidden {
display: none;
}

54
src/index.ts Normal file
View 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
View 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
View 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;
};