package jsmod import ( "context" "sync" ) type contextKey string const SafeModeKey contextKey = "SafeMode" // IsSafeMode checks if the provided context indicates that the execution is in safe mode. func IsSafeMode(ctx context.Context) bool { v := ctx.Value(SafeModeKey) if sm, ok := v.(bool); ok { return sm } return false // Default to false if not specified (internal trusted caller) } type Module struct { Exports map[string]any UnsafeList map[string]bool } var ( modules = make(map[string]*Module) mu sync.RWMutex ) // Register registers a Go module with its exported functions and properties. // These modules will be accessible within the JS environment. // unsafeList identifies methods that require elevated permissions (e.g., file writing, shell execution). func Register(name string, exports map[string]any, unsafeList ...string) { mu.Lock() defer mu.Unlock() if modules[name] == nil { modules[name] = &Module{ Exports: make(map[string]any, len(exports)), UnsafeList: make(map[string]bool), } } for k, v := range exports { modules[name].Exports[k] = v } for _, method := range unsafeList { modules[name].UnsafeList[method] = true } } // GetModules returns all registered modules and their unsafe status. func GetModules() map[string]*Module { mu.RLock() defer mu.RUnlock() res := make(map[string]*Module, len(modules)) for name, mod := range modules { res[name] = mod } return res }