Skip to main content

Node.js SDK

Node.js/TypeScript client for the beachcomber shell state daemon. No external runtime dependencies — pure Node.js stdlib (net, fs, os, path). Published on npm.

Requirements

  • Node.js 18+
  • A running comb daemon

Installation

npm install libbeachcomber

Quick start

import { Client } from 'libbeachcomber';

const client = new Client();

const result = await client.get('git.branch', '/path/to/repo');
if (result.isHit) {
console.log(result.getString()); // e.g. "main"
console.log(result.ageMs); // e.g. 1234
console.log(result.stale); // false
}

API reference

Client

const client = new Client();
const client = new Client({ socketPath: '/custom/path' });
const client = new Client({ socketPath: '/custom/path', timeoutMs: 2000 });

client.get(key, path?)

Read a cached value. Returns a CombResult.

const result = await client.get('git.branch', '/some/repo');
const result = await client.get('hostname'); // global provider, no path needed
const result = await client.get('git', '/some/repo'); // full provider (returns object)

client.poke(key, path?)

Force the daemon to recompute a provider.

await client.poke('git', '/some/repo');

client.list()

List available providers.

const providers = await client.list();
// [{ name: 'git', global: false, fields: ['branch', 'dirty', ...] }, ...]

client.status()

Return daemon status information.

client.session()

Open a persistent connection. More efficient when querying multiple keys in sequence (one TCP round-trip per query instead of one connection per query).

const session = await client.session();
await session.setContext('/some/repo'); // optional — sets default path
const branch = await session.get('git.branch');
const dirty = await session.get('git.dirty');
await session.poke('git');
session.close();

CombResult

Property / methodTypeDescription
isHitbooleantrue when the cache had a value
isMissbooleantrue when the cache had no value
dataunknownRaw data (undefined on miss)
ageMsnumberCache age in milliseconds (0 on miss)
stalebooleanWhether the value is stale (false on miss)
getString(field?)string | undefinedData as a string; picks a named field from object results
getNumber(field?)number | undefinedData as a number
getBool(field?)boolean | undefinedData as a boolean

For full provider queries (e.g. key = "git"), the data is an object. Use the field argument to pick a field:

const result = await client.get('git', '/repo');
result.getString('branch'); // "main"
result.getBool('dirty'); // false

Errors

ClassWhen thrown
DaemonNotRunningSocket does not exist or connection was refused
ServerErrorDaemon responded with {"ok":false,"error":"..."}
ParseErrorResponse was not valid JSON or not an object

All extend CombError which extends Error.

Unsupported operations

The store and watch protocol operations are not currently exposed in this SDK. Use the CLI (comb p for store, comb w for watch) or speak the raw protocol directly over a Unix socket.

Socket discovery

The socket path is resolved in this order:

  1. $XDG_RUNTIME_DIR/beachcomber/sock
  2. $TMPDIR/beachcomber-<uid>/sock
  3. <os.tmpdir()>/beachcomber-<uid>/sock

Override with the socketPath option.