yao/trace/jsapi/jsapi.go
Max c25fbb22d7 Add trace management to context and enhance configuration options
- Introduced a trace manager in the context struct for lazy initialization and management of trace operations.
- Implemented the Trace method in the context to facilitate trace object creation and management within JavaScript.
- Enhanced configuration options for trace drivers, including defaults for local and store drivers, and added path and prefix settings.
- Updated related tests to verify the functionality of the new trace management features.
2025-11-19 12:27:42 +08:00

83 lines
2.2 KiB
Go

package jsapi
import (
"fmt"
v8 "github.com/yaoapp/gou/runtime/v8"
"github.com/yaoapp/gou/runtime/v8/bridge"
"rogchap.com/v8go"
)
func init() {
// Auto-register Trace JavaScript API when package is imported
v8.RegisterFunction("Trace", ExportFunction)
}
// Usage from JavaScript:
//
// const trace = new Trace({ driver: "local", path: "/tmp/traces" })
// const node = trace.Add({ type: "step", content: "Processing..." }, { label: "Step 1" })
// node.Complete({ result: "Done" })
//
// Objects:
// - Trace: Main trace manager (constructor)
// - Node: Individual trace node
// - Space: Memory space for key-value storage
// ExportFunction exports the Trace constructor function template
// This is used by v8.RegisterFunction
func ExportFunction(iso *v8go.Isolate) *v8go.FunctionTemplate {
return v8go.NewFunctionTemplate(iso, traceConstructor)
}
// traceConstructor is the JavaScript constructor for Trace
// Usage: new Trace(options)
func traceConstructor(info *v8go.FunctionCallbackInfo) *v8go.Value {
ctx := info.Context()
args := info.Args()
// Parse options
options := make(map[string]interface{})
if len(args) > 0 && !args[0].IsNullOrUndefined() {
optionsJS, err := bridge.GoValue(args[0], ctx)
if err != nil {
return bridge.JsException(ctx, fmt.Sprintf("invalid options: %s", err))
}
if optionsMap, ok := optionsJS.(map[string]interface{}); ok {
options = optionsMap
}
}
// Create trace object
traceObj, err := TraceNew(ctx, options)
if err != nil {
return bridge.JsException(ctx, err.Error())
}
return traceObj
}
// ExportLoadFunction exports the Trace.Load static method
// This can be used to load an existing trace by ID
func ExportLoadFunction(iso *v8go.Isolate) *v8go.FunctionTemplate {
return v8go.NewFunctionTemplate(iso, traceLoadFunction)
}
// traceLoadFunction is the JavaScript function for Trace.Load
// Usage: Trace.Load(traceID)
func traceLoadFunction(info *v8go.FunctionCallbackInfo) *v8go.Value {
ctx := info.Context()
args := info.Args()
if len(args) < 1 {
return bridge.JsException(ctx, "Load requires a trace ID")
}
traceID := args[0].String()
traceObj, err := TraceLoad(ctx, traceID)
if err != nil {
return bridge.JsException(ctx, err.Error())
}
return traceObj
}