Server Creation
This guide covers how to create and configure different types of servers in Verb.
Basic Server Creation
Default HTTP Server
typescript
import { createServer } from "verb";
const app = createServer();
app.get("/", (req, res) => {
res.json({ message: "Hello World!" });
});
app.listen(3000);
Explicit Protocol Selection
typescript
import { createServer, ServerProtocol } from "verb";
// HTTP server (explicit)
const httpServer = createServer(ServerProtocol.HTTP);
// HTTPS server
const httpsServer = createServer(ServerProtocol.HTTPS);
// HTTP/2 server
const http2Server = createServer(ServerProtocol.HTTP2);
// WebSocket server
const wsServer = createServer(ServerProtocol.WEBSOCKET);
Fluent API
Use the fluent API for more readable server creation:
typescript
import { server } from "verb";
const httpApp = server.http();
const httpsApp = server.https();
const http2App = server.http2();
const wsApp = server.websocket();
const grpcApp = server.grpc();
const udpApp = server.udp();
const tcpApp = server.tcp();
HTTP/HTTPS Servers
HTTP Server
typescript
import { createServer, ServerProtocol } from "verb";
const app = createServer(ServerProtocol.HTTP);
// Basic routes
app.get("/", (req, res) => {
res.json({ protocol: "HTTP" });
});
app.post("/users", (req, res) => {
const user = req.body;
res.status(201).json({ id: 1, ...user });
});
// Middleware support
app.use((req, res, next) => {
console.log(`${req.method} ${req.path}`);
next();
});
app.listen(3000);
HTTPS Server
typescript
import { createServer, ServerProtocol } from "verb";
const app = createServer(ServerProtocol.HTTPS);
// Configure TLS options
app.withOptions({
// TLS configuration would go here
// (depends on Bun's TLS implementation)
});
app.get("/secure", (req, res) => {
res.json({
protocol: "HTTPS",
secure: req.secure
});
});
app.listen(443);
HTTP/2 Servers
HTTP/2 Server
typescript
import { createServer, ServerProtocol } from "verb";
const app = createServer(ServerProtocol.HTTP2);
app.get("/", (req, res) => {
res.json({
protocol: "HTTP/2",
multiplexed: true
});
});
// HTTP/2 supports server push (when available)
app.get("/push-example", (req, res) => {
// Server push logic would go here
res.json({ message: "HTTP/2 with push" });
});
app.listen(3000);
HTTP/2 Secure (HTTP2S)
typescript
import { createServer, ServerProtocol } from "verb";
const app = createServer(ServerProtocol.HTTP2S);
app.get("/", (req, res) => {
res.json({
protocol: "HTTP/2 Secure",
secure: true
});
});
app.listen(443);
WebSocket Servers
Basic WebSocket Server
typescript
import { createServer, ServerProtocol } from "verb";
const wsServer = createServer(ServerProtocol.WEBSOCKET);
// HTTP routes still work
wsServer.get("/", (req, res) => {
res.json({ protocol: "WebSocket HTTP" });
});
// WebSocket configuration
wsServer.websocket({
open: (ws) => {
console.log("WebSocket connection opened");
ws.send("Welcome to WebSocket server!");
},
message: (ws, message) => {
console.log("Received:", message);
ws.send(`Echo: ${message}`);
},
close: (ws, code, reason) => {
console.log("WebSocket closed:", code, reason);
}
});
wsServer.listen(3001);
WebSocket Secure (WSS)
typescript
import { createServer, ServerProtocol } from "verb";
const wssServer = createServer(ServerProtocol.WEBSOCKETS);
wssServer.websocket({
open: (ws) => {
ws.send("Secure WebSocket connection established");
},
message: (ws, message) => {
// Handle secure messages
ws.send(`Secure echo: ${message}`);
}
});
wssServer.listen(443);
gRPC Servers
Basic gRPC Server
typescript
import { createServer, ServerProtocol } from "verb";
const grpcServer = createServer(ServerProtocol.GRPC);
// Add a service
grpcServer.addService({
name: "UserService",
methods: {
GetUser: {
requestType: "GetUserRequest",
responseType: "GetUserResponse",
handler: async (request) => {
return {
id: request.id,
name: "John Doe",
email: "[email protected]"
};
}
},
CreateUser: {
requestType: "CreateUserRequest",
responseType: "CreateUserResponse",
handler: async (request) => {
const user = {
id: Date.now().toString(),
...request
};
return user;
}
}
}
});
// Or add methods individually
grpcServer.addMethod("UserService", {
name: "DeleteUser",
handler: async (request) => {
return { success: true };
}
});
grpcServer.listen(50051);
gRPC Secure (gRPCS)
typescript
import { createServer, ServerProtocol } from "verb";
const grpcsServer = createServer(ServerProtocol.GRPCS);
grpcsServer.addService({
name: "SecureService",
methods: {
SecureMethod: {
handler: async (request) => {
return { secure: true, data: request };
}
}
}
});
grpcsServer.listen(50052);
UDP Servers
Basic UDP Server
typescript
import { createServer, ServerProtocol } from "verb";
const udpServer = createServer(ServerProtocol.UDP);
// Handle incoming messages
udpServer.onMessage((message) => {
console.log("UDP message:", message.data.toString());
console.log("From:", message.address, message.port);
// Echo back
udpServer.send(
`Echo: ${message.data}`,
message.port,
message.address
);
});
// Handle errors
udpServer.onError((error) => {
console.error("UDP error:", error);
});
udpServer.listen(3002);
DTLS Server (Secure UDP)
typescript
import { createServer, ServerProtocol } from "verb";
const dtlsServer = createServer(ServerProtocol.DTLS);
dtlsServer.onMessage((message) => {
console.log("Secure UDP message:", message.data.toString());
// Handle secure UDP messages
dtlsServer.send(
`Secure echo: ${message.data}`,
message.port,
message.address
);
});
dtlsServer.listen(3003);
TCP Servers
Basic TCP Server
typescript
import { createServer, ServerProtocol } from "verb";
const tcpServer = createServer(ServerProtocol.TCP);
// Handle new connections
tcpServer.onConnection((connection) => {
console.log("New TCP connection");
connection.write("Welcome to TCP server!\\n");
// Handle data from this connection
connection.onData((data) => {
console.log("Received:", data.toString());
connection.write(`Echo: ${data}`);
});
// Handle connection close
connection.onClose(() => {
console.log("TCP connection closed");
});
// Handle connection errors
connection.onError((error) => {
console.error("TCP connection error:", error);
});
});
tcpServer.listen(3004);
TLS Server (Secure TCP)
typescript
import { createServer, ServerProtocol } from "verb";
const tlsServer = createServer(ServerProtocol.TLS);
tlsServer.onConnection((connection) => {
console.log("New TLS connection");
connection.write("Secure TCP connection established\\n");
connection.onData((data) => {
console.log("Secure data:", data.toString());
connection.write(`Secure echo: ${data}`);
});
});
tlsServer.listen(3005);
Unified Server
Create a server that can handle multiple protocols:
typescript
import { createUnifiedServer } from "verb";
const server = createUnifiedServer();
// The server adapts based on the protocol used
server.get("/", (req, res) => {
res.json({
message: "Universal route",
protocol: req.protocol
});
});
server.listen(3000);
Server Configuration
Listen Options
typescript
const app = createServer();
// Configure before listening
app.withOptions({
port: 3000,
hostname: "localhost",
showRoutes: true,
development: {
hmr: true,
console: true
}
});
app.listen();
Advanced Configuration
typescript
const app = createServer();
// Application settings
app.set("trust proxy", true);
app.set("view cache", false);
// Application locals
app.locals.appName = "My Server";
app.locals.version = "1.0.0";
// Server options
app.withOptions({
port: process.env.PORT || 3000,
hostname: process.env.HOST || "0.0.0.0",
showRoutes: process.env.NODE_ENV === "development"
});
app.listen();
Multiple Server Instances
Run multiple servers simultaneously:
typescript
import { createServer, ServerProtocol } from "verb";
// HTTP server
const httpServer = createServer(ServerProtocol.HTTP);
httpServer.get("/", (req, res) => {
res.json({ protocol: "HTTP" });
});
httpServer.listen(3000);
// WebSocket server
const wsServer = createServer(ServerProtocol.WEBSOCKET);
wsServer.websocket({
open: (ws) => ws.send("WebSocket ready")
});
wsServer.listen(3001);
// gRPC server
const grpcServer = createServer(ServerProtocol.GRPC);
grpcServer.addMethod("TestService", {
name: "Test",
handler: async () => ({ success: true })
});
grpcServer.listen(50051);
console.log("HTTP server: http://localhost:3000");
console.log("WebSocket server: ws://localhost:3001");
console.log("gRPC server: localhost:50051");
Server Lifecycle
Startup
typescript
const app = createServer();
app.get("/", (req, res) => {
res.json({ message: "Server is running" });
});
// Configure and start
app.withOptions({ port: 3000 });
const server = app.listen();
console.log("Server started on port 3000");
Graceful Shutdown
typescript
const app = createServer();
const server = app.listen(3000);
// Graceful shutdown
process.on("SIGTERM", () => {
console.log("Shutting down gracefully...");
server.stop();
process.exit(0);
});
process.on("SIGINT", () => {
console.log("Shutting down gracefully...");
server.stop();
process.exit(0);
});
Error Handling
Server-Level Error Handling
typescript
const app = createServer();
// Global error handler
app.use((error, req, res, next) => {
console.error("Server error:", error);
res.status(500).json({ error: "Internal Server Error" });
});
// Catch server startup errors
try {
const server = app.listen(3000);
} catch (error) {
console.error("Failed to start server:", error);
process.exit(1);
}
Best Practices
- Protocol Selection: Choose the right protocol for your use case
- Error Handling: Always implement proper error handling
- Configuration: Use environment variables for configuration
- Security: Use secure protocols (HTTPS, WSS, gRPCS, TLS) in production
- Monitoring: Implement health checks and monitoring
- Graceful Shutdown: Handle shutdown signals properly
Next Steps
- Routing - Learn about routing in different protocols
- Middleware - Understand middleware for different server types
- Protocol Gateway - Runtime protocol switching
- Examples - See real-world server implementations