add some missing godocs on allocators and Run

This commit is contained in:
Daniel Martí 2019-03-21 15:21:52 +00:00
parent b136a6267e
commit a93c63124f
2 changed files with 23 additions and 9 deletions

View File

@ -11,17 +11,24 @@ import (
"sync" "sync"
) )
// An Allocator is responsible for creating and managing a number of browsers.
//
// This interface abstracts away how the browser process is actually run. For
// example, an Allocator implementation may reuse browser processes, or connect
// to already-running browsers on remote machines.
type Allocator interface { type Allocator interface {
// Allocate creates a new browser from the pool. It can be cancelled via // Allocate creates a new browser. It can be cancelled via the provided
// the provided context, at which point all the resources used by the // context, at which point all the resources used by the browser (such
// browser (such as temporary directories) will be cleaned up. // as temporary directories) will be freed.
Allocate(context.Context) (*Browser, error) Allocate(context.Context) (*Browser, error)
// Wait can be called after cancelling a pool's context, to block until // Wait can be called after cancelling an allocator's context, to block
// all the pool's resources have been cleaned up. // until all of its resources have been freed.
Wait() Wait()
} }
// NewAllocator creates a new allocator context, suitable for use with
// NewContext or Run.
func NewAllocator(parent context.Context, opts ...AllocatorOption) (context.Context, context.CancelFunc) { func NewAllocator(parent context.Context, opts ...AllocatorOption) (context.Context, context.CancelFunc) {
ctx, cancel := context.WithCancel(parent) ctx, cancel := context.WithCancel(parent)
c := &Context{} c := &Context{}
@ -36,6 +43,7 @@ func NewAllocator(parent context.Context, opts ...AllocatorOption) (context.Cont
type AllocatorOption func(*Allocator) type AllocatorOption func(*Allocator)
// WithExecAllocator returns an AllocatorOption which sets up an ExecAllocator.
func WithExecAllocator(opts ...ExecAllocatorOption) func(*Allocator) { func WithExecAllocator(opts ...ExecAllocatorOption) func(*Allocator) {
return func(p *Allocator) { return func(p *Allocator) {
ep := &ExecAllocator{ ep := &ExecAllocator{
@ -53,6 +61,8 @@ func WithExecAllocator(opts ...ExecAllocatorOption) func(*Allocator) {
type ExecAllocatorOption func(*ExecAllocator) type ExecAllocatorOption func(*ExecAllocator)
// ExecAllocator is an Allocator which starts new browser processes on the host
// machine.
type ExecAllocator struct { type ExecAllocator struct {
execPath string execPath string
initFlags map[string]interface{} initFlags map[string]interface{}
@ -141,6 +151,9 @@ func (p *ExecAllocator) Wait() {
p.wg.Wait() p.wg.Wait()
} }
// ExecPath returns an ExecAllocatorOption which uses the given path to execute
// browser processes. The given path can be an absolute path to a binary, or
// just the name of the program to find via exec.LookPath.
func ExecPath(path string) ExecAllocatorOption { func ExecPath(path string) ExecAllocatorOption {
return func(p *ExecAllocator) { return func(p *ExecAllocator) {
if fullPath, _ := exec.LookPath(path); fullPath != "" { if fullPath, _ := exec.LookPath(path); fullPath != "" {

View File

@ -19,7 +19,7 @@ type Executor interface {
Execute(context.Context, string, json.Marshaler, json.Unmarshaler) error Execute(context.Context, string, json.Marshaler, json.Unmarshaler) error
} }
// Context // Context is attached to any context.Context which is valid for use with Run.
type Context struct { type Context struct {
Allocator Allocator Allocator Allocator
@ -54,13 +54,15 @@ func NewContext(parent context.Context, opts ...ContextOption) (context.Context,
type contextKey struct{} type contextKey struct{}
// FromContext creates a new browser context from the provided context. // FromContext extracts the Context data stored inside a context.Context.
func FromContext(ctx context.Context) *Context { func FromContext(ctx context.Context) *Context {
c, _ := ctx.Value(contextKey{}).(*Context) c, _ := ctx.Value(contextKey{}).(*Context)
return c return c
} }
// Run runs the action against the provided browser context. // Run runs an action against the provided context. The provided context must
// contain a valid Allocator; typically, that will be created via NewContext or
// NewAllocator.
func Run(ctx context.Context, action Action) error { func Run(ctx context.Context, action Action) error {
c := FromContext(ctx) c := FromContext(ctx)
if c == nil || c.Allocator == nil { if c == nil || c.Allocator == nil {
@ -115,5 +117,4 @@ func (c *Context) newSession(ctx context.Context) error {
return nil return nil
} }
// ContextOption
type ContextOption func(*Context) type ContextOption func(*Context)