
Security News
curl Shuts Down Bug Bounty Program After Flood of AI Slop Reports
A surge of AI-generated vulnerability reports has pushed open source maintainers to rethink bug bounties and tighten security disclosure processes.
@vcms-io/solidis
Advanced tools
High-performance, SOLID-structured RESP client for Redis and other RESP-compatible servers
High-performance, SOLID-structured RESP client for Redis and other RESP-compatible servers
Overview β’
Benchmarks β’
Features β’
Installation β’
Usage β’
Configuration β’
Advanced
Extensions β’
Errors β’
Contributing β’
License
Solidis is a modern RESP client built with SOLID principles, zero dependencies, and enterprise-grade performance in mind. It supports both RESP2 and RESP3 protocols and is optimized for modern JavaScript/TypeScript applications.
The library is designed for minimal bundle size with maximum type safety and performance:
1000 concurrent commands Γ 10 iterations, 1 KB random-string payload per request
| Benchmark | Solidis | IoRedis | Speed Boost π |
|---|---|---|---|
| Hash HSET + HGET + HGETALL | 248.82ms | 446.03ms | 79% FASTER π₯π₯ |
| Set Operations SADD + SISMEMBER + SREM | 257.35ms | 444.08ms | 73% FASTER π₯π₯ |
| Expire SET + EXPIRE + TTL | 198.11ms | 339.78ms | 72% FASTER π₯π₯ |
| Non-Transaction SET with EXPIRE + GET | 259.69ms | 394.34ms | 52% FASTER π₯ |
| List LPUSH + RPUSH + LRANGE | 219.76ms | 345.48ms | 57% FASTER π₯ |
| Counter INCR + DECR | 174.04ms | 258.71ms | 49% FASTER π₯ |
| List operations LPUSH + RPUSH + LPOP + RPOP + LLEN | 396.67ms | 587.16ms | 48% FASTER π₯ |
| Transaction + Non-Transaction SET + GET | 435.46ms | 574.26ms | 32% FASTER β‘οΈ |
| Multi-key MSET + MGET | 393.87ms | 437.45ms | 11% FASTER β‘οΈ |
| Transaction SET with EXPIRE + GET | 286.75ms | 328.00ms | 14% FASTER β‘οΈ |
| Set SADD + SISMEMBER + SMEMBERS | 260.66ms | 275.27ms | 6% FASTER β‘οΈ |
| Hash operations HMSET + HMGET + HDEL | 360.69ms | 377.32ms | 5% FASTER β‘οΈ |
| Info/Config INFO + CONFIG GET | 371.48ms | 353.02ms | 5% slower |
Up to 79% faster than IoRedis! π
Solidis delivers blazing-fast performance with ZERO dependencies
Lightweight
High Performance
Protocol Support
Advanced Features
Type Safety
Extensibility
# Using npm
npm install @vcms-io/solidis
# Using yarn
yarn add @vcms-io/solidis
# Using pnpm
pnpm add @vcms-io/solidis
Solidis offers two client implementations:
The basic client contains minimal functionality to reduce bundle size. You need to extend it with specific commands:
import { SolidisClient } from '@vcms-io/solidis';
import { get } from '@vcms-io/solidis/command/get';
import { set } from '@vcms-io/solidis/command/set';
import { multi } from '@vcms-io/solidis/command/multi';
import type { SolidisClientExtensions } from '@vcms-io/solidis';
// Define extensions with type safety
const extensions = {
get,
set,
multi
} satisfies SolidisClientExtensions;
// Initialize client with extensions
const client = new SolidisClient({
host: '127.0.0.1',
port: 6379
}).extend(extensions);
// Use commands
await client.set('key', 'value');
const value = await client.get('key');
A convenience client with all RESP commands pre-loaded:
import { SolidisFeaturedClient } from '@vcms-io/solidis/featured';
// All RESP commands are pre-loaded
const client = new SolidisFeaturedClient({
host: '127.0.0.1',
port: 6379
});
// Use any RESP command directly
await client.set('key', 'value');
await client.hset('hash', 'field', 'value');
await client.lpush('list', 'item-1', 'item-2');
// Create client (with lazy connect)
const client = new SolidisClient({
uri: 'redis://127.0.0.1:6379',
lazyConnect: true
}).extend({ get, set });
// Explicitly connect when needed
await client.connect();
// Handle connection events
client.on('connect', () => console.log('Connected to server'));
client.on('ready', () => console.log('Client is ready for commands'));
client.on('error', (err) => console.error('Error occurred:', err));
client.on('end', () => console.log('Connection closed'));
// Close connection when done
client.quit();
// Set a key
await client.set('key', 'value');
// Get a key
const value = await client.get('key');
console.log(value); // 'value'
// Delete a key
await client.del('key');
// Start a transaction
const transaction = client.multi();
// Queue commands (no await needed)
transaction.set('key', 'value');
transaction.incr('counter');
transaction.get('key');
// Execute transaction
const results = await transaction.exec();
console.log(results); // [[ 'OK' ], [ 1 ], [ <Buffer 76 61 6c 75 65> ]]
// Or discard a transaction if needed
const transaction = client.multi();
transaction.set('key', 'value');
transaction.discard(); // Cancel transaction
// Create commands for a pipeline
const commands = [
['set', 'pipeline', 'value'],
['incr', 'counter'],
['get', 'pipeline']
];
// Send commands as a pipeline
const results = await client.send(commands);
console.log(results); // [[ 'OK' ], [ 1 ], [ <Buffer 76 61 6c 75 65> ]]
// Subscribe to channels
client.on('message', (channel, message) => {
console.log(`Received ${message} from ${channel}`);
});
await client.subscribe('news');
// Publish from another client
await client.publish('news', 'Hello world!');
Solidis provides extensive configuration options:
const client = new SolidisClient({
// Connection
uri: 'redis://localhost:6379',
host: '127.0.0.1',
port: 6379,
useTLS: false,
lazyConnect: false,
// Authentication
authentication: {
username: 'user',
password: 'password'
},
database: 0,
// Protocol & Recovery
clientName: 'solidis',
protocol: 'RESP2', // 'RESP2' or 'RESP3'
autoReconnect: true,
enableReadyCheck: true,
maxConnectionRetries: 20,
connectionRetryDelay: 100,
autoRecovery: {
database: true, // Auto-select DB after reconnect
subscribe: true, // Auto-resubscribe to channels
ssubscribe: true, // Auto-resubscribe to shard channels
psubscribe: true, // Auto-resubscribe to patterns
},
// Timeouts (milliseconds)
commandTimeout: 5000,
connectionTimeout: 2000,
socketWriteTimeout: 1000,
readyCheckInterval: 100,
// Performance Tuning
maxCommandsPerPipeline: 300,
maxProcessRepliesPerChunk: 4 * 1024, // 4KB
maxSocketWriteSizePerOnce: 64 * 1024, // 64KB
rejectOnPartialPipelineError: false,
// Parser Configuration
parser: {
buffer: {
initial: 4 * 1024 * 1024, // 4MB
shiftThreshold: 2 * 1024 * 1024, // 2MB
},
},
// Event Listeners
maxEventListenersForClient: 10 * 1024,
maxEventListenersForSocket: 10 * 1024,
// Debug Options
debug: false,
debugMaxEntries: 10 * 1024,
});
import { SolidisClient } from '@vcms-io/solidis';
import { get, set } from '@vcms-io/solidis/command';
import type { SolidisClientExtensions } from '@vcms-io/solidis';
// Define extensions with custom commands
const extensions = {
get,
set,
// Custom command implementation
fill: async function(this: typeof client, keys: string[], value: string) {
return await Promise.all(keys.map((key) => this.set(key, value)));
},
} satisfies SolidisClientExtensions;
const client = new SolidisClient({
host: '127.0.0.1',
port: 6379
}).extend(extensions);
// Use custom command
await client.fill(['key1', 'key2', 'key3'], 'value');
When you need to use a command that's not yet implemented:
// Using raw commands with send()
const result = await client.send([['command', 'some', 'options']]);
Enable detailed debug logging:
// Enable debug mode
const client = new SolidisClient({
debug: true
});
// Listen for debug events
client.on('debug', (entry) => {
console.log(`[${entry.type}] ${entry.message}`, entry.data);
});
// Alternative: environment variable
// DEBUG=solidis node app.js
The @vcms-io/solidis-extensions package provides additional functionality and utilities for Solidis clients. It includes pre-built extensions to enhance your Redis operations.
# Using npm
npm install @vcms-io/solidis-extensions
# Using yarn
yarn add @vcms-io/solidis-extensions
# Using pnpm
pnpm add @vcms-io/solidis-extensions
Check the extensions documentation for detailed usage examples.
Solidis provides detailed error classes for different failure modes:
import {
SolidisClientError,
SolidisConnectionError,
SolidisParserError,
SolidisPubSubError,
SolidisRequesterError,
unwrapSolidisError,
} from '@vcms-io/solidis';
try {
await client.set('key', 'value');
} catch (error) {
// Get the root cause with stack trace
console.error(unwrapSolidisError(error));
// Handle specific error types
if (error instanceof SolidisConnectionError) {
console.error('Connection error:', error.message);
} else if (error instanceof SolidisParserError) {
console.error('Parser error:', error.message);
} else if (error instanceof SolidisClientError) {
console.error('Client error:', error.message);
}
}
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β SolidisClient β
β β
β Creates & coordinates all components β
β β
β ββββββββββββββββββββββββββββββββββββββ β
β β Debug Memory β β
β βββββββββ¬ββββββββββββββββββββ¬βββββββββ β
β βΌ βΌ β
β ββββββββββββββββββ ββββββββββββββββββ β
β β Connection βββΊβ Requester βββ β
β ββββββββββββββββββ ββββββββββββββββββ β β
β ββββββββββββββββββ β β
β β Parser βββ€ β
β ββββββββββββββββββ β β
β ββββββββββββββββββ β β
β β PubSub βββ β
β ββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββ΄ββββββββββββββ
βΌ βΌ
βββββββββββββββββββ βββββββββββββββββββββββββ
β SolidisClient β β SolidisFeaturedClient β
β (needs extend) β β (all commands) β
βββββββββββββββββββ βββββββββββββββββββββββββ
The Solidis structure follows a clear component separation:
Solidis emits the following events:
// Connection events
client.on('connect', () => console.log('Connected to server'));
client.on('ready', () => console.log('Client is ready'));
client.on('end', () => console.log('Connection closed'));
client.on('error', (err) => console.error('Error:', err));
// Pub/Sub events
client.on('message', (channel, message) => console.log(`${channel}: ${message}`));
client.on('pmessage', (pattern, channel, message) => console.log(`${pattern} ${channel}: ${message}`));
client.on('subscribe', (channel, count) => console.log(`Subscribed to ${channel}`));
client.on('unsubscribe', (channel, count) => console.log(`Unsubscribed from ${channel}`));
// Debug events
client.on('debug', (entry) => console.log(`[${entry.type}] ${entry.message}`));
Solidis is an open-source project and we welcome contributions from the community. Here's how you can contribute:
# Clone the repository
git clone https://github.com/vcms-io/solidis.git
cd solidis
# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm test
Fork the Repository: Start by forking the repository and then clone your fork.
Create a Branch: Create a branch for your feature or bugfix:
git checkout -b feature/your-feature-name
Follow Code Style:
Submit Pull Request: Push your changes to your fork and submit a pull request.
any types and as cast where possibleSolidis follows semantic versioning (SemVer):
Licensed under the MIT. See LICENSE for more information.
FAQs
High-performance, SOLID-structured RESP client for Redis and other RESP-compatible servers
We found that @vcms-io/solidis demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Β It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
A surge of AI-generated vulnerability reports has pushed open source maintainers to rethink bug bounties and tighten security disclosure processes.

Product
Scan results now load faster and remain consistent over time, with stable URLs and on-demand rescans for fresh security data.

Product
Socket's new Alert Details page is designed to surface more context, with a clearer layout, reachability dependency chains, and structured review.