refactor(plugins): rename scheduler callback methods for consistency and clarity

Signed-off-by: Deluan <deluan@navidrome.org>
This commit is contained in:
Deluan 2025-12-30 17:19:09 -05:00
parent e6e2582abf
commit 59085145f5
12 changed files with 45 additions and 52 deletions

View File

@ -7,10 +7,10 @@ package capabilities
//
//nd:capability name=scheduler
type SchedulerCallback interface {
// OnSchedulerCallback is called when a scheduled task fires.
// OnCallback is called when a scheduled task fires.
// Errors are logged but do not affect the scheduling system.
//nd:export name=nd_scheduler_callback
OnSchedulerCallback(SchedulerCallbackRequest) error
OnCallback(SchedulerCallbackRequest) error
}
// SchedulerCallbackRequest is the request provided when a scheduled task fires.

View File

@ -2,7 +2,7 @@ version: v1-draft
exports:
nd_scheduler_callback:
description: |-
OnSchedulerCallback is called when a scheduled task fires.
OnCallback is called when a scheduled task fires.
Errors are logged but do not affect the scheduling system.
input:
$ref: '#/components/schemas/SchedulerCallbackRequest'

View File

@ -510,7 +510,6 @@ func hasHashMap(cap Capability) bool {
// registerMacroName returns the macro name for registering an optional method.
// For package "websocket" and method "OnClose", returns "register_websocket_close".
// Also handles deduplication when method name starts with package name (e.g., "scheduler" + "OnSchedulerCallback" → "register_scheduler_callback").
func registerMacroName(pkg, name string) string {
// Remove common prefixes from method name
for _, prefix := range []string{"Get", "On"} {
@ -519,12 +518,6 @@ func registerMacroName(pkg, name string) string {
break
}
}
// Check if the method name starts with the package name to avoid duplication
// e.g., package="scheduler", method="SchedulerCallback" → just "register_scheduler_callback"
pkgTitle := strings.Title(pkg) //nolint:staticcheck
if strings.HasPrefix(name, pkgTitle) {
return "register_" + ToSnakeCase(name)
}
return "register_" + ToSnakeCase(pkg) + "_" + ToSnakeCase(name)
}

View File

@ -61,12 +61,12 @@ func init() {
// Ensure cryptoTickerPlugin implements the required provider interfaces
var (
_ lifecycle.InitProvider = (*cryptoTickerPlugin)(nil)
_ websocket.TextMessageProvider = (*cryptoTickerPlugin)(nil)
_ websocket.BinaryMessageProvider = (*cryptoTickerPlugin)(nil)
_ websocket.ErrorProvider = (*cryptoTickerPlugin)(nil)
_ websocket.CloseProvider = (*cryptoTickerPlugin)(nil)
_ scheduler.SchedulerCallbackProvider = (*cryptoTickerPlugin)(nil)
_ lifecycle.InitProvider = (*cryptoTickerPlugin)(nil)
_ websocket.TextMessageProvider = (*cryptoTickerPlugin)(nil)
_ websocket.BinaryMessageProvider = (*cryptoTickerPlugin)(nil)
_ websocket.ErrorProvider = (*cryptoTickerPlugin)(nil)
_ websocket.CloseProvider = (*cryptoTickerPlugin)(nil)
_ scheduler.CallbackProvider = (*cryptoTickerPlugin)(nil)
)
// OnInit is called when the plugin is loaded.
@ -208,8 +208,8 @@ func (p *cryptoTickerPlugin) OnClose(input websocket.OnCloseRequest) error {
return nil
}
// OnSchedulerCallback is called when a scheduled task fires
func (p *cryptoTickerPlugin) OnSchedulerCallback(input scheduler.SchedulerCallbackRequest) error {
// OnCallback is called when a scheduled task fires
func (p *cryptoTickerPlugin) OnCallback(input scheduler.SchedulerCallbackRequest) error {
// Only handle our reconnection schedule
if input.ScheduleID != reconnectScheduleID {
return nil

View File

@ -24,7 +24,7 @@ use nd_pdk::scrobbler::{
ScrobbleRequest, Scrobbler, SCROBBLER_ERROR_NOT_AUTHORIZED, SCROBBLER_ERROR_RETRY_LATER,
};
use nd_pdk::scheduler::{
Error as SchedulerError, SchedulerCallbackProvider, SchedulerCallbackRequest,
CallbackProvider, Error as SchedulerError, SchedulerCallbackRequest,
};
use nd_pdk::websocket::{
BinaryMessageProvider, CloseProvider, Error as WebSocketError, ErrorProvider,
@ -203,8 +203,8 @@ impl Scrobbler for DiscordPlugin {
// Scheduler Callback Implementation
// ============================================================================
impl SchedulerCallbackProvider for DiscordPlugin {
fn on_scheduler_callback(&self, req: SchedulerCallbackRequest) -> Result<(), SchedulerError> {
impl CallbackProvider for DiscordPlugin {
fn on_callback(&self, req: SchedulerCallbackRequest) -> Result<(), SchedulerError> {
match req.payload.as_str() {
PAYLOAD_HEARTBEAT => {
// Heartbeat callback - schedule_id is the username

View File

@ -40,12 +40,12 @@ func init() {
// Ensure discordPlugin implements the required provider interfaces
var (
_ scrobbler.Scrobbler = (*discordPlugin)(nil)
_ scheduler.SchedulerCallbackProvider = (*discordPlugin)(nil)
_ websocket.TextMessageProvider = (*discordPlugin)(nil)
_ websocket.BinaryMessageProvider = (*discordPlugin)(nil)
_ websocket.ErrorProvider = (*discordPlugin)(nil)
_ websocket.CloseProvider = (*discordPlugin)(nil)
_ scrobbler.Scrobbler = (*discordPlugin)(nil)
_ scheduler.CallbackProvider = (*discordPlugin)(nil)
_ websocket.TextMessageProvider = (*discordPlugin)(nil)
_ websocket.BinaryMessageProvider = (*discordPlugin)(nil)
_ websocket.ErrorProvider = (*discordPlugin)(nil)
_ websocket.CloseProvider = (*discordPlugin)(nil)
)
// getConfig loads the plugin configuration.
@ -172,8 +172,8 @@ func (p *discordPlugin) Scrobble(_ scrobbler.ScrobbleRequest) error {
// Scheduler Callback Implementation
// ============================================================================
// OnSchedulerCallback handles scheduler callbacks.
func (p *discordPlugin) OnSchedulerCallback(input scheduler.SchedulerCallbackRequest) error {
// OnCallback handles scheduler callbacks.
func (p *discordPlugin) OnCallback(input scheduler.SchedulerCallbackRequest) error {
pdk.Log(pdk.LogDebug, fmt.Sprintf("Scheduler callback: id=%s, payload=%s, recurring=%v", input.ScheduleID, input.Payload, input.IsRecurring))
// Route based on payload

View File

@ -15,7 +15,7 @@
use extism_pdk::*;
use nd_pdk::host::{library, scheduler};
use nd_pdk::lifecycle::{Error as LifecycleError, InitProvider};
use nd_pdk::scheduler::{Error as SchedulerError, SchedulerCallbackProvider, SchedulerCallbackRequest};
use nd_pdk::scheduler::{CallbackProvider, Error as SchedulerError, SchedulerCallbackRequest};
use std::fs;
// Register capabilities using PDK macros
@ -62,8 +62,8 @@ impl InitProvider for LibraryInspector {
}
}
impl SchedulerCallbackProvider for LibraryInspector {
fn on_scheduler_callback(&self, req: SchedulerCallbackRequest) -> Result<(), SchedulerError> {
impl CallbackProvider for LibraryInspector {
fn on_callback(&self, req: SchedulerCallbackRequest) -> Result<(), SchedulerError> {
info!(
"Scheduler callback fired: schedule_id={}, payload={}, recurring={}",
req.schedule_id, req.payload, req.is_recurring

View File

@ -58,7 +58,7 @@ func (p *myPlugin) OnInit() error {
return nil
}
func (p *myPlugin) OnSchedulerCallback(req scheduler.SchedulerCallbackRequest) error {
func (p *myPlugin) OnCallback(req scheduler.SchedulerCallbackRequest) error {
// Handle scheduled task
return host.WebSocketBroadcast("task-complete", req.ScheduleID)
}
@ -183,7 +183,7 @@ func init() {
type myScheduler struct{}
func (s *myScheduler) OnSchedulerCallback(req scheduler.SchedulerCallbackRequest) error {
func (s *myScheduler) OnCallback(req scheduler.SchedulerCallbackRequest) error {
// Handle the scheduled task
if req.Payload == "update-data" {
// Do work...

View File

@ -32,19 +32,19 @@ type SchedulerCallbackRequest struct {
// to handle task execution.
type Scheduler interface{}
// SchedulerCallbackProvider provides the OnSchedulerCallback function.
type SchedulerCallbackProvider interface {
OnSchedulerCallback(SchedulerCallbackRequest) error
// CallbackProvider provides the OnCallback function.
type CallbackProvider interface {
OnCallback(SchedulerCallbackRequest) error
} // Internal implementation holders
var (
schedulerCallbackImpl func(SchedulerCallbackRequest) error
callbackImpl func(SchedulerCallbackRequest) error
)
// Register registers a scheduler implementation.
// The implementation is checked for optional provider interfaces.
func Register(impl Scheduler) {
if p, ok := impl.(SchedulerCallbackProvider); ok {
schedulerCallbackImpl = p.OnSchedulerCallback
if p, ok := impl.(CallbackProvider); ok {
callbackImpl = p.OnCallback
}
}
@ -54,7 +54,7 @@ const NotImplementedCode int32 = -2
//export nd_scheduler_callback
func _NdSchedulerCallback() int32 {
if schedulerCallbackImpl == nil {
if callbackImpl == nil {
// Return standard code - host will skip this plugin gracefully
return NotImplementedCode
}
@ -65,7 +65,7 @@ func _NdSchedulerCallback() int32 {
return -1
}
if err := schedulerCallbackImpl(input); err != nil {
if err := callbackImpl(input); err != nil {
pdk.SetError(err)
return -1
}

View File

@ -29,9 +29,9 @@ type SchedulerCallbackRequest struct {
// to handle task execution.
type Scheduler interface{}
// SchedulerCallbackProvider provides the OnSchedulerCallback function.
type SchedulerCallbackProvider interface {
OnSchedulerCallback(SchedulerCallbackRequest) error
// CallbackProvider provides the OnCallback function.
type CallbackProvider interface {
OnCallback(SchedulerCallbackRequest) error
}
// NotImplementedCode is the standard return code for unimplemented functions.

View File

@ -42,12 +42,12 @@ impl Error {
}
}
/// SchedulerCallbackProvider provides the OnSchedulerCallback function.
pub trait SchedulerCallbackProvider {
fn on_scheduler_callback(&self, req: SchedulerCallbackRequest) -> Result<(), Error>;
/// CallbackProvider provides the OnCallback function.
pub trait CallbackProvider {
fn on_callback(&self, req: SchedulerCallbackRequest) -> Result<(), Error>;
}
/// Register the on_scheduler_callback export.
/// Register the on_callback export.
/// This macro generates the WASM export function for this method.
#[macro_export]
macro_rules! register_scheduler_callback {
@ -57,7 +57,7 @@ macro_rules! register_scheduler_callback {
req: extism_pdk::Json<$crate::scheduler::SchedulerCallbackRequest>
) -> extism_pdk::FnResult<()> {
let plugin = <$plugin_type>::default();
$crate::scheduler::SchedulerCallbackProvider::on_scheduler_callback(&plugin, req.into_inner())?;
$crate::scheduler::CallbackProvider::on_callback(&plugin, req.into_inner())?;
Ok(())
}
};

View File

@ -13,12 +13,12 @@ func init() {
type testScheduler struct{}
// OnSchedulerCallback is called when a scheduled task fires.
// OnCallback is called when a scheduled task fires.
// Magic payloads trigger specific behaviors to test host functions:
// - "schedule-followup": schedules a one-time task via host function
// - "schedule-recurring": schedules a recurring task via host function
// - "schedule-duplicate:<id>": attempts to schedule with the given ID (for testing duplicate detection)
func (t *testScheduler) OnSchedulerCallback(input scheduler.SchedulerCallbackRequest) error {
func (t *testScheduler) OnCallback(input scheduler.SchedulerCallbackRequest) error {
switch {
case input.Payload == "schedule-followup":
if _, err := host.SchedulerScheduleOneTime(1, "followup-created", "followup-id"); err != nil {