mirror of
https://github.com/cerc-io/watcher-ts
synced 2025-01-22 02:59:06 +00:00
Add a chat CLI using peer package (#280)
* Add a flag to instantiate Peer for nodejs * Add a basic chat CLI using peer * Add a signal server arg to chat CLI * Add instructions for chat CLI
This commit is contained in:
parent
0b2eb5f760
commit
e07e0de408
36
packages/cli/README.md
Normal file
36
packages/cli/README.md
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# cli
|
||||||
|
|
||||||
|
## chat
|
||||||
|
|
||||||
|
A basic CLI to pass messages between peers using stdin/stdout
|
||||||
|
|
||||||
|
* Install dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn install
|
||||||
|
```
|
||||||
|
|
||||||
|
* Build the peer package:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd packages/peer
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
* Run a local signalling server (skip if an already running signalling server is available):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In packages/peer
|
||||||
|
yarn signal-server
|
||||||
|
```
|
||||||
|
|
||||||
|
* Start the node:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In packages/cli
|
||||||
|
yarn chat --signalServer [SIGNAL_SERVER_URL]
|
||||||
|
```
|
||||||
|
|
||||||
|
* `signalServer`: multiaddr of a signalling server (default: local signalling server multiaddr)
|
||||||
|
|
||||||
|
* The process starts reading from `stdin` and outputs messages from others peers to `stdout`.
|
@ -1,19 +1,23 @@
|
|||||||
{
|
{
|
||||||
"name": "@cerc-io/cli",
|
"name": "@cerc-io/cli",
|
||||||
"version": "0.2.18",
|
"version": "0.2.18",
|
||||||
"main": "dist/index.js",
|
"exports": "./dist/index.js",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"build": "yarn clean && tsc && yarn copy-assets",
|
"build": "yarn clean && tsc && yarn copy-assets",
|
||||||
"clean": "rm -rf ./dist",
|
"clean": "rm -rf ./dist",
|
||||||
"copy-assets": "copyfiles -u 1 src/**/*.gql dist/"
|
"copy-assets": "copyfiles -u 1 src/**/*.gql dist/",
|
||||||
|
"chat": "node dist/chat.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@cerc-io/peer": "^0.2.18",
|
||||||
"@cerc-io/util": "^0.2.18",
|
"@cerc-io/util": "^0.2.18",
|
||||||
"@ethersproject/providers": "^5.4.4",
|
"@ethersproject/providers": "^5.4.4",
|
||||||
"@graphql-tools/utils": "^9.1.1",
|
"@graphql-tools/utils": "^9.1.1",
|
||||||
"@ipld/dag-cbor": "^6.0.12",
|
"@ipld/dag-cbor": "^6.0.12",
|
||||||
|
"@libp2p/interface-peer-id": "^1.1.2",
|
||||||
"apollo-server-express": "^3.11.1",
|
"apollo-server-express": "^3.11.1",
|
||||||
"debug": "^4.3.1",
|
"debug": "^4.3.1",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
@ -24,6 +28,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^4.17.14",
|
"@types/express": "^4.17.14",
|
||||||
|
"@types/node": "16.11.7",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
||||||
"@typescript-eslint/parser": "^4.25.0",
|
"@typescript-eslint/parser": "^4.25.0",
|
||||||
"eslint-config-semistandard": "^15.0.1",
|
"eslint-config-semistandard": "^15.0.1",
|
||||||
@ -31,6 +36,7 @@
|
|||||||
"eslint-plugin-import": "^2.23.3",
|
"eslint-plugin-import": "^2.23.3",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
"eslint-plugin-promise": "^5.1.0",
|
||||||
"eslint-plugin-standard": "^5.0.0"
|
"eslint-plugin-standard": "^5.0.0",
|
||||||
|
"typescript": "^4.9.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
52
packages/cli/src/chat.ts
Normal file
52
packages/cli/src/chat.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import * as readline from 'readline';
|
||||||
|
import { hideBin } from 'yargs/helpers';
|
||||||
|
import yargs from 'yargs';
|
||||||
|
|
||||||
|
import { Peer } from '@cerc-io/peer';
|
||||||
|
import { PeerId } from '@libp2p/interface-peer-id';
|
||||||
|
|
||||||
|
interface Arguments {
|
||||||
|
signalServer: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function main (): Promise<void> {
|
||||||
|
const argv: Arguments = _getArgv();
|
||||||
|
if (!argv.signalServer) {
|
||||||
|
console.log('Using default signalling server URL');
|
||||||
|
}
|
||||||
|
|
||||||
|
const peer = new Peer(true);
|
||||||
|
await peer.init(argv.signalServer);
|
||||||
|
|
||||||
|
peer.subscribeMessage((peerId: PeerId, message: string) => {
|
||||||
|
console.log(`> ${peerId.toString()} > ${message}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Peer ID: ${peer.peerId?.toString()}`);
|
||||||
|
|
||||||
|
const rl = readline.createInterface({
|
||||||
|
input: process.stdin,
|
||||||
|
output: process.stdout
|
||||||
|
});
|
||||||
|
|
||||||
|
rl.on('line', (input: string) => {
|
||||||
|
peer.broadcastMessage(input);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('Reading input...');
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getArgv (): any {
|
||||||
|
return yargs(hideBin(process.argv)).parserConfiguration({
|
||||||
|
'parse-numbers': false
|
||||||
|
}).options({
|
||||||
|
signalServer: {
|
||||||
|
type: 'string',
|
||||||
|
describe: 'Signalling server URL'
|
||||||
|
}
|
||||||
|
}).argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(err => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
@ -5,7 +5,7 @@
|
|||||||
/* Basic Options */
|
/* Basic Options */
|
||||||
// "incremental": true, /* Enable incremental compilation */
|
// "incremental": true, /* Enable incremental compilation */
|
||||||
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
|
"target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
|
||||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
|
"module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
|
||||||
"lib": [ "ES5", "ES6", "ES2020" ], /* Specify library files to be included in the compilation. */
|
"lib": [ "ES5", "ES6", "ES2020" ], /* Specify library files to be included in the compilation. */
|
||||||
// "allowJs": true, /* Allow javascript files to be compiled. */
|
// "allowJs": true, /* Allow javascript files to be compiled. */
|
||||||
// "checkJs": true, /* Report errors in .js files. */
|
// "checkJs": true, /* Report errors in .js files. */
|
||||||
@ -49,7 +49,8 @@
|
|||||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
"typeRoots": [
|
"typeRoots": [
|
||||||
"./src/types"
|
"./src/types",
|
||||||
|
"node_modules/@types"
|
||||||
], /* List of folders to include type definitions from. */
|
], /* List of folders to include type definitions from. */
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
|
@ -7,7 +7,7 @@ Package used for connecting between peers and send messages
|
|||||||
- [x] Discover peers
|
- [x] Discover peers
|
||||||
- [x] Connect between peers and send messages
|
- [x] Connect between peers and send messages
|
||||||
- [x] Use package in browser
|
- [x] Use package in browser
|
||||||
- [ ] Use package in server
|
- [x] Use package in server
|
||||||
- [ ] Send messages between systems in different LANs
|
- [ ] Send messages between systems in different LANs
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@libp2p/webrtc-star-signalling-server": "^2.0.5",
|
"@libp2p/webrtc-star-signalling-server": "^2.0.5",
|
||||||
|
"@types/node": "16.11.7",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
"@typescript-eslint/eslint-plugin": "^4.25.0",
|
||||||
"@typescript-eslint/parser": "^4.25.0",
|
"@typescript-eslint/parser": "^4.25.0",
|
||||||
"eslint": "^7.27.0",
|
"eslint": "^7.27.0",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
import { createLibp2p, Libp2p } from 'libp2p';
|
import { createLibp2p, Libp2p } from 'libp2p';
|
||||||
// For nodejs.
|
// For nodejs.
|
||||||
// import wrtc from 'wrtc';
|
import wrtc from 'wrtc';
|
||||||
import assert from 'assert';
|
import assert from 'assert';
|
||||||
import { pipe } from 'it-pipe';
|
import { pipe } from 'it-pipe';
|
||||||
import * as lp from 'it-length-prefixed';
|
import * as lp from 'it-length-prefixed';
|
||||||
@ -13,7 +13,6 @@ import { pushable, Pushable } from 'it-pushable';
|
|||||||
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
||||||
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
||||||
|
|
||||||
import { webSockets } from '@libp2p/websockets';
|
|
||||||
import { webRTCStar, WebRTCStarTuple } from '@libp2p/webrtc-star';
|
import { webRTCStar, WebRTCStarTuple } from '@libp2p/webrtc-star';
|
||||||
import { noise } from '@chainsafe/libp2p-noise';
|
import { noise } from '@chainsafe/libp2p-noise';
|
||||||
import { mplex } from '@libp2p/mplex';
|
import { mplex } from '@libp2p/mplex';
|
||||||
@ -32,10 +31,13 @@ export class Peer {
|
|||||||
_peerStreamMap: Map<string, Pushable<string>> = new Map()
|
_peerStreamMap: Map<string, Pushable<string>> = new Map()
|
||||||
_messageHandlers: Array<(peerId: PeerId, message: string) => void> = []
|
_messageHandlers: Array<(peerId: PeerId, message: string) => void> = []
|
||||||
|
|
||||||
constructor () {
|
constructor (nodejs?: boolean) {
|
||||||
// Instantiation in nodejs.
|
// Instantiation in nodejs.
|
||||||
// this._wrtcStar = webRTCStar({ wrtc });
|
if (nodejs) {
|
||||||
this._wrtcStar = webRTCStar();
|
this._wrtcStar = webRTCStar({ wrtc });
|
||||||
|
} else {
|
||||||
|
this._wrtcStar = webRTCStar();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get peerId (): PeerId | undefined {
|
get peerId (): PeerId | undefined {
|
||||||
|
@ -49,7 +49,8 @@
|
|||||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||||||
"typeRoots": [
|
"typeRoots": [
|
||||||
"./src/types"
|
"./src/types",
|
||||||
|
"node_modules/@types"
|
||||||
], /* List of folders to include type definitions from. */
|
], /* List of folders to include type definitions from. */
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
// "types": [], /* Type declaration files to be included in compilation. */
|
||||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||||||
|
11
yarn.lock
11
yarn.lock
@ -4069,9 +4069,9 @@
|
|||||||
"@libp2p/interface-peer-info" "^1.0.0"
|
"@libp2p/interface-peer-info" "^1.0.0"
|
||||||
"@libp2p/interfaces" "^3.0.0"
|
"@libp2p/interfaces" "^3.0.0"
|
||||||
|
|
||||||
"@libp2p/interface-peer-id@^1.0.0", "@libp2p/interface-peer-id@^1.0.2", "@libp2p/interface-peer-id@^1.0.4":
|
"@libp2p/interface-peer-id@^1.0.0", "@libp2p/interface-peer-id@^1.0.2", "@libp2p/interface-peer-id@^1.0.4", "@libp2p/interface-peer-id@^1.1.2":
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.npmjs.org/@libp2p/interface-peer-id/-/interface-peer-id-1.1.2.tgz"
|
resolved "https://registry.yarnpkg.com/@libp2p/interface-peer-id/-/interface-peer-id-1.1.2.tgz#22cbfb4707949cd49c3271a871172221d6920049"
|
||||||
integrity sha512-S5iyVzG2EUgxm4NLe8W4ya9kpKuGfHs7Wbbos0wOUB4GXsbIKgOOxIr4yf+xGFgtEBaoximvlLkpob6dn8VFgA==
|
integrity sha512-S5iyVzG2EUgxm4NLe8W4ya9kpKuGfHs7Wbbos0wOUB4GXsbIKgOOxIr4yf+xGFgtEBaoximvlLkpob6dn8VFgA==
|
||||||
dependencies:
|
dependencies:
|
||||||
multiformats "^10.0.0"
|
multiformats "^10.0.0"
|
||||||
@ -5702,6 +5702,11 @@
|
|||||||
resolved "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz"
|
resolved "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz"
|
||||||
integrity sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==
|
integrity sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==
|
||||||
|
|
||||||
|
"@types/node@16.11.7":
|
||||||
|
version "16.11.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42"
|
||||||
|
integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==
|
||||||
|
|
||||||
"@types/node@>=10.0.0":
|
"@types/node@>=10.0.0":
|
||||||
version "18.11.17"
|
version "18.11.17"
|
||||||
resolved "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz"
|
resolved "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz"
|
||||||
@ -22614,7 +22619,7 @@ typeorm@^0.2.32:
|
|||||||
|
|
||||||
typescript@^4.3.2, typescript@^4.9.4:
|
typescript@^4.3.2, typescript@^4.9.4:
|
||||||
version "4.9.4"
|
version "4.9.4"
|
||||||
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78"
|
||||||
integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
|
integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==
|
||||||
|
|
||||||
typewise-core@^1.2, typewise-core@^1.2.0:
|
typewise-core@^1.2, typewise-core@^1.2.0:
|
||||||
|
Loading…
Reference in New Issue
Block a user