mirror of
https://github.com/navidrome/navidrome.git
synced 2026-03-04 06:35:52 +00:00
127 lines
4.2 KiB
Go
127 lines
4.2 KiB
Go
// Code generated by ndpgen. DO NOT EDIT.
|
|
//
|
|
// This file contains export wrappers for the HTTPEndpoint capability.
|
|
// It is intended for use in Navidrome plugins built with TinyGo.
|
|
//
|
|
//go:build wasip1
|
|
|
|
package httpendpoint
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"encoding/json"
|
|
|
|
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
|
|
)
|
|
|
|
// HTTPHandleRequest is the input provided when an HTTP request is dispatched to a plugin.
|
|
type HTTPHandleRequest struct {
|
|
// Method is the HTTP method (GET, POST, PUT, DELETE, PATCH, etc.).
|
|
Method string `json:"method"`
|
|
// Path is the request path relative to the plugin's base URL.
|
|
// For example, if the full URL is /ext/my-plugin/webhook, Path is "/webhook".
|
|
// Both /ext/my-plugin and /ext/my-plugin/ are normalized to Path = "".
|
|
Path string `json:"path"`
|
|
// Query is the raw query string without the leading '?'.
|
|
Query string `json:"query,omitempty"`
|
|
// Headers contains the HTTP request headers.
|
|
Headers map[string][]string `json:"headers,omitempty"`
|
|
// Body is the request body content.
|
|
Body []byte `json:"-"`
|
|
// User contains the authenticated user information. Nil for auth:"none" endpoints.
|
|
User *HTTPUser `json:"user,omitempty"`
|
|
}
|
|
|
|
// HTTPHandleResponse is the response returned by the plugin's HandleRequest function.
|
|
type HTTPHandleResponse struct {
|
|
// Status is the HTTP status code. Defaults to 200 if zero or not set.
|
|
Status int32 `json:"status,omitempty"`
|
|
// Headers contains the HTTP response headers to set.
|
|
Headers map[string][]string `json:"headers,omitempty"`
|
|
// Body is the response body content.
|
|
Body []byte `json:"-"`
|
|
}
|
|
|
|
// HTTPUser contains authenticated user information passed to the plugin.
|
|
type HTTPUser struct {
|
|
// ID is the internal Navidrome user ID.
|
|
ID string `json:"id"`
|
|
// Username is the user's login name.
|
|
Username string `json:"username"`
|
|
// Name is the user's display name.
|
|
Name string `json:"name"`
|
|
// IsAdmin indicates whether the user has admin privileges.
|
|
IsAdmin bool `json:"isAdmin"`
|
|
}
|
|
|
|
// HTTPEndpoint requires all methods to be implemented.
|
|
// HTTPEndpoint allows plugins to handle incoming HTTP requests.
|
|
// Plugins that declare the 'endpoints' permission must implement this capability.
|
|
// The host dispatches incoming HTTP requests to the plugin's HandleRequest function.
|
|
type HTTPEndpoint interface {
|
|
// HandleRequest - HandleRequest processes an incoming HTTP request and returns a response.
|
|
HandleRequest(HTTPHandleRequest) (HTTPHandleResponse, error)
|
|
} // Internal implementation holders
|
|
var (
|
|
handleRequestImpl func(HTTPHandleRequest) (HTTPHandleResponse, error)
|
|
)
|
|
|
|
// Register registers a httpendpoint implementation.
|
|
// All methods are required.
|
|
func Register(impl HTTPEndpoint) {
|
|
handleRequestImpl = impl.HandleRequest
|
|
}
|
|
|
|
// NotImplementedCode is the standard return code for unimplemented functions.
|
|
// The host recognizes this and skips the plugin gracefully.
|
|
const NotImplementedCode int32 = -2
|
|
|
|
//go:wasmexport nd_http_handle_request
|
|
func _NdHttpHandleRequest() int32 {
|
|
if handleRequestImpl == nil {
|
|
// Return standard code - host will skip this plugin gracefully
|
|
return NotImplementedCode
|
|
}
|
|
|
|
// Parse input frame: [json_len:4B][JSON without []byte field][raw bytes]
|
|
raw := pdk.Input()
|
|
if len(raw) < 4 {
|
|
pdk.SetErrorString("malformed input frame")
|
|
return -1
|
|
}
|
|
jsonLen := binary.BigEndian.Uint32(raw[:4])
|
|
if uint32(len(raw)-4) < jsonLen {
|
|
pdk.SetErrorString("invalid json length in input frame")
|
|
return -1
|
|
}
|
|
var input HTTPHandleRequest
|
|
if err := json.Unmarshal(raw[4:4+jsonLen], &input); err != nil {
|
|
pdk.SetError(err)
|
|
return -1
|
|
}
|
|
input.Body = raw[4+jsonLen:]
|
|
|
|
output, err := handleRequestImpl(input)
|
|
if err != nil {
|
|
// Error frame: [0x01][UTF-8 error message]
|
|
errMsg := []byte(err.Error())
|
|
errFrame := make([]byte, 1+len(errMsg))
|
|
errFrame[0] = 0x01
|
|
copy(errFrame[1:], errMsg)
|
|
pdk.Output(errFrame)
|
|
return 0
|
|
}
|
|
|
|
// Success frame: [0x00][json_len:4B][JSON without []byte field][raw bytes]
|
|
jsonBytes, _ := json.Marshal(output)
|
|
rawBytes := output.Body
|
|
frame := make([]byte, 1+4+len(jsonBytes)+len(rawBytes))
|
|
frame[0] = 0x00
|
|
binary.BigEndian.PutUint32(frame[1:5], uint32(len(jsonBytes)))
|
|
copy(frame[5:5+len(jsonBytes)], jsonBytes)
|
|
copy(frame[5+len(jsonBytes):], rawBytes)
|
|
pdk.Output(frame)
|
|
|
|
return 0
|
|
}
|