mirror of
https://github.com/navidrome/navidrome.git
synced 2026-03-04 06:35:52 +00:00
refactor(plugins): rename scheduler callback methods for consistency and clarity
Signed-off-by: Deluan <deluan@navidrome.org>
This commit is contained in:
parent
e6e2582abf
commit
59085145f5
@ -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.
|
||||
|
||||
@ -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'
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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...
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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(())
|
||||
}
|
||||
};
|
||||
|
||||
4
plugins/testdata/test-scheduler/main.go
vendored
4
plugins/testdata/test-scheduler/main.go
vendored
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user