IronFunctions is extensible so you can add custom functionality and extend the project without needing to modify the core.
Listeners are the main way to extend IronFunctions.
You can easily use listeners basically creating a struct with [valid methods](#Listener Requirements) and adding it to the IronFunctions API
.
Example:
package main
import (
"context"
"github.com/iron-io/functions/api/server"
"github.com/iron-io/functions/api/models"
)
type myCustomListener struct{}
func (c *myCustomListener) BeforeAppCreate(ctx context.Context, app *models.App) error { return nil }
func (c *myCustomListener) AfterAppCreate(ctx context.Context, app *models.App) error { return nil }
func (c *myCustomListener) BeforeAppUpdate(ctx context.Context, app *models.App) error { return nil }
func (c *myCustomListener) AfterAppUpdate(ctx context.Context, app *models.App) error { return nil }
func (c *myCustomListener) BeforeAppDelete(ctx context.Context, app *models.App) error { return nil }
func (c *myCustomListener) BeforeAppDelete(ctx context.Context, app *models.App) error { return nil }
function main () {
srv := server.New(/* Here all required parameters to initialize the server */)
srv.AddAppCreateListener(myCustomListener)
srv.AddAppUpdateListener(myCustomListener)
srv.AddAppDeleteListener(myCustomListener)
srv.Run()
}
These are all available listeners:
To be a valid listener your struct should respect interfaces combined or alone found in this file
Triggers before and after every app creation that happens in the API
Triggered on requests to the following routes:
- POST /v1/apps
- POST /v1/apps/:app/routes
Triggers before and after every app updates that happens in the API
Triggered during requests to the following routes:
- PUT /v1/apps
Triggers before and after every app deletion that happens in the API
Triggered during requests to the following routes:
- DELETE /v1/apps/:app
To be a valid listener your struct should respect interfaces combined or alone found in this file.
Triggers before and after every function run
Triggered during requests to the following routes:
- GET /r/:app/:route
- POST /r/:app/:route
To understand how Special Handlers works you need to understand what are Special Routes.
Special Routes are routes that doesn't match any other API route.
With Special Handlers you can change the behavior of special routes in order to define which function is going to be executed.
For example, let's use special handlers to define mydomain
as the appname
for any request for mydomain.com
.
type SpecialHandler struct{}
func (h *SpecialHandler) Handle(c server.HandlerContext) error {
host := c.Request().Host
if host == "mydomain.com" {
c.Set("app", "mydomain")
}
}
func main () {
sh := &SpecialHandler{}
srv := server.New(/* Here all required parameters to initialize the server */)
srv.AddSpecialHandler(sh)
srv.Run()
}
With the code above, a request to http://mydomain.com/hello
will trigger the function /mydomain/hello