-
Install global package paraemu
npm i -g paraemu
-
Setting config file:
File structure:
{ "server": undefined | { // server config "host": @string, "port": @int }, "remote": undefined | { // client config "host": @string, "port": @int }, "processes" : [ { "tag": undefined | @string, "root": undefined | @string, // root path "script": @string, // execute file name "args": undefined | [ @any, ... ], // node js command line arguments "env": undefined | [ @string, ... ] // node js command line options }, ... ] }
- Script execute path is
./${root}/${script}
.
Central Example:
// ./test/config-central.json { "server": { "host": "127.0.0.1", "port": 23410 }, "processes" : [ { "root": "./content/central/", "script": "./central.js" } ] }
Node Example:
// ./test/config-single-node.json { "remote": { "host": "127.0.0.1", "port": 23410 }, "processes" : [ { "root": "./content/single-node", "script": "./node.js" } ] }
- Script execute path is
-
Write script file:
(1) Central Example:
// ./test/content/central/central.js const pemu = require('paraemu'); /** * Node connect logic * @async * @param {string} nodeId * @return {Promise<string[]>} Neighbor node ids */ pemu.nodeConnect = async (nodeId) => { ... return neighborNodeIds; }; /** * Node disconnect logic * @async * @param {string} nodeId * @return {Promise<undefined>} */ pemu.nodeDisconnect = async (nodeId) => { ... }; /** * Node group detach logic * @async * @param {string} groupId * @return {Promise<string[]>} Node ids */ pemu.nodeGroupDetach = async (groupId) => { ... return nodeIds; }; /** * Fetch neighbors logic * @async * @param {string} nodeId * @return {Promise<string[]>} Neighbor node ids */ pemu.fetchNeighbors = async (nodeId) => { ... return nodeIds; }; // expand p2p pack require('paraemu-p2p-pack').expand(pemu, 'central'); /** * Do something before init function call promise resolve */ let function1 = () => { ... }; await pemu.initP2PEnv(function1); // init central
(2) Node Example:
// ./test/content/single-node/node.js const pemu = require('paraemu'); /** * Node agree or disagree to become a peer (Optional) * @param {string} nodeId node id for asker * @return {boolean} true: agree, false: disagree */ pemu.canAddPeer = (nodeId) => { ... }; // expand p2p pack require('paraemu-p2p-pack').expand(pemu, 'node'); // set maximum peers (after require p2p-pack) pemu.maxPeers = 5; /** * Do something before init function call promise resolve */ let function2 = () => { ... }; await pemu.initP2PEnv(function2); // init node // paraemu p2p default event pemu.on('__p2p-update-neighbors', callback); // old node can update wired neighbors // paraemu p2p method await pemu.fetchNeighbors(); // fetch the newest wired neighbors and save those to cache await pemu.findPeer(); // find peers by wired neighbors in cache and save those to cache await pemu.disconnect(); // disconnect // paraemu p2p property console.log(pemu.wiredNeighbors); // list of wired neighbors in cache console.log(pemu.peers); // list of peers in cache
-
Run command line:
paraemu ./config.json
-
Debug task use Chrome DevTools (Optional):
(1) Add "--inspect-brk" in "env" field in config.json
(2) Run commend line which is similar to step 3
(3) Url set "chrome://inspect" in Chrome
(4) Click "Open dedicated DevTools for Node" link
(5) Click "Add connection" button
(6) Add "localhost:9230" in url field
(Debugger listening start from 9230 port in first child process)
(7) Press "F5" key to refresh page
(8) Click "inspect" link in Remote Target -
Debug main task use Chrome DevTools (Optional):
(1) Run command line which is different from step 3:paraemu --inspect-brk ./config
(2) Url set "chrome://inspect" in Chrome
(3) Click"Open dedicated DevTools for Node" link
(4) Click "Add connection" button
(5) Add "localhost:9229" in url field
(Debugger listening start from 9229 port in main process)
(6) Press "F5" key to refresh page
(7) Click "inspect" link in Remote Target
- Group: Total workspace in config.
- Task: Each child process in config.
- Job: Detailed work in each child process.
-
Clone project:
git clone <project-url>
-
Install dependency package:
npm install
-
Run test-all (use npm):
npm run test-all
-
Run test-central (use npm):
npm run test-central
-
Run test-multi-node (use npm):
npm run test-multi-node
-
Run test-single-node (use npm):
npm run test-single-node