Server side ES6 APIs and implementation of the Bayeux Protocol for NodeJS 18.x or greater. WebSocket not (yet) supported.
npm install cometd-nodejs-server
npm install mocha
npm install cometd
npm install cometd-nodejs-client
npm test
import * as http from "node:http";
import * as cometd from "cometd-nodejs-server";
// Create the CometD server instance.
const cometdServer = cometd.createCometDServer();
// Create an HTTP server, and bind request/response handling to the CometD server.
const httpServer = http.createServer((request, response) => cometdServer.handle(request, response));
httpServer.listen(0, "localhost", () => {
// Your application code here, see examples below.
});
import * as cometd from "cometd-nodejs-server";
const cometdServer = cometd.createCometDServer({
logLevel: "debug", // Emits logging on the console
timeout: 10000, // Heartbeat timeout in milliseconds
maxInterval: 15000, // Server-side session expiration in milliseconds
...
});
CometD clients send periodic heartbeat messages on the /meta/connect
channel.
The CometD server holds these heartbeat messages for at most the timeout
value
(see above), by default 20 seconds.
The NodeJS server also has a timeout
property that controls the maximum time
to handle a request/response cycle, by default 120 seconds.
You want to be sure that NodeJS' Server.timeout
is greater than CometD"s
CometDServer.options.timeout
, especially if you plan to increase the CometD
timeout.
const channel = cometdServer.createServerChannel("/service/chat");
// Add a listener to be notified when a message arrives on the channel.
channel.addListener("message", function(session, channel, message, callback) {
// Your message handling here.
// Invoke the callback to signal that handling is complete.
callback();
});
const channel = cometdServer.createServerChannel("/chat");
// Publishes the data string "hello" to all subscribers of the given channel.
channel.publish(null, "hello");
cometdServer.policy = {
canHandshake: (session, message, callback) => {
// Your handshake policy here.
const allowed = ...;
// Invoke the callback to signal the policy result.
callback(null, allowed);
}
};
const session = cometdServer.getServerSession(sessionId);
// Deliver the message only to the given session.
session.deliver(null, "/service/chat", {
text: "lorem ipsum"
});
session.addListener("removed", (session, timeout) => {
if (timeout) {
// Session was expired by the server.
} else {
// Session was explicitly disconnected.
}
});
In certain cases it is necessary to access contextual information such as the HTTP request that carries incoming CometD messages, or the HTTP response that carries outgoing CometD messages.
const channel = cometdServer.createServerChannel("/chat");
channel.addListener("message", (session, channel, message, callback) => {
// Access contextual information.
const request = cometdServer.context.request;
if (request) {
// You can read headers from the NodeJS HTTP request.
const myHeader = request.headers["X-My-Header"];
...
}
var response = cometdServer.context.response;
if (response) {
// You can add headers to the NodeJS HTTP response.
response.setHeader("X-My-Header", "foo_bar");
...
}
// Invoke the callback to signal that handling is complete.
callback();
});
NOTE: always check if the
request
andresponse
objects are defined; they may not be defined if the transport used is not HTTP but, for example in the future, WebSocket.