diff --git a/plugins/capabilities/scheduler_callback.go b/plugins/capabilities/scheduler_callback.go index cd141121d..93f66f10d 100644 --- a/plugins/capabilities/scheduler_callback.go +++ b/plugins/capabilities/scheduler_callback.go @@ -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. diff --git a/plugins/capabilities/scheduler_callback.yaml b/plugins/capabilities/scheduler_callback.yaml index 34358a697..a7a73cf00 100644 --- a/plugins/capabilities/scheduler_callback.yaml +++ b/plugins/capabilities/scheduler_callback.yaml @@ -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' diff --git a/plugins/cmd/ndpgen/internal/generator.go b/plugins/cmd/ndpgen/internal/generator.go index 42c2dc352..803a4236e 100644 --- a/plugins/cmd/ndpgen/internal/generator.go +++ b/plugins/cmd/ndpgen/internal/generator.go @@ -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) } diff --git a/plugins/examples/crypto-ticker/main.go b/plugins/examples/crypto-ticker/main.go index b197430f2..9d05ddb8f 100755 --- a/plugins/examples/crypto-ticker/main.go +++ b/plugins/examples/crypto-ticker/main.go @@ -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 diff --git a/plugins/examples/discord-rich-presence-rs/src/lib.rs b/plugins/examples/discord-rich-presence-rs/src/lib.rs index 829602ba6..df49eba4e 100644 --- a/plugins/examples/discord-rich-presence-rs/src/lib.rs +++ b/plugins/examples/discord-rich-presence-rs/src/lib.rs @@ -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 diff --git a/plugins/examples/discord-rich-presence/main.go b/plugins/examples/discord-rich-presence/main.go index f702f708f..37fddf88b 100644 --- a/plugins/examples/discord-rich-presence/main.go +++ b/plugins/examples/discord-rich-presence/main.go @@ -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 diff --git a/plugins/examples/library-inspector-rs/src/lib.rs b/plugins/examples/library-inspector-rs/src/lib.rs index 1ecae4b9e..88ff1b787 100644 --- a/plugins/examples/library-inspector-rs/src/lib.rs +++ b/plugins/examples/library-inspector-rs/src/lib.rs @@ -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 diff --git a/plugins/pdk/go/README.md b/plugins/pdk/go/README.md index aae8e3547..19f3a97bc 100644 --- a/plugins/pdk/go/README.md +++ b/plugins/pdk/go/README.md @@ -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... diff --git a/plugins/pdk/go/scheduler/scheduler.go b/plugins/pdk/go/scheduler/scheduler.go index 862c044de..dc70f0695 100644 --- a/plugins/pdk/go/scheduler/scheduler.go +++ b/plugins/pdk/go/scheduler/scheduler.go @@ -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 } diff --git a/plugins/pdk/go/scheduler/scheduler_stub.go b/plugins/pdk/go/scheduler/scheduler_stub.go index c07a0d28a..44b79c800 100644 --- a/plugins/pdk/go/scheduler/scheduler_stub.go +++ b/plugins/pdk/go/scheduler/scheduler_stub.go @@ -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. diff --git a/plugins/pdk/rust/nd-pdk-capabilities/src/scheduler.rs b/plugins/pdk/rust/nd-pdk-capabilities/src/scheduler.rs index b9f188363..a77688a6d 100644 --- a/plugins/pdk/rust/nd-pdk-capabilities/src/scheduler.rs +++ b/plugins/pdk/rust/nd-pdk-capabilities/src/scheduler.rs @@ -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(()) } }; diff --git a/plugins/testdata/test-scheduler/main.go b/plugins/testdata/test-scheduler/main.go index 76bcc9077..5276f9215 100644 --- a/plugins/testdata/test-scheduler/main.go +++ b/plugins/testdata/test-scheduler/main.go @@ -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:": 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 {