Gathering detailed insights and metrics for rpc-ws
Gathering detailed insights and metrics for rpc-ws
npm install rpc-ws
Typescript
Module System
Node Version
NPM Version
TypeScript (100%)
Verify real, reachable, and deliverable emails with instant MX records, SMTP checks, and disposable email detection.
Total Downloads
1,652
Last Day
1
Last Week
2
Last Month
12
Last Year
245
24 Commits
1 Watchers
1 Branches
1 Contributors
Updated on Jul 10, 2024
Minified
Minified + Gzipped
Latest Version
0.6.4
Package Id
rpc-ws@0.6.4
Unpacked Size
44.36 kB
Size
6.67 kB
File Count
9
NPM Version
9.5.1
Node Version
18.16.0
Published on
Aug 28, 2023
Cumulative downloads
Total Downloads
Last Day
0%
1
Compared to previous day
Last Week
0%
2
Compared to previous week
Last Month
-74.5%
12
Compared to previous month
Last Year
-82.6%
245
Compared to previous year
1
8
A JSON-RPC implementation using websocket as a wrapper, available in Node.js environments and the web (client)
1// In the server 2import { Server } from 'rpc-ws' 3 4const server = Server({ 5 port: 3000, 6 host: 'localhost' 7}) 8 9server.event('hello') // Create event 10server.emit('hello', 'world') // Emit event 11 12server.register('ping', () => { 13 return 'pong' 14}) 15 16server.register('double', ([n]) => { 17 return n * 2 18}) 19 20server.register('sum', ([n1, n2]) => { 21 return n1 * n2 22}) 23 24server.register('login', ([payload]) => { 25 const { login, password } = payload 26 const user = ... // Get logged user 27 return user 28}) 29 30// Handling errors 31 32class ApplicationError extends Error { 33 data = undefined 34 35 constructor(message, data) { 36 super(message) 37 if (data) this.data = data 38 } 39} 40 41server.register('error', () => { 42 throw new Error('application-error',) 43}) 44 45server.register('custom-error', () => { 46 throw new ApplicationError('custom-application-error', { error: true }) 47}) 48 49console.log(server.clients()) // Get client sockets map 50 51const chat = server.of('/chat') // Create namespace 52 53chat.event('messageReceive') 54 55chat.register('message', ([message]) => { 56 chat.emit('messageReceive', message) 57 return true 58}) 59 60console.log(chat.clients()) // Get client sockets map in the namespace 61 62// In the client 63import { Client } from 'rpc-ws' 64 65const ws = await Client('ws://localhost:3000') 66 67console.log(await ws.send('ping')) // Receives { data: 'pong' } 68console.log(await ws.send('double', 2)) // Receives { data: 4 } 69console.log(await ws.send('sum', 5, 7)) // Receives { data: 12 } 70 71// Handling Error 72 73type ResponseError = { 74 code: number 75 message: string 76 data?: unknown 77} 78 79const notExists = await ws.send('not-exists') 80const error = await ws.send('error') 81const customError = await ws.send('custom-error') 82 83console.log(notExists) // ResponseError 84console.log(error) // ResponseError 85console.log(customError) // ResponseError with data prop 86 87// Receives user data 88const { data } = await ws.send('login', { 89 login: 'user', 90 password: 'pass' 91}) 92 93ws.close() // Close websocket connection 94 95// Connect to namespace 96const wsChat = await Client('ws://localhost:3000/chat') 97 98await wsChat.subscribe('messageReceive', ([message]) => { 99 console.log(message) // Get broadcasted message 100}) 101 102await wsChat.send('message', 'Hello world') 103 104wsChat.close()
1import express from 'express' 2import { Server } from 'rpc-ws' 3 4const app = express() 5... // Setup routes 6 7const httpServer = app.listen(3000) 8 9// Wrap express server with ws server 10const wsServer = await Server({ server: httpServer })
You can import the client on frontend repos, like vite or next
1import { BrowserClient } from 'rpc-ws/frontend' 2 3let rpc = undefined 4 5export async function getRpcClient() { 6 if (rpc) return rpc 7 rpc = await BrowserClient('ws://localhost:3000/rpc') 8 return rpc 9} 10 11async function main() { 12 const client = await getRpcClient() 13 console.log(await client.send('ping')) // Receives 'pong' 14} 15
You will need to host the browser bundle file to be able to access in your frontend.
src/server.js:
1import { resolve } from 'path' 2import express from 'express' 3 4const app = express() 5// Expose browser bundle script 6express.use('/vendor', express.static(resolve(__dirname, '../node_modules/rpc-ws/dist'))) 7 8app.get('/', (req, res) => res.sendFile(resolve(__dirname, '../public/index.html'))) 9 10app.listen(3000)
public/index.html:
1<head> 2 <!-- Import browser script --> 3 <script src="vendor/main.browser.js"> 4</head> 5<body> 6 <script> 7 async function setupWS() { 8 const ws = await RPCWebSocket.Client('ws://localhost:3000') 9 console.log(await ws.send('ping')) // Receives 'pong' 10 } 11 12 setupWs() 13 </script> 14</body>
If you are using typescript is possible to type server functions:
1const server = await Server({ ... }) 2 3server.register<[number, number]>('sum', (params) => { 4 return params[0] + params[1] 5} 6 7type UserPayload = { 8 email: string 9 password: string 10} 11 12server.register<[UserPayload]>('login', async ([payload]) => { 13 const user = await getUser({ 14 email: payload.email, 15 password: payload.password 16 }) 17 18 return user 19})
No vulnerabilities found.
No security vulnerabilities found.