calog/API.md

11 KiB

calog script API reference

Every function below is a native that calog registers into each engine, so a script in any language can call it. This reference covers the natives the calog runner and its libraries expose. (For the C embedding API -- calogCreate, calogRegister, calogFnInvoke, etc. -- see the README and src/calog.h.)

Conventions

  • Calling syntax per engine. Most engines call a native by its bare name -- cryptoUuid(), kvSet("k", 1). Two differ:
    • Wren: Calog.call("name", [args]), e.g. Calog.call("kvSet", ["k", 1]).
    • Scheme (s7): s-expression form, (kvSet "k" 1).
  • Output & exit (provided by the calog runner): calogPrint(...) writes to stdout; calogExit([code]) tears everything down and exits. calog is event-driven, so a script must call calogExit (or be interrupted) to end -- a finished top level does not exit.
  • Values. Arguments and results marshal through one canonical type: nil, bool, integer, real, string, list, and map (keyed record). Strings are binary-safe (may contain embedded NULs) everywhere the underlying library allows it.
  • Handles (db connections, sockets, ssh sessions) are opaque values owned by the context that created them; do not share a live handle across contexts.
  • Callbacks. Natives that take a function argument (psSubscribe, timerAfter, timerEvery, calogExport) accept a first-class function value. All engines support this, including my-basic (a top-level def or lambda; see vendor/ourbasic).
  • Availability. Every library in this reference is compiled into bin/calog: crypto, json, kv, fs, time, timer, export, pubsub, task, net (TCP / UDP / ENet), db (SQLite / PostgreSQL / MySQL), http, and ssh. ssh needs a reachable server; http needs a reachable endpoint.

Runner (calog binary)

Function Description
calogPrint(...) Write each argument to stdout, space-separated, with a trailing newline.
calogExit([code]) Tear down the runtime and exit the process with code (default 0).

crypto

Binary-safe cryptographic primitives over OpenSSL.

Function Description
cryptoHashSha256(data) -> hex SHA-256 as a 64-char lowercase hex digest.
cryptoHashSha1(data) -> hex SHA-1 as a 40-char lowercase hex digest.
cryptoHmacSha256(key, data) -> hex HMAC-SHA-256 as 64-char lowercase hex.
cryptoRandomBytes(count) -> bytes count cryptographically-random bytes (binary string).
cryptoBase64Encode(data) -> text Base64-encode.
cryptoBase64Decode(text) -> data Base64-decode (trailing whitespace tolerated).
cryptoHexEncode(data) -> text Lowercase hex encode.
cryptoHexDecode(hexText) -> data Hex decode (case-insensitive).
cryptoUuid() -> string A random RFC 4122 version-4 UUID string.

db

SQL over SQLite, PostgreSQL, and MySQL/MariaDB. Parameters are always bound (never string-spliced), so queries are injection-safe. Values marshal as: NULL <-> nil, integers/ reals as-is, text and BLOBs as binary-safe strings.

Function Description
dbOpen(driver, conn) -> handle Open a connection. driver is "sqlite", "postgres", or "mysql". conn is a SQLite path or ":memory:", a libpq conninfo, or a MySQL key=value ... string.
dbExec(handle, sql, ...params) -> rowsAffected Run a non-query statement with bound params; returns rows affected.
dbQuery(handle, sql, ...params) -> rows Run a query; returns a list of {column: value} row maps.
dbClose(handle) Close the connection.

export

Share a function by name across contexts and engines.

Function Description
calogExport(name, fn) Publish function fn under a global name.
calogUnexport(name) Remove an exported name.
calogCall(name, ...args) -> result Call an exported function by name -- works in every engine. (On hook engines -- Lua/JS/Squirrel/s7 -- an export is also reachable by its bare name.)

fs

POSIX filesystem access. A failed operation raises a catchable script error carrying strerror(errno).

Function Description
fsRead(path) -> string Read a whole file (binary-safe).
fsWrite(path, data) Create/truncate and write data.
fsAppend(path, data) Create if absent, append at the end.
fsExists(path) -> bool Whether the path exists.
fsRemove(path) Unlink a file.
fsMkdir(path) Create one directory level (existing dir is OK).
fsList(path) -> list Entry name strings, excluding . and ...
fsStat(path) -> map {size, isDir, isFile, mtime}, or nil if the path is absent.

http

Minimal HTTP/1.1 client over http:// and https://. Each call is its own connection (Connection: close); redirects are not followed. https:// verifies the server certificate against the system CA store by default.

Function Description
httpGet(url) -> map GET a URL. Returns {status, body, headers} (headers keyed by lowercased name).
httpRequest(opts) -> map opts is {method (default "GET"), url, headers (map), body, insecure (bool)}. insecure=true skips TLS verification. Returns {status, body, headers}.

json

Function Description
jsonParse(text) -> value Parse JSON: object -> map, array -> list, number -> int or real, string, true/false, null -> nil.
jsonStringify(value) -> text Serialize a value to compact JSON text.

kv

A process-wide, thread-safe store shared by every context and engine. Holds data only (a function value is rejected). Keys are binary-safe.

Function Description
kvSet(key, value) Store a deep copy of value under key (replaces any existing).
kvGet(key) -> value A deep copy of the stored value, or nil if absent.
kvHas(key) -> bool Whether the key is present.
kvDelete(key) Remove the key (no error if absent).
kvKeys() -> list A list of the stored keys (strings).

net

Three first-class transports -- TCP, UDP, and ENet (reliable/ordered delivery over UDP) -- all always available. Payloads are binary-safe strings. Blocking calls (tcpAccept/tcpRecv/udpRecvFrom/enetService) stall only the calling context's thread.

TCP and UDP:

Function Description
tcpConnect(host, port) -> handle Connect to a TCP server.
tcpListen(port) -> handle Listen on a TCP port.
tcpAccept(handle) -> handle Block for a client; returns a connection handle.
tcpSend(handle, data) -> bytesSent Send all of data.
tcpRecv(handle, maxBytes) -> data Read up to maxBytes; nil at end of stream.
tcpClose(handle) Close a socket.
udpOpen(port) -> handle Open a UDP socket (port 0 = ephemeral).
udpSendTo(handle, host, port, data) -> bytesSent Send a datagram.
udpRecvFrom(handle, maxBytes) -> map Receive one datagram: {data, host, port}.
udpClose(handle) Close a UDP socket.

ENet (reliable UDP -- ordered, reliable channels over UDP):

Function Description
enetHost(port, maxPeers) -> hostHandle Create an ENet host.
enetConnect(hostHandle, host, port, channels) -> peerHandle Initiate a connection to a peer.
enetService(hostHandle, timeoutMs) -> event Poll for one event within timeoutMs. Returns {type, ...} where type is "none", "connect", "receive" (with peer, channel, data), or "disconnect".
enetSend(peerHandle, channel, data, reliable) Queue a packet on a channel; reliable is a bool.
enetDisconnect(peerHandle) Begin disconnecting a peer.
enetClose(hostHandle) Destroy an ENet host.

pubsub

Deliver a message to every subscriber of a topic, across contexts and engines. Delivery is synchronous; each subscriber runs on its own context's thread and gets a deep copy of the message. Keep publish graphs acyclic.

Function Description
psSubscribe(topic, fn) -> id Register fn to receive messages published on topic.
psUnsubscribe(id) Drop the subscription with that id.
psPublish(topic, msg) -> count Deliver a copy of msg to every subscriber; returns how many were invoked.

ssh

SSH/SFTP over libssh2. Requires a reachable SSH server. Payloads are binary-safe.

Function Description
sshConnect(host[, port]) -> handle Connect (port defaults to 22).
sshAuthPassword(handle, user, password) -> bool Password authentication.
sshAuthKey(handle, user, privateKeyPath[, publicKeyPath, passphrase]) -> bool Public-key authentication.
sshExec(handle, command) -> map Run a remote command: {stdout, stderr, exitCode}.
sshClose(handle) Close the session.
sftpGet(handle, remotePath) -> data Read a remote file whole (binary-safe).
sftpPut(handle, remotePath, data) Create/truncate a remote file (mode 0644).
sftpList(handle, path) -> list [{name, size, isDir}, ...].
sftpStat(handle, path) -> map {size, isDir}, or nil if the path is missing.
sftpRemove(handle, path) Remove a remote file.
sftpMkdir(handle, path) Create a remote directory (mode 0755).

task

Launch and manage other calog script contexts. Tasks are fire-and-forget: a spawned context runs on its own thread; results come back through host natives or the shared kv/pubsub. A task is owned by the context that spawned it, and only that owner may taskEval/taskClose.

Function Description
taskSpawn(engine, code) -> handle Run a code string on a named engine ("lua", "javascript", "squirrel", "mybasic", "berry", "scheme", "wren").
taskLoad(baseName) -> handle Launch a script file (engine chosen by extension).
taskEval(handle, code) Feed more code into a running task (runs on its thread).
taskClose(handle) Stop a task (cooperative: waits for its thread to exit).
taskSelf() -> id The calling script's own context id.
taskCount() -> n Number of tasks this library currently holds open.

time

Function Description
timeNow() -> real Wall-clock epoch seconds, fractional (CLOCK_REALTIME).
timeMonotonic() -> real Seconds from an unspecified origin (CLOCK_MONOTONIC); use for intervals.
timeSleep(ms) Block the calling context for ms milliseconds.

timer

One background thread drives every timer; each callback runs on the context that created the timer.

Function Description
timerAfter(ms, fn) -> id Fire fn once, ms milliseconds from now.
timerEvery(ms, fn) -> id Fire fn every ms milliseconds.
timerCancel(id) Stop a pending or repeating timer.