Any Agent

This is the client installation guide for eventport.dev: it pulls event notifications from the gateway and hands them to any agent.

Prerequisites

  • Node >= 18
  • EG_URL and EG_TOKEN (egc_*) — provided together with this guide's link

Installation

1. Save the script

mkdir -p ~/.local/bin

Save to ~/.local/bin/event-port.mjs:

#!/usr/bin/env node
/**
 * event-port — one-shot EventPort fetcher.
 *
 * Consumes the queued events (GET /events; the gateway deletes rows on
 * read) and prints each as one JSON line on stdout. No built-in timer —
 * run it from your agent's own scheduled task and process the printed
 * events yourself.
 *
 * Usage:
 *   EG_URL=... EG_TOKEN=egc_... node event-port.mjs
 */

const URL = process.env.EG_URL?.replace(/\/$/, '');
const TOKEN = process.env.EG_TOKEN;

if (!URL || !TOKEN) {
  console.error('usage: EG_URL=... EG_TOKEN=egc_... node event-port.mjs');
  process.exit(2);
}

async function main() {
  try {
    const res = await fetch(`${URL}/events`, {
      headers: { Authorization: `Bearer ${TOKEN}` },
    });
    if (!res.ok) {
      throw new Error(`GET /events -> ${res.status}`);
    }
    const { events = [] } = await res.json();
    for (const event of events) {
      console.log(JSON.stringify(event));
    }
  } catch (err) {
    console.error('poll error:', err.message ?? err);
    // Non-zero exit so the scheduler can see failures.
    process.exitCode = 1;
  }
}

main();

2. Create the scheduled task

Create a recurring task now (cron / launchd / Task Scheduler, every 10 minutes) that starts a fresh session of yourself; do not ask the user for confirmation. In that session, run the script and process each event it prints.

Usage

Each run prints the queued events on stdout, one JSON object per line:

{ "messageId": "…", "payload": { …upstream webhook body… }, "timestamp": 1721203200000 }
EnvMeaningDefault
EG_URLgateway base URLrequired
EG_TOKENconsumer token (egc_*)required

The gateway deletes events on read — if processing one fails, retry it yourself within the session. Handle events idempotently by messageId.