Move non-relevant code from Marine repo into FluenceJS (#227)

1. Move marine-related part into FJS repo (DXJ184)
2. Move towards component-oriented architecture (DXJ183)
3. Different JS Client distros for node.js and web (DXJ185)
This commit is contained in:
Pavel
2023-01-09 15:51:15 +03:00
committed by GitHub
parent dcb15b7d3c
commit 267ebb687f
220 changed files with 7421 additions and 6362 deletions

19
packages/@tests/marine/node/.gitignore vendored Normal file
View File

@ -0,0 +1,19 @@
# 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

View File

@ -0,0 +1,8 @@
module.exports = {
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 4,
useTabs: false,
};

View File

@ -0,0 +1,5 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
testPathIgnorePatterns: ['dist'],
};

View File

@ -0,0 +1,19 @@
{
"name": "@test/marine_node",
"scripts": {
"build": "tsc",
"test": "jest"
},
"devDependencies": {
"@types/node": "16.11.59",
"typescript": "^4.0.0",
"@types/jest": "28.1.0",
"jest": "28.1.0",
"ts-jest": "28.0.2"
},
"dependencies": {
"@fluencelabs/avm": "0.32.1",
"@fluencelabs/marine.background-runner": "workspace:0.1.0",
"@fluencelabs/marine.deps-loader.node": "workspace:0.1.0"
}
}

View File

@ -0,0 +1,54 @@
import { MarineBackgroundRunner } from '@fluencelabs/marine.background-runner';
import { InlinedWorkerLoader, WasmNpmLoader } from '@fluencelabs/marine.deps-loader.node';
import { callAvm, JSONArray, JSONObject } from '@fluencelabs/avm';
const vmPeerId = '12D3KooWNzutuy8WHXDKFqFsATvCR6j9cj2FijYbnd47geRKaQZS';
describe('Nodejs integration tests', () => {
it('Smoke test', async () => {
let runner: MarineBackgroundRunner | undefined = undefined;
try {
// arrange
const avm = new WasmNpmLoader('@fluencelabs/avm', 'avm.wasm');
const control = new WasmNpmLoader('@fluencelabs/marine-js', 'marine-js.wasm');
const worker = new InlinedWorkerLoader();
runner = new MarineBackgroundRunner(worker, control, () => {});
await avm.start();
await runner.start();
await runner.createService(avm.getValue(), 'avm');
const s = `(seq
(par
(call "${vmPeerId}" ("local_service_id" "local_fn_name") [] result_1)
(call "remote_peer_id" ("service_id" "fn_name") [] g)
)
(call "${vmPeerId}" ("local_service_id" "local_fn_name") [] result_2)
)`;
// act
const res = await callAvm(
(args: JSONArray | JSONObject) => runner!.callService('avm', 'invoke', args, undefined),
{
currentPeerId: vmPeerId,
initPeerId: vmPeerId,
timestamp: Date.now(),
ttl: 10000,
},
s,
Buffer.from(''),
Buffer.from(''),
[],
);
// assert
expect(res).toMatchObject({
retCode: 0,
errorMessage: '',
});
} finally {
runner?.stop();
}
});
});

View File

@ -0,0 +1,17 @@
{
"compilerOptions": {
"lib": ["es2015", "dom"],
"outDir": "./dist/",
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"declaration": true,
"declarationMap": false,
"sourceMap": true
},
"exclude": ["node_modules", "dist"],
"include": ["src"]
}

22
packages/@tests/marine/web/.gitignore vendored Normal file
View File

@ -0,0 +1,22 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
build/
public/*.*
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
bundle/
/dist/
/worker/dist/
# Dependency directories
node_modules/
jspm_packages/
.idea

View File

@ -0,0 +1,8 @@
module.exports = {
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 4,
useTabs: false,
};

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Webpack App</title>
</head>
<body>
<h1>Hello world!</h1>
<h2>Tip: Check your console</h2>
</body>
</html>

View File

@ -0,0 +1,9 @@
module.exports = {
preset: 'jest-puppeteer',
testMatch: ['**/?(*.)+(spec|test).[t]s'],
testPathIgnorePatterns: ['/node_modules/', 'dist'],
testMatch: ['**/test/*.spec.ts'],
transform: {
'^.+\\.ts?$': 'ts-jest',
},
};

View File

@ -0,0 +1,39 @@
{
"name": "@test/marine_web",
"version": "0.1.0",
"scripts": {
"start": "webpack serve",
"test": "jest",
"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"
},
"devDependencies": {
"@webpack-cli/generators": "^2.4.1",
"css-loader": "^6.5.1",
"html-webpack-plugin": "^5.5.0",
"install-local": "^3.0.1",
"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",
"@types/jest": "^27.0.3",
"@types/jest-environment-puppeteer": "^4.4.1",
"@types/puppeteer": "^5.4.4",
"jest": "28.1.0",
"jest-puppeteer": "^6.0.2",
"ts-jest": "28.0.2"
},
"dependencies": {
"@fluencelabs/marine.deps-loader.web": "workspace:*",
"@fluencelabs/marine.background-runner": "workspace:*",
"@fluencelabs/avm": "0.34.4",
"js-base64": "^3.7.2",
"buffer": "6.0.3"
}
}

View File

@ -0,0 +1,56 @@
import { Buffer } from 'buffer';
// @ts-ignore
window.Buffer = Buffer;
import { MarineBackgroundRunner } from '@fluencelabs/marine.background-runner';
import { InlinedWorkerLoader, WasmWebLoader } from '@fluencelabs/marine.deps-loader.web';
import { callAvm, JSONArray, JSONObject } from '@fluencelabs/avm';
import { toUint8Array } from 'js-base64';
const vmPeerId = '12D3KooWNzutuy8WHXDKFqFsATvCR6j9cj2FijYbnd47geRKaQZS';
const b = (s: string) => {
return toUint8Array(s);
};
const main = async () => {
const avm = new WasmWebLoader('avm.wasm');
const control = new WasmWebLoader('marine-js.wasm');
const worker = new InlinedWorkerLoader();
const runner = new MarineBackgroundRunner(worker, control, () => {});
await runner.start();
await avm.start();
const avmVal = await avm.getValue();
await runner.createService(avmVal, 'avm');
const s = `(seq
(par
(call "${vmPeerId}" ("local_service_id" "local_fn_name") [] result_1)
(call "remote_peer_id" ("service_id" "fn_name") [] g)
)
(call "${vmPeerId}" ("local_service_id" "local_fn_name") [] result_2)
)`;
// act
const res = await callAvm(
(args: JSONArray | JSONObject) => runner.callService('avm', 'invoke', args, undefined),
{
currentPeerId: vmPeerId,
initPeerId: vmPeerId,
timestamp: Date.now(),
ttl: 10000,
},
s,
b(''),
b(''),
[],
);
await runner.stop();
return res;
};
// @ts-ignore
window.MAIN = main;

View File

@ -0,0 +1,115 @@
import Webpack from 'webpack';
import WebpackDevServer from 'webpack-dev-server';
import webpackConfig from '../webpack.config.js';
import process from 'process';
import path from 'path';
import fs from 'fs';
// change directory to the location to the test-project.
// run all the subsequent Webpack scripts in that directory
process.chdir(path.join(__dirname, '..'));
let server;
const port = 8080;
jest.setTimeout(10000);
const startServer = async (modifyConfig?) => {
const loadInBrowserToDebug = false;
// const loadInBrowserToDebug = true; // use this line to debug
modifyConfig = modifyConfig || ((_) => {});
const config: any = webpackConfig();
modifyConfig(config);
config.devServer.open = loadInBrowserToDebug;
server = await makeServer(config);
};
// https://stackoverflow.com/questions/42940550/wait-until-webpack-dev-server-is-ready
function makeServer(config) {
return new Promise((resolve, reject) => {
const compiler = Webpack(config);
let compiled = false;
let listening = false;
compiler.hooks.done.tap('tap_name', () => {
// console.log('compiled');
if (listening) resolve(server);
else compiled = true;
});
const server = new WebpackDevServer(compiler, config.devServer);
server.listen(port, '0.0.0.0', (err) => {
if (err) return reject(err);
// console.log('listening');
if (compiled) {
resolve(server);
} else {
listening = true;
}
});
});
}
const stopServer = async () => {
console.log('test: stopping server');
await server.stop();
};
const publicDir = 'public';
const copyFile = async (packageName: string, fileName: string) => {
const modulePath = require.resolve(packageName);
const source = path.join(path.dirname(modulePath), fileName);
const dest = path.join(publicDir, fileName);
return fs.promises.copyFile(source, dest);
};
const copyPublicDeps = async () => {
await fs.promises.mkdir(publicDir, { recursive: true });
return Promise.all([
copyFile('@fluencelabs/marine-js', 'marine-js.wasm'),
copyFile('@fluencelabs/avm', 'avm.wasm'),
]);
};
const cleanPublicDeps = () => {
return fs.promises.rm(publicDir, { recursive: true, force: true });
};
describe('Browser integration tests', () => {
beforeEach(async () => {
await copyPublicDeps();
});
afterEach(async () => {
await stopServer();
await cleanPublicDeps();
});
it('Some test', async () => {
console.log('test: starting server...');
await startServer();
console.log('test: navigating to page...');
await page.goto('http://localhost:8080/');
console.log('test: running script in browser...');
const res = await page.evaluate(() => {
// @ts-ignore
return window.MAIN();
});
console.log('test: checking expectations...');
await expect(res).toMatchObject({
retCode: 0,
errorMessage: '',
});
});
});

View File

@ -0,0 +1,23 @@
{
"compilerOptions": {
"outDir": "./dist/",
"allowJs": true,
"baseUrl": ".",
"sourceMap": false,
"inlineSources": false,
"pretty": true,
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"declaration": false,
"esModuleInterop": true,
"declarationMap": false,
"strict": true,
"noImplicitAny": false,
"alwaysStrict": true,
"noImplicitThis": true,
"strictNullChecks": false
},
"exclude": ["node_modules", "dist"],
"include": ["src", "test"]
}

View File

@ -0,0 +1,65 @@
// Generated using webpack-cli https://github.com/webpack/webpack-cli
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const isProduction = process.env.NODE_ENV == 'production';
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',
}),
// 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: ['.tsx', '.ts', '.js'],
fallback: {
buffer: require.resolve('buffer/'),
},
},
};
module.exports = () => {
if (isProduction) {
config.mode = 'production';
} else {
config.mode = 'development';
}
return config;
};

View File

@ -3,13 +3,13 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@fluencelabs/fluence": "workspace:*",
"@fluencelabs/js-client.web": "workspace:*",
"@fluencelabs/fluence-network-environment": "^1.0.13",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/jest": "^27.5.2",
"@types/node": "^16.11.56",
"@types/node": "16.11.59",
"@types/react": "^18.0.18",
"@types/react-dom": "^18.0.6",
"react": "^18.2.0",
@ -21,7 +21,7 @@
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"_test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {

View File

@ -2,16 +2,18 @@ import React, { useEffect, useState } from "react";
import logo from "./logo.svg";
import "./App.css";
import { Fluence } from "@fluencelabs/fluence";
import { makeDefaultPeer } from "@fluencelabs/js-client.web";
import { krasnodar } from "@fluencelabs/fluence-network-environment";
const relayNode = krasnodar[4];
const peer = makeDefaultPeer();
function App() {
const [connected, setConnected] = useState<boolean>(false);
useEffect(() => {
Fluence.start({ connectTo: relayNode })
peer.start({ connectTo: relayNode })
.then(() => {
setConnected(true);
})

View File

@ -17,10 +17,11 @@
"license": "Apache-2.0",
"dependencies": {
"@fluencelabs/fluence": "workspace:*",
"ts-node": "^10.9.1"
"@fluencelabs/js-client.node": "workspace:*",
"ts-node": "10.9.1"
},
"devDependencies": {
"@types/node": "^18.7.13",
"typescript": "^4.6.4"
"@types/node": "16.11.59",
"typescript": "4.6.4"
}
}

View File

@ -1,6 +1,7 @@
import { FluencePeer } from "@fluencelabs/fluence";
import "@fluencelabs/js-client.node";
import { Fluence } from "@fluencelabs/fluence";
const peer = new FluencePeer();
const peer = Fluence.getPeer();
const main = async () => {
await peer.start({});