github.com/safing/portbase@v0.19.5/template/module.go (about)

     1  package template
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/safing/portbase/config"
     8  	"github.com/safing/portbase/modules"
     9  	"github.com/safing/portbase/modules/subsystems"
    10  )
    11  
    12  const (
    13  	eventStateUpdate = "state update"
    14  )
    15  
    16  var module *modules.Module
    17  
    18  func init() {
    19  	// register module
    20  	module = modules.Register("template", prep, start, stop) // add dependencies...
    21  	subsystems.Register(
    22  		"template-subsystem",                           // ID
    23  		"Template Subsystem",                           // name
    24  		"This subsystem is a template for quick setup", // description
    25  		module,
    26  		"config:template", // key space for configuration options registered
    27  		&config.Option{
    28  			Name:         "Template Subsystem",
    29  			Key:          "config:subsystems/template",
    30  			Description:  "This option enables the Template Subsystem [TEMPLATE]",
    31  			OptType:      config.OptTypeBool,
    32  			DefaultValue: false,
    33  		},
    34  	)
    35  
    36  	// register events that other modules can subscribe to
    37  	module.RegisterEvent(eventStateUpdate, true)
    38  }
    39  
    40  func prep() error {
    41  	// register options
    42  	err := config.Register(&config.Option{
    43  		Name:            "language",
    44  		Key:             "template/language",
    45  		Description:     "Sets the language for the template [TEMPLATE]",
    46  		OptType:         config.OptTypeString,
    47  		ExpertiseLevel:  config.ExpertiseLevelUser, // default
    48  		ReleaseLevel:    config.ReleaseLevelStable, // default
    49  		RequiresRestart: false,                     // default
    50  		DefaultValue:    "en",
    51  		ValidationRegex: "^[a-z]{2}$",
    52  	})
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	// register event hooks
    58  	// do this in prep() and not in start(), as we don't want to register again if module is turned off and on again
    59  	err = module.RegisterEventHook(
    60  		"template",               // event source module name
    61  		"state update",           // event source name
    62  		"react to state changes", // description of hook function
    63  		eventHandler,             // hook function
    64  	)
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	// hint: event hooks and tasks will not be run if module isn't online
    70  	return nil
    71  }
    72  
    73  func start() error {
    74  	// register tasks
    75  	module.NewTask("do something", taskFn).Queue()
    76  
    77  	// start service worker
    78  	module.StartServiceWorker("do something", 0, serviceWorker)
    79  
    80  	return nil
    81  }
    82  
    83  func stop() error {
    84  	return nil
    85  }
    86  
    87  func serviceWorker(ctx context.Context) error {
    88  	for {
    89  		select {
    90  		case <-time.After(1 * time.Second):
    91  			err := do()
    92  			if err != nil {
    93  				return err
    94  			}
    95  		case <-ctx.Done():
    96  			return nil
    97  		}
    98  	}
    99  }
   100  
   101  func taskFn(ctx context.Context, task *modules.Task) error {
   102  	return do()
   103  }
   104  
   105  func eventHandler(ctx context.Context, data interface{}) error {
   106  	return do()
   107  }
   108  
   109  func do() error {
   110  	return nil
   111  }