Files
frankenphp/workerextension.go
Kévin Dunglas 8341cc98c6 refactor: rely on context.Context for log/slog and others (#1969)
* refactor: rely on context.Context for log/slog and others

* optimize

* refactor

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix watcher-skip

* better globals handling

* fix

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-17 16:32:23 +01:00

58 lines
1.7 KiB
Go

package frankenphp
import (
"context"
"net/http"
)
// EXPERIMENTAL: Workers allows you to register a worker.
type Workers interface {
// SendRequest calls the closure passed to frankenphp_handle_request() and updates the PHP context .
// The generated HTTP response will be written through the provided writer.
SendRequest(rw http.ResponseWriter, r *http.Request) error
// SendMessage calls the closure passed to frankenphp_handle_request(), passes message as a parameter, and returns the value produced by the closure.
SendMessage(ctx context.Context, message any, rw http.ResponseWriter) (any, error)
// NumThreads returns the number of available threads.
NumThreads() int
}
type extensionWorkers struct {
name string
fileName string
num int
options []WorkerOption
internalWorker *worker
}
// EXPERIMENTAL: SendRequest sends an HTTP request to the worker and writes the response to the provided ResponseWriter.
func (w *extensionWorkers) SendRequest(rw http.ResponseWriter, r *http.Request) error {
fr, err := NewRequestWithContext(
r,
WithOriginalRequest(r),
WithWorkerName(w.name),
)
if err != nil {
return err
}
return ServeHTTP(rw, fr)
}
func (w *extensionWorkers) NumThreads() int {
return w.internalWorker.countThreads()
}
// EXPERIMENTAL: SendMessage sends a message to the worker and waits for a response.
func (w *extensionWorkers) SendMessage(ctx context.Context, message any, rw http.ResponseWriter) (any, error) {
fc := newFrankenPHPContext()
fc.logger = globalLogger
fc.worker = w.internalWorker
fc.responseWriter = rw
fc.handlerParameters = message
err := w.internalWorker.handleRequest(contextHolder{context.WithValue(ctx, contextKey, fc), fc})
return fc.handlerReturn, err
}