Skip to content

Node.js SDK

The Jetsocket Node.js library allows you to trigger events and manage your Jetsocket app from your Node.js server.

Terminal window
npm install jetsocket
const Jetsocket = require("jetsocket");
const jetsocket = new Jetsocket({
appId: "APP_ID",
key: "APP_KEY",
secret: "APP_SECRET",
cluster: "APP_CLUSTER",
});
// Trigger an event
jetsocket.trigger("my-channel", "my-event", { message: "Hello world!" });
const jetsocket = new Jetsocket({
appId: "APP_ID",
key: "APP_KEY",
secret: "APP_SECRET",
cluster: "APP_CLUSTER",
useTLS: true,
encryptionMasterKey: "your-encryption-key", // For encrypted channels
host: "api.jetsocket.io",
port: 443,
timeout: 30000,
keepAlive: true,
keepAliveMsecs: 1000,
maxSockets: 100,
maxFreeSockets: 10,
freeSocketKeepAliveTimeout: 30000,
});
ParameterTypeDefaultDescription
appIdString-Your Jetsocket app ID
keyString-Your Jetsocket app key
secretString-Your Jetsocket app secret
clusterString-Your Jetsocket cluster
useTLSBooleantrueUse TLS for connections
encryptionMasterKeyString-Master key for encrypted channels
hostStringapi.jetsocket.ioJetsocket API host
portNumber443Jetsocket API port
timeoutNumber30000Request timeout
keepAliveBooleantrueEnable keep-alive
maxSocketsNumber100Maximum number of sockets
jetsocket.trigger("my-channel", "my-event", { message: "Hello world!" });
jetsocket.trigger(["channel-1", "channel-2"], "my-event", { message: "Hello world!" });
jetsocket.trigger("my-channel", "my-event", { message: "Hello world!" }, {
socket_id: "123.456"
});
jetsocket.triggerToUser("user-123", "my-event", { message: "Hello user!" });
jetsocket.triggerToUsers(["user-123", "user-456"], "my-event", { message: "Hello users!" });
const express = require("express");
const Jetsocket = require("jetsocket");
const app = express();
app.use(express.json());
const jetsocket = new Jetsocket({
appId: "APP_ID",
key: "APP_KEY",
secret: "APP_SECRET",
cluster: "APP_CLUSTER",
});
app.post("/jetsocket/auth", (req, res) => {
const socketId = req.body.socket_id;
const channel = req.body.channel_name;
// Verify the user can access this channel
if (canAccessChannel(req.user, channel)) {
const authResponse = jetsocket.authorizeChannel(socketId, channel);
res.send(authResponse);
} else {
res.status(403).send("Forbidden");
}
});
function canAccessChannel(user, channel) {
// Your authorization logic here
if (channel.startsWith("private-user-")) {
const userId = channel.replace("private-user-", "");
return user.id === userId;
}
return false;
}
app.post("/jetsocket/auth", (req, res) => {
const socketId = req.body.socket_id;
const channel = req.body.channel_name;
const user = req.user;
if (canAccessChannel(user, channel)) {
const authResponse = jetsocket.authorizeChannel(socketId, channel, {
user_id: user.id,
user_info: {
name: user.name,
email: user.email
}
});
res.send(authResponse);
} else {
res.status(403).send("Forbidden");
}
});
app.post("/jetsocket/user-auth", (req, res) => {
const socketId = req.body.socket_id;
const user = req.user;
const authResponse = jetsocket.authenticateUser(socketId, {
user_id: user.id,
user_info: {
name: user.name,
email: user.email
}
});
res.send(authResponse);
});
app.post("/jetsocket/webhook", (req, res) => {
const webhook = jetsocket.webhook(req);
if (webhook.isValid()) {
// Process webhook events
webhook.getEvents().forEach(event => {
console.log("Webhook event:", event.name, event.data);
});
res.status(200).send("OK");
} else {
res.status(400).send("Invalid webhook");
}
});
const webhook = jetsocket.webhook(req, {
webhookSecret: "your-webhook-secret"
});
// Get channel info
jetsocket.getChannelInfo("my-channel").then(info => {
console.log("Channel info:", info);
});
// Get channel with user count
jetsocket.getChannelInfo("presence-my-channel", { info: "user_count" }).then(info => {
console.log("User count:", info.user_count);
});
jetsocket.getChannels().then(channels => {
console.log("All channels:", channels);
});
// Get channels with filters
jetsocket.getChannels({
prefix: "private-",
info: "user_count"
}).then(channels => {
console.log("Private channels:", channels);
});
jetsocket.getUserInfo("user-123").then(user => {
console.log("User info:", user);
});
jetsocket.getUsers().then(users => {
console.log("All users:", users);
});
jetsocket.terminateUserConnections("user-123").then(() => {
console.log("User connections terminated");
});
jetsocket.trigger("my-channel", "my-event", { message: "Hello" })
.then(response => {
console.log("Event triggered successfully:", response);
})
.catch(error => {
console.error("Error triggering event:", error);
});
async function triggerEvent() {
try {
const response = await jetsocket.trigger("my-channel", "my-event", { message: "Hello" });
console.log("Event triggered successfully:", response);
} catch (error) {
console.error("Error triggering event:", error);
}
}
const express = require("express");
const Jetsocket = require("jetsocket");
const app = express();
app.use(express.json());
const jetsocket = new Jetsocket({
appId: "APP_ID",
key: "APP_KEY",
secret: "APP_SECRET",
cluster: "APP_CLUSTER",
});
// Middleware to authenticate users
const authenticateUser = (req, res, next) => {
const token = req.headers.authorization;
if (token) {
req.user = verifyToken(token);
next();
} else {
res.status(401).send("Unauthorized");
}
};
// Channel authorization
app.post("/jetsocket/auth", authenticateUser, (req, res) => {
const socketId = req.body.socket_id;
const channel = req.body.channel_name;
const user = req.user;
if (canAccessChannel(user, channel)) {
const authResponse = jetsocket.authorizeChannel(socketId, channel);
res.send(authResponse);
} else {
res.status(403).send("Forbidden");
}
});
// User authentication
app.post("/jetsocket/user-auth", authenticateUser, (req, res) => {
const socketId = req.body.socket_id;
const user = req.user;
const authResponse = jetsocket.authenticateUser(socketId, {
user_id: user.id,
user_info: {
name: user.name,
email: user.email
}
});
res.send(authResponse);
});
// Trigger events
app.post("/trigger", authenticateUser, async (req, res) => {
try {
const { channel, event, data } = req.body;
await jetsocket.trigger(channel, event, data);
res.json({ success: true });
} catch (error) {
console.error("Error triggering event:", error);
res.status(500).json({ error: "Failed to trigger event" });
}
});
// Get channel info
app.get("/channels/:channel", authenticateUser, async (req, res) => {
try {
const info = await jetsocket.getChannelInfo(req.params.channel);
res.json(info);
} catch (error) {
console.error("Error getting channel info:", error);
res.status(500).json({ error: "Failed to get channel info" });
}
});
// Webhook endpoint
app.post("/jetsocket/webhook", (req, res) => {
const webhook = jetsocket.webhook(req);
if (webhook.isValid()) {
webhook.getEvents().forEach(event => {
console.log("Webhook event:", event.name, event.data);
});
res.status(200).send("OK");
} else {
res.status(400).send("Invalid webhook");
}
});
function canAccessChannel(user, channel) {
if (channel.startsWith("private-user-")) {
const userId = channel.replace("private-user-", "");
return user.id === userId;
}
if (channel === "private-admin-dashboard") {
return user.role === "admin";
}
return false;
}
app.listen(3000, () => {
console.log("Server running on port 3000");
});
import Jetsocket from 'jetsocket';
const jetsocket: Jetsocket = new Jetsocket({
appId: "APP_ID",
key: "APP_KEY",
secret: "APP_SECRET",
cluster: "APP_CLUSTER",
});
interface MessageData {
message: string;
timestamp: string;
}
async function sendMessage(channel: string, data: MessageData): Promise<void> {
try {
await jetsocket.trigger(channel, "new-message", data);
} catch (error) {
console.error("Failed to send message:", error);
}
}
// Always handle errors
jetsocket.trigger("my-channel", "my-event", data)
.catch(error => {
console.error("Failed to trigger event:", error);
// Implement retry logic or fallback
});
const rateLimit = require("express-rate-limit");
const triggerLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.post("/trigger", triggerLimiter, (req, res) => {
// Your trigger logic
});
// Log all events for debugging
app.post("/trigger", (req, res) => {
const { channel, event, data } = req.body;
console.log(`Triggering event ${event} on channel ${channel}:`, data);
jetsocket.trigger(channel, event, data)
.then(() => {
console.log(`Successfully triggered ${event} on ${channel}`);
res.json({ success: true });
})
.catch(error => {
console.error(`Failed to trigger ${event} on ${channel}:`, error);
res.status(500).json({ error: "Failed to trigger event" });
});
});
  • Learn about channels and different channel types
  • Explore authentication for secure applications
  • Check out webhooks for real-time notifications
  • See examples for complete application patterns