- 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.
83 lines
2.2 KiB
Go
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
|
|
}
|