App2App Samples
This article contains four sample Node.js programs demonstrating message consumption and emission for both Kaleido-managed destination certificates and externally-managed destination certificates.
Kaleido-Managed Sender
Replace the placeholders for APP2APP MESSAGING SERVICE API ENDPOINT, APP CRED USER, APP CRED PASSWORD, SENDER DESTINATION URI and RECIPIENT DESTINATION URI.
// This sample sends a message every two seconds from a Kaleido managed destination
const socket = require("socket.io-client")
.connect("APP2APP MESSAGING SERVICE API ENDPOINT", {
extraHeaders: {
Authorization:
"Basic " +
Buffer.from(
"APP CRED USER" + ":" + "APP CRED PASSWORD"
).toString("base64"),
},
})
.on("connect", () => {
console.log("Connected.");
setInterval(send, 2000);
})
.on("delivery-report", (data) => {
console.log("Delivery report: " + JSON.stringify(data));
})
.on("disconnect", () => {
console.log("Disconnected.");
})
.on("exception", (exception) => {
console.log("Exception: " + exception);
})
.on("error", (err) => {
console.log("Error: " + err);
})
.on("connect_error", (err) => {
console.log("Connection error: " + err);
});
function send() {
socket.emit(
"produce",
{
headers: {
from: "SENDER DESTINATION URI",
to: "RECEPIENT DESTINATION URI",
},
content: "Testing 1-2-3",
},
"samplekey",
(err) => {
if (err) {
console.log("Delivery error: " + err);
}
}
);
}
Kaleido-Managed Receiver
Replace the placeholders for APP2APP MESSAGING SERVICE API ENDPOINT, APP CREDENTIAL USER, APP CREDENTIAL PASSWORD and DESTINATION URI.
// This sample consumes messages from a Kaleido managed destination
const socket = require("socket.io-client")
.connect("APP2APP MESSAGING SERVICE API ENDPOINT", {
extraHeaders: {
Authorization:
"Basic " +
Buffer.from(
"APP CREDENTIAL USER" + ":" + "APP CREDENTIAL PASSWORD"
).toString("base64"),
},
})
.on("connect", () => {
console.log("Connected.");
socket.emit("subscribe", ["DESTINATION URI OR NAME"], (err, result) => {
if (err) {
console.log(err);
} else {
console.log(result);
}
});
})
.on("disconnect", () => {
console.log("Disconnected.");
})
.on("exception", (exception) => {
console.log("Exception: " + exception);
})
.on("error", (err) => {
console.log("Error: " + err);
})
.on("connect_error", (err) => {
console.log("Connection error: " + err);
})
.on("data", (message, key, timestamp) => {
console.log("Message from: " + message.headers.from);
console.log("Content: " + message.content);
console.log("key: " + key);
console.log("timestamp: " + timestamp);
});
Externally-Managed Sender
Replace the placeholders for APP2APP MESSAGING SERVICE API ENDPOINT, APP CRED USER, APP CRED PASSWORD, PRIVATE KEY PEM, SENDER DESTINATION URI and RECIPIENT DESTINATION URI
// This sample sends a message every two seconds from an externally managed destination
const socket = require("socket.io-client")
.connect("APP2APP MESSAGING SERVICE API ENDPOINT", {
extraHeaders: {
Authorization:
"Basic " +
Buffer.from(
"APP CRED USER" + ":" + "APP CRED PASSWORD"
).toString("base64"),
},
})
.on("connect", () => {
console.log("Connected.");
setInterval(send, 2000);
})
.on("delivery-report", (data) => {
console.log("Delivery report: " + JSON.stringify(data));
})
.on("disconnect", () => {
console.log("Client disconnected.");
})
.on("exception", (exception) => {
console.log("Service reported an exception: " + exception);
})
.on("error", (err) => {
console.log("Error: " + err);
})
.on("connect_error", (err) => {
console.log("Connection error: " + err);
});
function send() {
let content = "Testing 1-2-3";
let signature = require("crypto")
.createSign("RSA-SHA256")
.update(content)
.sign("PRIVATE KEY PEM");
socket.emit(
"produce",
{
headers: {
from: "SENDER DESTINATION URI",
to: "RECEPIENT DESTINATION URI",
signature,
},
content,
},
"samplekey",
(err) => {
if (err) {
console.log("Delivery error: " + err);
}
}
);
}
Externally-Managed Receiver
Replace the placeholders for APP2APP MESSAGING SERVICE API ENDPOINT, APP CREDENTIAL USER, APP CREDENTIAL PASSWORD, RECIPIENT DESTINATION URI, RECIPIENT PRIVATE KEY PEM and SENDER CERTIFICATE PEM.
// This sample consumes messages from a Kaleido managed destination
const socket = require("socket.io-client")
.connect("APP2APP MESSAGING SERVICE API ENDPOINT", {
extraHeaders: {
Authorization:
"Basic " +
Buffer.from(
"APP CREDENTIAL USER" + ":" + "APP CREDENTIAL PASSWORD"
).toString("base64"),
},
})
.on("connect", () => {
console.log("Connected.");
socket.emit(
"subscribe",
["RECEPIENT DESTINATION URI OR NAME"],
(err, result) => {
if (err) {
console.log(err);
} else {
console.log(result);
}
}
);
})
.on("disconnect", () => {
console.log("Disconnected.");
})
.on("exception", (exception) => {
console.log("Exception: " + exception);
})
.on("error", (err) => {
console.log("Error: " + err);
})
.on("connect_error", (err) => {
console.log("Connection error: " + err);
})
.on("data", (pkcs7Envelope, key, timestamp) => {
const forge = require("node-forge");
const pkcs7 = forge.pkcs7.messageFromPem(pkcs7Envelope);
pkcs7.decrypt(
pkcs7.recipients[0],
forge.pki.privateKeyFromPem("RECEPIENT PRIVATE KEY PEM")
);
const message = JSON.parse(pkcs7.content.toString());
console.log("Message: " + message.content);
console.log("Key: " + key + ", timestamp: " + timestamp);
console.log(
"Signature checks out: " +
require("crypto")
.createVerify("RSA-SHA256")
.update(message.content)
.verify(
"SENDER CERTIFICATE PEM OBTAINED FROM ID REGISTRY BASED ON SENDER DESTINATION URI",
Buffer.from(message.headers.signature)
)
);
});