/* script.h - sandboxed Lua event hooks on a dedicated bounded worker. */ #ifndef NAUT_SCRIPT_H #define NAUT_SCRIPT_H #include "naut/event.h" typedef struct naut_script naut_script; typedef naut_err (*naut_script_move_file_cb)(void *context, uint64_t torrent_id, uint32_t file_index, const char *destination); /* Resolve a torrent's labels for `naut.get_labels(id)`. Returns a heap array of * `*count` heap strings (caller frees each string then the array), or NULL with * *count==0 if the torrent has no labels / is unknown. */ typedef char **(*naut_script_labels_cb)(void *context, uint64_t torrent_id, size_t *count); /* One user-configurable setting a script declares via naut.define_settings. */ typedef struct { const char *key; /* stable identifier read by naut.get_setting */ const char *label; /* human label for the web UI form */ const char *type; /* "string" | "bool" | "number" */ const char *default_value; /* stringified default ("true"/"false" for bool)*/ } naut_script_setting_def; /* The script (re)declared its settings schema. The host stores it and renders a * form; `defs` is valid only for the duration of the call. */ typedef void (*naut_script_define_settings_cb)(void *context, const naut_script_setting_def *defs, size_t count); /* Setting value kinds, so the Lua side can push the right type. */ typedef enum { NAUT_SETTING_STRING = 0, NAUT_SETTING_BOOL = 1, NAUT_SETTING_NUMBER = 2, } naut_setting_type; /* Resolve a setting for `naut.get_setting(key)`: the user-set value if present, * else the declared default. Returns a heap string (caller frees) and sets * *type, or NULL if the key is unknown. */ typedef char *(*naut_script_get_setting_cb)(void *context, const char *key, naut_setting_type *type); /* Host callbacks the sandboxed script may invoke. Any may be NULL (the matching * naut.* function then reports it is unavailable). `context` is passed back to * each callback. */ typedef struct { naut_script_move_file_cb move_file; naut_script_labels_cb labels; naut_script_define_settings_cb define_settings; naut_script_get_setting_cb get_setting; void *context; } naut_script_host; typedef struct { uint64_t queued; uint64_t handled; uint64_t dropped; uint64_t errors; uint64_t move_requests; } naut_script_stats; /* script_path is loaded before the worker starts. queue_capacity bounds copied * events and must be non-zero. The VM owns no filesystem or process APIs. `host` * is copied; its callbacks are invoked from the script worker thread. */ naut_script *naut_script_create(naut_event_bus *events, const char *script_path, size_t queue_capacity, const naut_script_host *host, naut_err *error); void naut_script_destroy(naut_script *script); void naut_script_get_stats(const naut_script *script, naut_script_stats *stats); const char *naut_script_last_error(naut_script *script); #endif /* NAUT_SCRIPT_H */