Server-to-Server Communication via WebSockets
A lightweight communication layer that lets servers call functions on other servers and perform WebSocket communication effortlessly.
npm install @siemsiem/tonpleun
Call functions on other servers as easily as calling local functions.
Send messages between servers with custom handling logic.
Optional input/output validation with Zod schemas.
Register config values that clients can update dynamically.
Basic client privilege system for access control.
Easy-to-use API for registering and calling services.
npm install @siemsiem/tonpleun
import startServer from '@siemsiem/tonpleun/server'
// Start a Tonpleun server (defaults to ws://localhost:8765)
startServer()
import Tonpleun from '@siemsiem/tonpleun'
import { z } from 'zod'
// Create a client instance with a unique ID
const provider = new Tonpleun('provider-server')
// Wait for initialization before registering services
await provider.initialized
// Register a simple service
await provider.registerService(
'add',
(a: number, b: number) => a + b
)
// Register a service with Zod validation
const multiplySchema = z.tuple([z.number(), z.number()])
await provider.registerService(
'multiply',
(a: number, b: number) => a * b,
multiplySchema // Optional input validation
)
import Tonpleun from '@siemsiem/tonpleun'
// Create consumer client
const consumer = new Tonpleun('consumer-client')
// Wait for initialization
await consumer.initialized
// Call a service on another client
// getService(ServiceId, ClientId, args)
const result = await consumer.getService('add', 'provider-server', [5, 3])
console.log(result) // 8
// If validation fails, you'll get an error object
const invalid = await consumer.getService('add', 'provider-server', ['x', 3])
// Returns: { error: 'Invalid service input', issues: [...] }
import Tonpleun from '@siemsiem/tonpleun'
import { z } from 'zod'
async function main() {
// Create two clients
const provider = new Tonpleun('provider')
const consumer = new Tonpleun('consumer')
// Define validation schema
const addArgsSchema = z.tuple([z.number(), z.number()])
// Register service on provider
await provider.registerService(
'add',
(a: number, b: number) => a + b,
addArgsSchema
)
// Call service from consumer
const result = await consumer.getService('add', 'provider', [2, 3])
if (result !== 5) {
throw new Error(`Expected 5, got: ${result}`)
}
console.log('Success! 2 + 3 =', result)
}
main()
import Tonpleun from '@siemsiem/tonpleun'
const client = new Tonpleun('config-manager')
await client.initialized
// Register a config item
await client.registerConfigItem(
'maxConnections', // name
'Maximum connections', // description
'100', // default value
'max-conn-id' // unique ID
)
// Update config value
await client.SetConfigItem('max-conn-id', '200')
// Get config value locally
const value = client.getConfigValue('max-conn-id')
console.log('Max connections:', value) // '200'
Creates a new Tonpleun client instance. Connects to ws://localhost:8765 by default.
Parameters:ClientId (string) - Unique identifier for this clientcreds (any, optional) - Authentication credentialsinitialized - Promise that resolves when client is readyws - WebSocket instanceRegisters a service that can be called by other clients.
Parameters:ServiceId (string) - Unique service identifiercallback (Function) - Function to execute when service is calledinputSchema (optional) - Zod schema for input validationCalls a service registered on another client.
Parameters:ServiceId (string) - Service identifier to callClientId (string) - Target client that has the serviceinputs (any[]) - Array of arguments to passRegisters a configuration item that can be updated.
Parameters:name (string) - Config namedescription (string) - Config descriptionvalue (string) - Default valueid (string) - Unique identifierUpdates a configuration item value.
Parameters:id (string) - Config identifiernewValue (string) - New valueclientId (string, optional) - Target clientGets a local configuration value.
Parameters:id (string) - Config identifier