- Updated the objectRegister method to generate a new ID internally, simplifying the API by removing the need for an external ID parameter. - Adjusted the NewObject method to utilize the new object registration mechanism, ensuring proper ID assignment and resource cleanup during instance creation.
55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
package context
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/google/uuid"
|
|
"rogchap.com/v8go"
|
|
)
|
|
|
|
var objectsMutex = sync.Mutex{}
|
|
var objects = map[string]*Context{}
|
|
|
|
// JsValue return the JavaScript value of the context
|
|
func (ctx *Context) JsValue(v8ctx *v8go.Context) (*v8go.Value, error) {
|
|
return ctx.NewObject(v8ctx)
|
|
}
|
|
|
|
// NewObject Create a new JavaScript object from the context
|
|
func (ctx *Context) NewObject(v8ctx *v8go.Context) (*v8go.Value, error) {
|
|
|
|
jsObject := v8go.NewObjectTemplate(v8ctx.Isolate())
|
|
|
|
// Set the id and release function
|
|
id := ctx.objectRegister()
|
|
jsObject.Set("__id", id)
|
|
jsObject.Set("__release", ctx.objectRelease(v8ctx.Isolate(), id))
|
|
|
|
jsObject.Set("ChatID", ctx.ChatID)
|
|
jsObject.Set("AssistantID", ctx.AssistantID)
|
|
jsObject.Set("Sid", ctx.Sid)
|
|
instance, err := jsObject.NewInstance(v8ctx)
|
|
if err != nil {
|
|
ctx.objectRelease(v8ctx.Isolate(), id)
|
|
return nil, err
|
|
}
|
|
|
|
return instance.Value, nil
|
|
}
|
|
|
|
func (ctx *Context) objectRegister() string {
|
|
id := uuid.NewString()
|
|
objectsMutex.Lock()
|
|
defer objectsMutex.Unlock()
|
|
objects[id] = ctx
|
|
return id
|
|
}
|
|
|
|
func (ctx *Context) objectRelease(iso *v8go.Isolate, id string) *v8go.FunctionTemplate {
|
|
return v8go.NewFunctionTemplate(iso, func(info *v8go.FunctionCallbackInfo) *v8go.Value {
|
|
objectsMutex.Lock()
|
|
defer objectsMutex.Unlock()
|
|
delete(objects, id)
|
|
return v8go.Undefined(info.Context().Isolate())
|
|
})
|
|
}
|