Skip to main content
Installing the package
Language

JavaScript Package

Use cside's JavaScript package to verify webhook signatures and handle notification events with full TypeScript support.

Installing the package

Install the cside webhooks package:

npm i @cside.dev/webhooks

Using the package

import { constructEvent } from "@cside.dev/webhooks";

const rawBody = req.rawBody; // This is the raw body from the request, how you get this will depend on your HTTP framework
const signature = req.headers["x-cside-signature"]; // This will always be provided in the headers.

const event = await constructEvent({
  rawBody,
  signature,
  secret: process.env.CSIDE_WEBHOOK_SECRET, // This is the webhook secret you configured when adding the webhook destination
});

switch (event.type) {
  case "alert.created": {
    const alert = event.data;
    // ^ entirely type safe
    console.log({
      type: alert.type,
      domain: alert.domain,
      target: alert.target,
      action: alert.action,
    });
  }
}

Examples

import Fastify from 'fastify';
import { constructEvent } from "@cside.dev/webhooks";

const fastify = Fastify({ logger: true });
await fastify.register(import('@fastify/raw-body'), {
	field: 'rawBody',
	global: false,
	routes: ['/webhook']
});

fastify.post('/webhook', {
	config: { rawBody: true }
}, async (request, reply) => {
	const signature = request.headers['x-cside-signature'];
	const webhookEvent = await constructEvent(
		request.rawBody,
		signature,
		process.env.CSIDE_WEBHOOK_SECRET!,
	);

	switch (webhookEvent.event) {
		case "alert.created": {
			const alert = webhookEvent.data;
			console.log({
				type: alert.type,
				domain: alert.domain,
				target: alert.target,
				action: alert.action,
			});
		}
	}
});
import { createKaitoHandler, KaitoError } from "@kaito-http/core";
import { constructEvent } from "@cside.dev/webhooks";

const app = router()
  .get("/", async ({ ctx }) => {
    return {
      uptime: ctx.uptime,
      time_now: Date.now(),
    };
  })
  .post("/", async ({ ctx }) => {
    const signature = ctx.req.headers.get("x-cside-signature");
    if (!signature) {
      throw new KaitoError(400, "Missing signature");
    }
    const rawBody = await ctx.req.text();

    const webhookEvent = await constructEvent(
      rawBody,
      signature,
      process.env.CSIDE_WEBHOOK_SECRET!,
    );

    switch (webhookEvent.event) {
      case "alert.created": {
        const alert = webhookEvent.data;
        console.log({
          type: alert.type,
          domain: alert.domain,
          target: alert.target,
          action: alert.action,
        });
      }
    }

    return {
      message: "OK!",
    };
});
Was this page helpful?