Kaynağa Gözat

SVI Переделка под новые интерфейсы

SVI 5 ay önce
ebeveyn
işleme
d3baea2af3
100 değiştirilmiş dosya ile 962 ekleme ve 556 silme
  1. 4 4
      v4/cmd/demo/main_test.go
  2. 0 24
      v4/kc/log_buf/log_bus/log_bus.go
  3. 135 66
      v4/kern.go
  4. 12 14
      v4/kern_test.go
  5. 0 20
      v4/krn/kbus/kbus_local/client_bus_local/client_bus_local.go
  6. 1 1
      v4/lev0/ktypes/ikernel_server_http.go
  7. 3 3
      v4/lev0/ktypes/ilocal_ctx.go
  8. 2 2
      v4/lev0/ktypes/ioption.go
  9. 10 5
      v4/lev1/ctx_value/ctx_value.go
  10. 1 1
      v4/lev1/ctx_value/ctx_value_test.go
  11. 0 0
      v4/lev1/kbus_msg/msg_pub/msg_pub.go
  12. 0 0
      v4/lev1/kbus_msg/msg_pub/msg_pub_test.go
  13. 0 0
      v4/lev1/kbus_msg/msg_serve/msg_serve.go
  14. 0 0
      v4/lev1/kbus_msg/msg_serve/msg_serve_test.go
  15. 0 0
      v4/lev1/kbus_msg/msg_sub/msg_sub.go
  16. 0 0
      v4/lev1/kbus_msg/msg_sub/msg_sub_test.go
  17. 0 0
      v4/lev1/kbus_msg/msg_unsub/msg_unsub.go
  18. 0 0
      v4/lev1/kbus_msg/msg_unsub/msg_unsub_test.go
  19. 3 2
      v4/lev1/kint/kint.go
  20. 3 3
      v4/lev1/kint/kint_test.go
  21. 143 0
      v4/lev1/lev1.go
  22. 26 14
      v4/lev1/local_ctx/local_ctx.go
  23. 5 5
      v4/lev1/local_ctx/local_ctx_test.go
  24. 18 18
      v4/lev1/log_buf/log_buf.go
  25. 0 0
      v4/lev1/log_buf/log_buf_test.go
  26. 30 0
      v4/lev1/log_dict_topic/log_dict_topic.go
  27. 4 7
      v4/lev1/log_dict_topic/log_dict_topic_test.go
  28. 0 0
      v4/lev1/log_msg/log_msg.go
  29. 0 0
      v4/lev1/log_msg/log_msg_test.go
  30. 6 6
      v4/lev1/lst_sort/lst_sort_test.go
  31. 5 0
      v4/lev1/mock_env/mock_env.go
  32. 0 0
      v4/lev1/mock_env/mock_env_test.go
  33. 4 2
      v4/lev1/option/option.go
  34. 0 0
      v4/lev1/safe_bool_react/safe_bool_react.go
  35. 0 0
      v4/lev1/safe_bool_react/safe_bool_react_test.go
  36. 1 1
      v4/lev1/safe_int/safe_int.go
  37. 0 0
      v4/lev1/safe_int/safe_int_test.go
  38. 0 0
      v4/lev1/safe_string/safe_string.go
  39. 0 0
      v4/lev1/safe_string/safe_string_test.go
  40. 25 9
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go
  41. 10 12
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go
  42. 16 9
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go
  43. 14 28
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go
  44. 23 10
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go
  45. 3 8
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go
  46. 48 20
      v4/lev2/kbus_base/kbus_base.go
  47. 11 21
      v4/lev2/kbus_base/kbus_base_test.go
  48. 58 33
      v4/lev2/kbus_http/client_bus_http/client_bus_http.go
  49. 20 25
      v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go
  50. 36 18
      v4/lev2/kbus_http/kbus_http.go
  51. 13 14
      v4/lev2/kbus_http/kbus_http_test.go
  52. 28 0
      v4/lev2/kbus_local/client_bus_local/client_bus_local.go
  53. 1 1
      v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go
  54. 13 5
      v4/lev2/kbus_local/kbus_local.go
  55. 4 4
      v4/lev2/kbus_local/kbus_local_test.go
  56. 19 8
      v4/lev2/kctx/kctx.go
  57. 4 4
      v4/lev2/kctx/kctx_test.go
  58. 19 9
      v4/lev2/kernel_keeper/kernel_keeper.go
  59. 2 2
      v4/lev2/kernel_keeper/kernel_keeper_test.go
  60. 23 8
      v4/lev2/kmodule/kmodule.go
  61. 7 9
      v4/lev2/kmodule/kmodule_test.go
  62. 3 3
      v4/lev2/kmodule/mod_stat/mod_stat.go
  63. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go
  64. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go
  65. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go
  66. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go
  67. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  68. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go
  69. 0 0
      v4/lev2/kmodule/mod_stat/mod_stat_test.go
  70. 36 14
      v4/lev2/kmonolit/kmonolit.go
  71. 12 14
      v4/lev2/kmonolit/kmonolit_test.go
  72. 33 18
      v4/lev2/kserv_http/kserv_http.go
  73. 12 16
      v4/lev2/kserv_http/kserv_http_test.go
  74. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-grid.min.css
  75. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-grid.min.css.map
  76. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-grid.rtl.min.css
  77. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-grid.rtl.min.css.map
  78. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-reboot.min.css
  79. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-reboot.min.css.map
  80. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-reboot.rtl.min.css
  81. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-reboot.rtl.min.css.map
  82. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-utilities.min.css
  83. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-utilities.min.css.map
  84. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-utilities.rtl.min.css
  85. 0 0
      v4/lev2/kserv_http/static/css/bootstrap-utilities.rtl.min.css.map
  86. 0 0
      v4/lev2/kserv_http/static/css/bootstrap.min.css
  87. 0 0
      v4/lev2/kserv_http/static/css/bootstrap.min.css.map
  88. 0 0
      v4/lev2/kserv_http/static/css/bootstrap.rtl.min.css
  89. 0 0
      v4/lev2/kserv_http/static/css/bootstrap.rtl.min.css.map
  90. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.bundle.min.js
  91. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.bundle.min.js.map
  92. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.esm.min.js
  93. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.esm.min.js.map
  94. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.min.js
  95. 0 0
      v4/lev2/kserv_http/static/js/bootstrap.min.js.map
  96. 0 0
      v4/lev2/kserv_http/static/js/htmx.min.js
  97. 0 0
      v4/lev2/kserv_http/static/js/hyperscript.min.js
  98. 16 11
      v4/lev2/kserv_http_std/kserv_http_std.go
  99. 26 12
      v4/lev2/kstore_kv/kstore_kv.go
  100. 11 13
      v4/lev2/kstore_kv/kstore_kv_test.go

+ 4 - 4
v4/cmd/demo/main_test.go

@@ -5,16 +5,16 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 func TestMain(t *testing.T) {
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
-	os.Setenv("LOCAL_HTTP_URL", "http://localhost:18330/")
+	os.Setenv("LOCAL_HTTP_URL", "http://localhost:18332/")
 	go main()
 	time.Sleep(time.Second * 2)
-	kCtx := kctx.GetKernelCtx()
+	kCtx := kctx.GetKernelCtx().Hassert("TestMain()")
 	kCtx.Cancel()
 }

+ 0 - 24
v4/kc/log_buf/log_bus/log_bus.go

@@ -1,24 +0,0 @@
-// package log_bus -- хранитель топиков для логирования
-package log_bus
-
-import (
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-)
-
-type LogDictTopic struct {
-	sync.RWMutex
-	dict   map[kalias.ATopic]bool
-	client ktypes.IBusClient
-}
-
-// NewLogDictTopic -- возвращает новый словарь топиков для логирования
-func NewLogDictTopic(clientBus ktypes.IBusClient) *LogDictTopic {
-	sf := &LogDictTopic{
-		dict:   map[kalias.ATopic]bool{},
-		client: clientBus,
-	}
-	return sf
-}

+ 135 - 66
v4/kern.go

@@ -5,44 +5,58 @@ import (
 	"context"
 	"fmt"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_bool_react"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_string"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_http/client_bus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local/client_bus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kint"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmodule"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmonolit"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kstore_kv"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/option"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mds/mod_kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mds/mod_keeper"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mds/mod_serv_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mds/mod_wui"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http/client_bus_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local/client_bus_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_keeper"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_wui"
 )
 
 // GetKernelCtx -- возвращает контекст ядра
-func GetKernelCtx() IKernelCtx {
-	ctx := kctx.GetKernelCtx()
-	return ctx
+func GetKernelCtx() IResult[IKernelCtx] {
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("GetKernelCtx(): err=\n\t%w", resCtx.Err())
+		return NewErr[IKernelCtx](err)
+	}
+	return NewRes(IKernelCtx(resCtx.Val()))
+}
+
+// NewErr -- возвращает Result с ошибкой
+func NewErr[T any](err error) IResult[T] {
+	return lev1.NewErr[T](err)
+}
+
+// NewRes -- возвращает успешный Result с значением
+func NewRes[T any](res T) IResult[T] {
+	return lev1.NewRes(res)
+}
+
+// WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой
+func WrapErr[T any](res IResult[T], err error) IResult[T] {
+	return lev1.WrapErr(res, err)
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра
-func GetKernelStoreKv() IKernelStoreKv {
-	store := kstore_kv.GetKernelStore()
-	return store
+func GetKernelStoreKv() IResult[IKernelStoreKv] {
+	resStore := kstore_kv.GetKernelStore()
+	if resStore.IsErr() {
+		err := fmt.Errorf("GetKernelStoreKv(): err=\n\t%w", resStore.Err())
+		return NewErr[IKernelStoreKv](err)
+	}
+	store := IKernelStoreKv(resStore.Val())
+	return NewRes(store)
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра
@@ -53,16 +67,30 @@ func GetKernelServerHttp() IResult[IKernelServerHttp] {
 
 // NewSafeBool -- возвращает новый потокобезопасный булевый признак
 func NewSafeBool() ISafeBool {
-	sb := safe_bool.NewSafeBool()
+	sb := lev1.NewSafeBool()
 	return sb
 }
 
 // GetKernelBusLocal -- возвращает локальную шину данных
-func GetKernelBusLocal() IKernelBus {
-	ctx := kctx.GetKernelCtx()
-	ctx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
-	bus := kbus_local.GetKernelBusLocal()
-	return bus
+func GetKernelBusLocal() IResult[IKernelBus] {
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resCtx.Err())
+		return NewErr[IKernelBus](err)
+	}
+	kCtx := resCtx.Val()
+	resSet := kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resSet.Err())
+		return NewErr[IKernelBus](err)
+	}
+	resBus := kbus_local.GetKernelBusLocal()
+	if resBus.IsErr() {
+		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resBus.Err())
+		return NewErr[IKernelBus](err)
+	}
+	bus := IKernelBus(resBus.Val())
+	return NewRes(bus)
 }
 
 // GetKernelBusHttp -- возвращает HTTP шину данных
@@ -71,13 +99,28 @@ func GetKernelBusHttp() IResult[IKernelBus] {
 	return bus
 }
 
+// SleepMs -- спит миллисекунду
+func SleepMs() {
+	lev1.SleepMs()
+}
+
 // GetMonolitLocal -- возвращает монолит с локальной шиной
 func GetMonolitLocal(name string) IResult[IKernelMonolit] {
-	ctx := kctx.GetKernelCtx()
-	ctx.Set("isLocal", true, "bus type")
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resCtx.Err())
+		return NewErr[IKernelMonolit](err)
+	}
+	kCtx := resCtx.Val()
+	resSet := kCtx.Set("isLocal", true, "bus type")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resSet.Err())
+		return NewErr[IKernelMonolit](err)
+	}
 	for {
 		SleepMs()
-		if ctx.Get("isLocal") != nil {
+		optIsLocal := kCtx.Get("isLocal")
+		if optIsLocal.IsVal() {
 			break
 		}
 	}
@@ -92,12 +135,22 @@ func GetMonolitLocal(name string) IResult[IKernelMonolit] {
 
 // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP
 func GetMonolitHttp(name string) IResult[IKernelMonolit] {
-	ctx := kctx.GetKernelCtx()
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resCtx.Err())
+		return NewErr[IKernelMonolit](err)
+	}
+	kCtx := resCtx.Val()
 	_ = kbus_http.GetKernelBusHttp()
-	ctx.Set("isLocal", false, "bus type")
+	resSet := kCtx.Set("isLocal", false, "bus type")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resSet.Err())
+		return NewErr[IKernelMonolit](err)
+	}
 	for {
 		SleepMs()
-		if ctx.Get("isLocal") != nil {
+		optIsLocal := kCtx.Get("isLocal")
+		if optIsLocal.IsVal() {
 			break
 		}
 	}
@@ -116,9 +169,14 @@ func NewKernelModule(name AModuleName) IResult[IKernelModule] {
 }
 
 // NewClientBusLocal -- возвращает клиент для работы с локальной шиной
-func NewClientBusLocal() IBusClient {
-	client := client_bus_local.NewClientBusLocal()
-	return client
+func NewClientBusLocal() IResult[IBusClient] {
+	res := client_bus_local.NewClientBusLocal()
+	if res.IsErr() {
+		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", res.Err())
+		return NewErr[IBusClient](err)
+	}
+	client := res.Val()
+	return NewRes(IBusClient(client))
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP
@@ -172,38 +230,43 @@ func GetModuleWui() IResult[IKernelModule] {
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог
-func NewLogBuf(opts ...log_buf.OptionLogBuf) ILogBuf {
-	log := log_buf.NewLogBuf(opts...)
+func NewLogBuf(opts ...lev1.OptionLogBuf) ILogBuf {
+	log := lev1.NewLogBuf(opts...)
 	return log
 }
 
 // NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную
 func NewSafeBoolReact() ISafeBoolReact {
-	val := safe_bool_react.NewSafeBoolReact()
+	val := lev1.NewSafeBoolReact()
 	return val
 }
 
 // NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную
 func NewSafeInt(val int) ISafeInt {
-	val_ := safe_int.NewSafeInt(val)
+	val_ := lev1.NewSafeInt(val)
 	return val_
 }
 
 // NewInt -- возвращает новую целочисленную переменную
 func NewInt(val int) Int {
-	val_ := kint.NewInt(val)
+	val_ := lev1.NewInt(val)
 	return val_
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст
-func NewLocalCtx(ctx context.Context) ILocalCtx {
-	ctx_ := local_ctx.NewLocalCtx(ctx)
-	return ctx_
+func NewLocalCtx(ctx context.Context) IResult[ILocalCtx] {
+	resCtx := lev1.NewLocalCtx(ctx)
+	if resCtx.IsErr() {
+		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
+		return NewErr[ILocalCtx](err)
+	}
+	ctx_ := resCtx.Val()
+	return NewRes(ILocalCtx(ctx_))
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку
 func NewSafeString() ISafeString {
-	str := safe_string.NewSafeString()
+	str := lev1.NewSafeString()
 	return str
 }
 
@@ -217,22 +280,28 @@ func MakeErr[T any](err error) IResult[T] {
 	return NewErr[T](err)
 }
 
-// MakeSome -- возвращает новый не пустой результат операции
-func MakeSome[T any](some T) IOption[T] {
-	return NewOpt(some)
+// NewOpt -- возвращает новый не пустой результат операции
+func NewOpt[T any](some T) IOption[T] {
+	return lev1.NewOpt(some)
 }
 
-// MakeNone -- возвращает новый пустой результат операции
-func MakeNone[T any]() IOption[T] {
-	return NewNone[T]()
+// NewNone -- возвращает новый пустой результат операции
+func NewNone[T any]() IOption[T] {
+	return lev1.NewNone[T]()
 }
 
-// GetFnHassert -- возвращает ссылку на функцию Hassert
-func GetFnHassert() helpers.FnHassert {
-	return helpers.Hassert
+// FnHassert -- проверяет с жёстким падением условие
+type FnHassert = lev1.FnHassert
+
+// Hassert -- возвращает ссылку на функцию Hassert
+func Hassert() FnHassert {
+	return lev1.Hassert()
 }
 
-// GetFnAssert -- возвращает ссылку на функцию Hassert
-func GetFnAssert() helpers.FnAssert {
-	return helpers.Assert
+// FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
+type FnAssert = lev1.FnAssert
+
+// Assert -- возвращает ссылку на функцию Hassert
+func Assert() FnAssert {
+	return lev1.Assert()
 }

+ 12 - 14
v4/kern_test.go

@@ -5,8 +5,8 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 )
 
 const (
@@ -39,23 +39,21 @@ func TestBuilders(t *testing.T) {
 
 func (sf *tester) newModBad() {
 	sf.t.Log("newModBad")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newModBad(): panic==nil")
-		}
-	}()
-	_ = NewKernelModule("")
+	res := NewKernelModule("")
+	if res.IsOk() {
+		sf.t.Fatalf("newModBad(): res.IsOk()")
+	}
 }
 
 // создание компонентов
 func (sf *tester) new() {
 	sf.t.Log("new")
-	ctx := GetKernelCtx()
+	ctx := GetKernelCtx().Hassert("new()")
 	{
 		if ctx == nil {
 			sf.t.Fatalf("new(): IKernelCtx==nil")
 		}
-		store := GetKernelStoreKv()
+		store := GetKernelStoreKv().Hassert("new()")
 		res := store.Delete("test_builders")
 		if res.IsErr() {
 			sf.t.Fatalf("new(): get empty key, store, err=%v", res.Err())
@@ -144,12 +142,12 @@ func (sf *tester) new() {
 			sf.t.Fatalf("new(): ISafeStr==nil")
 		}
 
-		fnHassert := GetFnHassert()
+		fnHassert := Hassert()
 		if fnHassert == nil {
 			sf.t.Fatalf("new(): Hassert==nil")
 		}
 
-		fnAssert := GetFnAssert()
+		fnAssert := Assert()
 		if fnAssert == nil {
 			sf.t.Fatalf("new(): Assert==nil")
 		}
@@ -157,8 +155,8 @@ func (sf *tester) new() {
 
 	_ = MakeOk("test ok")
 	_ = MakeErr[bool](fmt.Errorf("test err"))
-	_ = MakeSome("test err")
-	_ = MakeNone[int64]()
+	_ = NewOpt("test err")
+	_ = NewNone[int64]()
 
 	valInt := NewInt(28)
 	if val := valInt.Get(); val != 28 {

+ 0 - 20
v4/krn/kbus/kbus_local/client_bus_local/client_bus_local.go

@@ -1,20 +0,0 @@
-// package client_bus_local -- клиент локальной шины
-package client_bus_local
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-)
-
-// ClientBusLocal -- клиент локальной шины
-type ClientBusLocal struct {
-	IKernelBus
-}
-
-// NewClientBusLocal -- клиент локальной шины
-func NewClientBusLocal() IBusClient {
-	sf := &ClientBusLocal{
-		IKernelBus: kbus_local.GetKernelBusLocal(),
-	}
-	return sf
-}

+ 1 - 1
v4/lev0/ktypes/ikernel_server_http.go

@@ -4,7 +4,7 @@ import "github.com/gofiber/fiber/v2"
 
 // IKernelServerHttp -- интерфейс к серверу HTTP в ядре
 type IKernelServerHttp interface {
-	// Run -- запускает сервер в работу (блокирующий вызов; надо для добавления роутов)
+	// Run -- запускает сервер в работу (не блокирующий вызов)
 	Run()
 	// Fiber -- возвращает объект веб-приложения fiber
 	Fiber() *fiber.App

+ 3 - 3
v4/lev0/ktypes/ilocal_ctx.go

@@ -25,7 +25,7 @@ type ICtxValue interface {
 type ILocalCtx interface {
 	IRWMutex
 	// Get -- извлекает значение из контекста
-	Get(key string) IResult[ICtxValue]
+	Get(key string) IOption[ICtxValue]
 	// Del -- удаляет значение из контекста
 	Del(key string)
 	// Set -- добавляет значение в контекст
@@ -36,8 +36,8 @@ type ILocalCtx interface {
 	SortedList() []ICtxValue
 	// Cancel -- отменяет контекст
 	Cancel()
-	// Done -- ожидает отмены контекста
-	Done()
+	// Wait -- ожидает отмены контекста
+	Wait()
 	// Log -- возвращает буфер сообщений
 	Log() ILogBuf
 	// Ctx -- возвращает хранимый контекст

+ 2 - 2
v4/lev0/ktypes/ioption.go

@@ -13,7 +13,7 @@ type IOption[T any] interface {
 	// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции
 	ValOrFn(fn func() T) T
 	// Hassert -- проверяет, что не пустое значение (с паникой)
-	Hassert(msgFormat string, args ...any)
+	Hassert(msgFormat string, args ...any) T
 	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
-	Assert(msgFormat string, args ...any)
+	Assert(msgFormat string, args ...any) T
 }

+ 10 - 5
v4/lev1/ctx_value/ctx_value.go

@@ -2,11 +2,13 @@
 package ctx_value
 
 import (
+	"fmt"
 	"sync"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // CtxValue -- потокобезопасное значение локального контекста
@@ -20,15 +22,18 @@ type CtxValue struct {
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста
-func NewCtxValue(key string, val any, comment string) ICtxValue {
-	Hassert(key != "", "NewCtxValue(): key is empty")
+func NewCtxValue(key string, val any, comment string) IResult[*CtxValue] {
+	if key == "" {
+		err := fmt.Errorf("NewCtxValue(): key is empty")
+		return NewErr[*CtxValue](err)
+	}
 	sf := &CtxValue{
 		key:      key,
-		createAt: TimeNowStr(),
+		createAt: helpers.TimeNowStr(),
 		Val_:     val,
 		Comment_: comment,
 	}
-	return sf
+	return NewRes(sf)
 }
 
 // Key -- возвращает ключ значения

+ 1 - 1
v4/lev1/ctx_value/ctx_value_test.go

@@ -23,7 +23,7 @@ func TestCtxValue(t *testing.T) {
 // Создаёт значение локального контекста
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.val = NewCtxValue("test_key", 5, "test_value")
+	sf.val = NewCtxValue("test_key", 5, "test_value").Hassert("new()")
 	if sf.val == nil {
 		sf.t.Fatalf("new(): val==nil")
 	}

+ 0 - 0
v4/krn/kbus/kbus_msg/msg_pub/msg_pub.go → v4/lev1/kbus_msg/msg_pub/msg_pub.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_pub/msg_pub_test.go → v4/lev1/kbus_msg/msg_pub/msg_pub_test.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_serve/msg_serve.go → v4/lev1/kbus_msg/msg_serve/msg_serve.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_serve/msg_serve_test.go → v4/lev1/kbus_msg/msg_serve/msg_serve_test.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_sub/msg_sub.go → v4/lev1/kbus_msg/msg_sub/msg_sub.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_sub/msg_sub_test.go → v4/lev1/kbus_msg/msg_sub/msg_sub_test.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_unsub/msg_unsub.go → v4/lev1/kbus_msg/msg_unsub/msg_unsub.go


+ 0 - 0
v4/krn/kbus/kbus_msg/msg_unsub/msg_unsub_test.go → v4/lev1/kbus_msg/msg_unsub/msg_unsub_test.go


+ 3 - 2
v4/krn/kint/kint.go → v4/lev1/kint/kint.go

@@ -9,7 +9,6 @@ import (
 	"strconv"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
@@ -75,7 +74,9 @@ func (sf *KernInt) FromByte(binData []byte) IResult[int] {
 	var signed int64
 	buf := bytes.NewReader(binData)
 	err := binary.Read(buf, binary.BigEndian, &signed)
-	Hassert(err == nil, "KernInt.FromByte(): in read []byte, err=\n\t%w", err)
+	if err != nil {
+		return NewErr[int](fmt.Errorf("KInt.FromByte(): in read []byte, err=\n\t%w", err))
+	}
 	sf.val = int(signed)
 	return NewRes(sf.val)
 }

+ 3 - 3
v4/krn/kint/kint_test.go → v4/lev1/kint/kint_test.go

@@ -60,13 +60,13 @@ func (sf *tester) new() {
 	resInt.Hassert("FromByte")
 
 	binData = binData[:2]
-	resInt = val.FromByte(binData)
-	if !resStr.IsErr() {
+	res := val.FromByte(binData)
+	if res.IsOk() {
 		sf.t.Fatalf("new(): err==nil")
 	}
 
 	resInt = val.FromByte([]byte("travolta"))
-	if !resStr.IsErr() {
+	if resInt.IsErr() {
 		sf.t.Fatalf("new(): err==nil")
 	}
 

+ 143 - 0
v4/lev1/lev1.go

@@ -0,0 +1,143 @@
+// package lev1 -- сборка уровня 1
+package lev1
+
+import (
+	"context"
+	"fmt"
+
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kint"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/option"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool_react"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_int"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_string"
+)
+
+type IMockEnv = mock_env.IMockEnv
+
+// MakeEnv -- возвращает новое мок-окружение
+func MakeEnv() IMockEnv {
+	sf := mock_env.MakeEnv()
+	return sf
+}
+
+// OptionLogBuf -- опция для конфигурирования ILogBuf
+type OptionLogBuf = log_buf.OptionLogBuf
+
+// OptPrefix -- устанавливает префикс в сообщениях
+func OptPrefix(prefix string) OptionLogBuf {
+	return log_buf.OptPrefix(prefix)
+}
+
+// OptIsTerm -- устанавливает признак вывода в терминал
+func OptIsTerm(isTerm bool) OptionLogBuf {
+	return log_buf.OptIsTerm(isTerm)
+}
+
+// NewLogBuf -- возвращает новый буферизованный лог
+func NewLogBuf(opts ...log_buf.OptionLogBuf) ILogBuf {
+	log := log_buf.NewLogBuf(opts...)
+	return log
+}
+
+// NewSafeString -- возвращает новую потокобезопасную строку
+func NewSafeString() ISafeString {
+	str := safe_string.NewSafeString()
+	return str
+}
+
+// NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки
+func NewSafeIntFromStr(strVal string) IResult[ISafeInt] {
+	return safe_int.NewSafeIntFromStr(strVal)
+}
+
+// NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения
+func NewSafeIntGetenv(env string) IResult[ISafeInt] {
+	return safe_int.NewSafeIntGetenv(env)
+}
+
+// NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную
+func NewSafeInt(val int) ISafeInt {
+	val_ := safe_int.NewSafeInt(val)
+	return val_
+}
+
+// NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную
+func NewSafeBoolReact() ISafeBoolReact {
+	val := safe_bool_react.NewSafeBoolReact()
+	return val
+}
+
+// NewSafeBool -- возвращает новый потокобезопасный булевый признак
+func NewSafeBool() ISafeBool {
+	sb := safe_bool.NewSafeBool()
+	return sb
+}
+
+// NewRes -- возвращает успешный Result с значением
+func NewRes[T any](res T) IResult[T] {
+	return result.NewRes(res)
+}
+
+// NewErr -- возвращает Result с ошибкой
+func NewErr[T any](err error) IResult[T] {
+	return result.NewErr[T](err)
+}
+
+// WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой
+func WrapErr[T any](res IResult[T], err error) IResult[T] {
+	return result.WrapErr(res, err)
+}
+
+// NewOpt -- возвращает новый не пустой результат операции
+func NewOpt[T any](some T) IOption[T] {
+	return option.NewOpt(some)
+}
+
+// NewNone -- возвращает новый пустой результат операции
+func NewNone[T any]() IOption[T] {
+	return option.NewNone[T]()
+}
+
+// FnHassert -- проверяет с жёстким падением условие
+type FnHassert = helpers.FnHassert
+
+// Hassert -- возвращает ссылку на функцию Hassert
+func Hassert() FnHassert {
+	return helpers.Hassert
+}
+
+// FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert)
+type FnAssert = helpers.FnAssert
+
+// Assert -- возвращает ссылку на функцию Assert
+func Assert() FnAssert {
+	return helpers.Assert
+}
+
+// SleepMs -- спит миллисекунду
+func SleepMs() {
+	helpers.SleepMs()
+}
+
+// NewInt -- возвращает новую целочисленную переменную
+func NewInt(val int) Int {
+	val_ := kint.NewInt(val)
+	return val_
+}
+
+// NewLocalCtx -- возвращает новый локальный контекст
+func NewLocalCtx(ctx context.Context) IResult[ILocalCtx] {
+	resCtx := local_ctx.NewLocalCtx(ctx)
+	if resCtx.IsErr() {
+		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
+		return NewErr[ILocalCtx](err)
+	}
+	return NewRes(ILocalCtx(resCtx.Val()))
+}

+ 26 - 14
v4/lev1/local_ctx/local_ctx.go

@@ -6,11 +6,14 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/ctx_value"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+
+	// . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/option"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
@@ -26,8 +29,11 @@ type LocalCtx struct {
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст
-func NewLocalCtx(ctx context.Context) ILocalCtx {
-	Hassert(ctx != nil, "NewLocalCtx(): ctx==nil")
+func NewLocalCtx(ctx context.Context) IResult[*LocalCtx] {
+	if ctx == nil {
+		err := fmt.Errorf("NewLocalCtx(): ctx==nil")
+		return NewErr[*LocalCtx](err)
+	}
 	_ctx, fnCancel := context.WithCancel(ctx)
 	sf := &LocalCtx{
 		ctx:      _ctx,
@@ -36,7 +42,8 @@ func NewLocalCtx(ctx context.Context) ILocalCtx {
 		lstSort:  lst_sort.NewLstSort(),
 		log:      log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("LocalCtx")),
 	}
-	return sf
+	_ = ILocalCtx(sf)
+	return NewRes(sf)
 }
 
 // Ctx -- возвращает отменяемый контекст
@@ -62,17 +69,18 @@ func (sf *LocalCtx) Log() ILogBuf {
 }
 
 // Get -- возвращает хранимое значение
-func (sf *LocalCtx) Get(key string) IResult[ICtxValue] {
+func (sf *LocalCtx) Get(key string) IOption[ICtxValue] {
 	sf.RLock()
 	defer sf.RUnlock()
-	Hassert(key != "", "localCtx.Get(): key is empty")
+	if key == "" {
+		return NewNone[ICtxValue]()
+	}
 	sf.log.Debug("Get(): key='%v'", key)
 	val, isOk := sf.dictVal[key]
 	if !isOk {
-		err := fmt.Errorf("LocalCtx.Get(): key='%v' not found", key)
-		return NewErr[ICtxValue](err)
+		return NewNone[ICtxValue]()
 	}
-	return NewRes(val)
+	return NewOpt(val)
 }
 
 // Del -- удаляет значение из контекста
@@ -94,19 +102,23 @@ func (sf *LocalCtx) Set(key string, val any, comment string) IResult[bool] {
 	if isOk {
 		val0 := _val.(*ctx_value.CtxValue)
 		val0.Lock()
-		val0.UpdateAt_ = TimeNowStr()
+		val0.UpdateAt_ = helpers.TimeNowStr()
 		val0.Val_ = val
 		val0.Unlock()
 		return NewRes(true)
 	}
-	_val = ctx_value.NewCtxValue(key, val, comment)
+	resVal := ctx_value.NewCtxValue(key, val, comment)
+	if resVal.IsErr() {
+		return NewErr[bool](resVal.Err())
+	}
+	_val = resVal.Val()
 	sf.dictVal[key] = _val
 	sf.lstSort.Add(_val)
 	return NewRes(true)
 }
 
-// Done -- блокирующий вызов ожидания отмены контекста
-func (sf *LocalCtx) Done() {
+// Wait -- блокирующий вызов ожидания отмены контекста
+func (sf *LocalCtx) Wait() {
 	<-sf.ctx.Done()
 }
 

+ 5 - 5
v4/lev1/local_ctx/local_ctx_test.go

@@ -26,7 +26,7 @@ func (sf *tester) done() {
 	sf.t.Log("done")
 	_ = sf.ctx.Size()
 	go sf.ctx.Cancel()
-	sf.ctx.Done()
+	sf.ctx.Wait()
 }
 
 // Удаляет несуществующий ключ из локального контекста
@@ -39,8 +39,8 @@ func (sf *tester) del() {
 // Возвращает хранимое значение
 func (sf *tester) get() {
 	sf.t.Log("get")
-	res := sf.ctx.Get("count")
-	ctxVal := res.Hassert("get()")
+	optRes := sf.ctx.Get("count")
+	ctxVal := optRes.Hassert("get()")
 	count := ctxVal.Val().(int)
 	if count == 15 {
 		return
@@ -64,7 +64,7 @@ func (sf *tester) new() {
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
 	ctx := context.Background()
-	sf.ctx = NewLocalCtx(ctx).(*LocalCtx)
+	sf.ctx = NewLocalCtx(ctx).Hassert("newGood1()")
 	_ = sf.ctx.Log()
 	if lst := sf.ctx.SortedList(); lst == nil {
 		sf.t.Fatalf("newGood1(): lst==nil")
@@ -83,5 +83,5 @@ func (sf *tester) newBad1() {
 		}
 	}()
 	var ctx context.Context
-	sf.ctx = NewLocalCtx(ctx).(*LocalCtx)
+	sf.ctx = NewLocalCtx(ctx).Hassert("newBad1()")
 }

+ 18 - 18
v4/kc/log_buf/log_buf.go → v4/lev1/log_buf/log_buf.go

@@ -5,14 +5,14 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf/log_msg"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_msg"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
-// logBuf -- потокобезопасный буфер лога
-type logBuf struct {
+// LogBuf -- потокобезопасный буфер лога
+type LogBuf struct {
 	sync.RWMutex
 	isTerm ISafeBool // Признак вывода в стандартный поток
 	prefix string    // Префикс для сообщений
@@ -21,11 +21,11 @@ type logBuf struct {
 }
 
 // OptionLogBuf -- опция для конфигурирования ILogBuf
-type OptionLogBuf func(logBuf *logBuf)
+type OptionLogBuf func(logBuf *LogBuf)
 
 // OptIsTerm -- устанавливает признак вывода в терминал
 func OptIsTerm(isTerm bool) OptionLogBuf {
-	return func(sf *logBuf) {
+	return func(sf *LogBuf) {
 		if isTerm {
 			sf.IsTerm().Set()
 		}
@@ -34,14 +34,14 @@ func OptIsTerm(isTerm bool) OptionLogBuf {
 
 // OptPrefix -- устанавливает префикс в сообщениях
 func OptPrefix(prefix string) OptionLogBuf {
-	return func(sf *logBuf) {
+	return func(sf *LogBuf) {
 		sf.prefix = prefix + "."
 	}
 }
 
 // NewLogBuf -- возвращает новый потокобезопасный буфер лога
 func NewLogBuf(opts ...OptionLogBuf) ILogBuf {
-	sf := &logBuf{
+	sf := &LogBuf{
 		isTerm: safe_bool.NewSafeBool(),
 		lst:    []ILogMsg{},
 		lstErr: []ILogMsg{},
@@ -54,12 +54,12 @@ func NewLogBuf(opts ...OptionLogBuf) ILogBuf {
 }
 
 // IsTerm -- возвращает признак логирования
-func (sf *logBuf) IsTerm() ISafeBool {
+func (sf *LogBuf) IsTerm() ISafeBool {
 	return sf.isTerm
 }
 
 // GetErr -- возвращает сообщение ошибки по номеру
-func (sf *logBuf) GetErr(num int) ILogMsg {
+func (sf *LogBuf) GetErr(num int) ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	if len(sf.lstErr) == 0 {
@@ -75,7 +75,7 @@ func (sf *logBuf) GetErr(num int) ILogMsg {
 }
 
 // Get -- возвращает сообщение по номеру
-func (sf *logBuf) Get(num int) ILogMsg {
+func (sf *LogBuf) Get(num int) ILogMsg {
 	sf.RLock()
 	defer sf.RUnlock()
 	if len(sf.lst) == 0 {
@@ -96,7 +96,7 @@ type tMsg struct {
 }
 
 // Debug -- сообщение отладки
-func (sf *logBuf) Debug(fMsg string, args ...any) {
+func (sf *LogBuf) Debug(fMsg string, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -111,7 +111,7 @@ func (sf *logBuf) Debug(fMsg string, args ...any) {
 }
 
 // Info -- информационные сообщения
-func (sf *logBuf) Info(fMsg string, args ...any) {
+func (sf *LogBuf) Info(fMsg string, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -126,7 +126,7 @@ func (sf *logBuf) Info(fMsg string, args ...any) {
 }
 
 // Warn -- предупреждающие сообщения
-func (sf *logBuf) Warn(fMsg string, args ...any) {
+func (sf *LogBuf) Warn(fMsg string, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -141,7 +141,7 @@ func (sf *logBuf) Warn(fMsg string, args ...any) {
 }
 
 // Err -- сообщения об ошибках
-func (sf *logBuf) Err(fMsg string, args ...any) {
+func (sf *LogBuf) Err(fMsg string, args ...any) {
 	sf.Lock()
 	defer sf.Unlock()
 	msg := tMsg{
@@ -158,28 +158,28 @@ func (sf *logBuf) Err(fMsg string, args ...any) {
 }
 
 // Size -- возвращает размер буфера
-func (sf *logBuf) Size() int {
+func (sf *LogBuf) Size() int {
 	sf.RLock()
 	defer sf.RUnlock()
 	return len(sf.lst)
 }
 
 // Проверяет длину общую лога
-func (sf *logBuf) checkLen() {
+func (sf *LogBuf) checkLen() {
 	for len(sf.lst) > 100 {
 		sf.lst = sf.lst[1:]
 	}
 }
 
 // Проверяет длину лога ошибок
-func (sf *logBuf) checkLenErr() {
+func (sf *LogBuf) checkLenErr() {
 	for len(sf.lstErr) > 100 {
 		sf.lstErr = sf.lstErr[1:]
 	}
 }
 
 // Печатает сообщение в терминал, если разрешено
-func (sf *logBuf) printTerm(msg ILogMsg) {
+func (sf *LogBuf) printTerm(msg ILogMsg) {
 	if !sf.isTerm.Get() {
 		return
 	}

+ 0 - 0
v4/kc/log_buf/log_buf_test.go → v4/lev1/log_buf/log_buf_test.go


+ 30 - 0
v4/lev1/log_dict_topic/log_dict_topic.go

@@ -0,0 +1,30 @@
+// package log_dict_topic -- хранитель топиков для логирования
+package log_dict_topic
+
+import (
+	"fmt"
+	"sync"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+)
+
+type LogDictTopic struct {
+	sync.RWMutex
+	dict   map[kalias.ATopic]bool
+	client IBusClient
+}
+
+// NewLogDictTopic -- возвращает новый словарь топиков для логирования
+func NewLogDictTopic(clientBus IBusClient) IResult[*LogDictTopic] {
+	if clientBus == nil {
+		err := fmt.Errorf("NewLogDictTopic(): clientBus == nil")
+		return NewErr[*LogDictTopic](err)
+	}
+	sf := &LogDictTopic{
+		dict:   map[kalias.ATopic]bool{},
+		client: clientBus,
+	}
+	return NewRes(sf)
+}

+ 4 - 7
v4/kc/log_buf/log_bus/log_bus_test.go → v4/lev1/log_dict_topic/log_dict_topic_test.go

@@ -1,4 +1,4 @@
-package log_bus
+package log_dict_topic
 
 import (
 	"testing"
@@ -18,11 +18,8 @@ func TestLogDictTopic(t *testing.T) {
 // Создаёт новый словарь топиков для логирования
 func (sf *tester) new() {
 	sf.t.Log("new")
-	log := NewLogDictTopic(nil)
-	if log == nil {
-		sf.t.Fatalf("new(): log!=nil")
-	}
-	if log.client != nil {
-		sf.t.Fatalf("mew(): log.client!=nil")
+	res := NewLogDictTopic(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("mew(): res.IsOk()")
 	}
 }

+ 0 - 0
v4/kc/log_buf/log_msg/log_msg.go → v4/lev1/log_msg/log_msg.go


+ 0 - 0
v4/kc/log_buf/log_msg/log_msg_test.go → v4/lev1/log_msg/log_msg_test.go


+ 6 - 6
v4/lev1/lst_sort/lst_sort_test.go

@@ -25,7 +25,7 @@ func TestLstSort(t *testing.T) {
 // Нет такого элемента
 func (sf *tester) del3() {
 	sf.t.Log("del3")
-	val5 := ctx_value.NewCtxValue("val5", 5, "test 5")
+	val5 := ctx_value.NewCtxValue("val5", 5, "test 5").Hassert("del3()")
 	sf.lst.Del(val5)
 	sf.lst.Del(nil)
 }
@@ -72,11 +72,11 @@ func (sf *tester) del() {
 // Добавление элементов в список
 func (sf *tester) add() {
 	sf.t.Log("add")
-	val0 := ctx_value.NewCtxValue("val0", 0, "test 0")
-	val1 := ctx_value.NewCtxValue("val1", 1, "test 1")
-	val2 := ctx_value.NewCtxValue("val2", 2, "test 2")
-	val3 := ctx_value.NewCtxValue("val3", 3, "test 3")
-	val4 := ctx_value.NewCtxValue("val4", 4, "test 4")
+	val0 := ctx_value.NewCtxValue("val0", 0, "test 0").Hassert("add()")
+	val1 := ctx_value.NewCtxValue("val1", 1, "test 1").Hassert("add()")
+	val2 := ctx_value.NewCtxValue("val2", 2, "test 2").Hassert("add()")
+	val3 := ctx_value.NewCtxValue("val3", 3, "test 3").Hassert("add()")
+	val4 := ctx_value.NewCtxValue("val4", 4, "test 4").Hassert("add()")
 	sf.lst.Add(val1)
 	sf.lst.Add(val4)
 	sf.lst.Add(val0)

+ 5 - 0
v4/mock/mock_env/mock_env.go → v4/lev1/mock_env/mock_env.go

@@ -8,6 +8,11 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
+type IMockEnv interface {
+	// Pwd -- возвращает текущий рабочий каталог процесса
+	Pwd() string
+}
+
 // MockEnv -- объект мок-окружения
 type MockEnv struct {
 	dictEnv  map[string]string // Словарь переменных окружения

+ 0 - 0
v4/mock/mock_env/mock_env_test.go → v4/lev1/mock_env/mock_env_test.go


+ 4 - 2
v4/lev1/option/option.go

@@ -66,11 +66,13 @@ func (sf *Option[T]) ValOrFn(fn func() T) T {
 }
 
 // Hassert -- проверяет, что не пустое значение (с паникой)
-func (sf *Option[T]) Hassert(msgFormat string, args ...any) {
+func (sf *Option[T]) Hassert(msgFormat string, args ...any) T {
 	Hassert(sf.val != nil, msgFormat, args...)
+	return *sf.val
 }
 
 // Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
-func (sf *Option[T]) Assert(msgFormat string, args ...any) {
+func (sf *Option[T]) Assert(msgFormat string, args ...any) T {
 	Assert(sf.val != nil, msgFormat, args...)
+	return *sf.val
 }

+ 0 - 0
v4/kc/safe_bool_react/safe_bool_react.go → v4/lev1/safe_bool_react/safe_bool_react.go


+ 0 - 0
v4/kc/safe_bool_react/safe_bool_react_test.go → v4/lev1/safe_bool_react/safe_bool_react_test.go


+ 1 - 1
v4/kc/safe_int/safe_int.go → v4/lev1/safe_int/safe_int.go

@@ -5,8 +5,8 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kint"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kint"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 

+ 0 - 0
v4/kc/safe_int/safe_int_test.go → v4/lev1/safe_int/safe_int_test.go


+ 0 - 0
v4/kc/safe_string/safe_string.go → v4/lev1/safe_string/safe_string.go


+ 0 - 0
v4/kc/safe_string/safe_string_test.go → v4/lev1/safe_string/safe_string_test.go


+ 25 - 9
v4/krn/kbus/dict_sub_hook/dict_sub_hook.go → v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go

@@ -5,11 +5,10 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // dictSubHook -- словарь потребителей топика по подписке
@@ -20,19 +19,27 @@ type dictSubHook struct {
 }
 
 // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика
-func NewDictSubHook() IDictSubHook {
+func NewDictSubHook() IResult[IDictSubHook] {
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("dictSubHook.NewDictSubHook(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[IDictSubHook](err)
+	}
 	sf := &dictSubHook{
-		ctx:  kctx.GetKernelCtx(),
+		ctx:  resKernCtx.Val(),
 		dict: map[AHandlerName]bool{},
 	}
-	return sf
+	return NewRes(IDictSubHook(sf))
 }
 
 // Unsubscribe -- удаляет из словаря подписки обработчик
 func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	Hassert(handler != nil, "dictSubHook.Unsubscribe(): handler==nil")
+	if handler == nil {
+		sf.ctx.Log().Err("dictSubHook.Unsubscribe(): handler==nil")
+		return
+	}
 	handlerName := handler.Name()
 	delete(sf.dict, handlerName)
 	sf.ctx.Del(string(handlerName))
@@ -48,7 +55,11 @@ func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	}
 	handlerName := handler.Name()
 	sf.dict[handlerName] = true
-	sf.ctx.Set(string(handlerName), handler, "subscribe handler")
+	res := sf.ctx.Set(string(handlerName), handler, "subscribe handler")
+	if res.IsErr() {
+		err := fmt.Errorf("dictSubHook.Subscribe(): in set subscribe handler in kernel ctx, err=\n\t%w", res.Err())
+		return NewErr[bool](err)
+	}
 	return NewRes(true)
 }
 
@@ -57,7 +68,12 @@ func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	for handlerName := range sf.dict {
-		handler := sf.ctx.Get(string(handlerName)).Val().(IBusHandlerSubscribe)
+		optHand := sf.ctx.Get(string(handlerName))
+		if optHand.IsNone() {
+			sf.ctx.Del(string(handlerName))
+			continue
+		}
+		handler := optHand.Val().Val().(IBusHandlerSubscribe)
 		go handler.FnBack(binMsg)
 	}
 }

+ 10 - 12
v4/krn/kbus/dict_sub_hook/dict_sub_hook_test.go → v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -3,7 +3,7 @@ package dict_sub_hook
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -37,7 +37,7 @@ func (sf *tester) read() {
 	sf.dict.Read([]byte("test_msg"))
 }
 
-// Добавляет хуки ыв словарь
+// Добавляет хуки в словарь
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.addBad1()
@@ -46,9 +46,9 @@ func (sf *tester) add() {
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	sf.dict.Subscribe(sf.handSub)
-	sf.dict.Subscribe(sf.handSub)
-	sf.dict.Subscribe(sf.handSub2)
+	sf.dict.Subscribe(sf.handSub).Hassert("addGood1()")
+	sf.dict.Subscribe(sf.handSub).Hassert("addGood1()")
+	sf.dict.Subscribe(sf.handSub2).Hassert("addGood1()")
 	if _len := len(sf.dict.dict); _len != 2 {
 		sf.t.Fatalf("new(): len(%v)!=2", _len)
 	}
@@ -57,18 +57,16 @@ func (sf *tester) addGood1() {
 // нет веб-хука для добавления
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("addBad1(): panic==nil")
-		}
-	}()
-	sf.dict.Subscribe(nil)
+	res := sf.dict.Subscribe(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("addBad1(): res.IsOk()==true")
+	}
 }
 
 // Создание словаря
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.dict = NewDictSubHook().(*dictSubHook)
+	sf.dict = NewDictSubHook().Hassert("new()").(*dictSubHook)
 	if sf.dict == nil {
 		sf.t.Fatalf("new(): dict==nil")
 	}

+ 16 - 9
v4/krn/kbus/dict_topic_serve/dict_topic_serve.go → v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go

@@ -7,11 +7,10 @@ import (
 	"sync"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // dictServe -- потокобезопасный словарь обработчиков запросов
@@ -19,17 +18,22 @@ import (
 // Допускается только один обработчик запросов на один топик
 type dictServe struct {
 	sync.RWMutex
-	ctx       IKernelCtx
+	kCtx      IKernelCtx
 	dictServe map[ATopic]IBusHandlerServe
 }
 
 // NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов
-func NewDictServe() IDictTopicServe {
+func NewDictServe() IResult[*dictServe] {
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("NewDictServe(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[*dictServe](err)
+	}
 	sf := &dictServe{
-		ctx:       kctx.GetKernelCtx(),
+		kCtx:      resKernCtx.Val(),
 		dictServe: map[ATopic]IBusHandlerServe{},
 	}
-	return sf
+	return NewRes(sf)
 }
 
 // Register -- регистрирует обработчик запросов
@@ -54,7 +58,10 @@ func (sf *dictServe) Register(handler IBusHandlerServe) IResult[bool] {
 func (sf *dictServe) Unregister(handler IBusHandlerServe) {
 	sf.Lock()
 	defer sf.Unlock()
-	Hassert(handler != nil, "dictServe.Unregister(): IBusHandlerSubscribe==nil")
+	if handler == nil {
+		sf.kCtx.Log().Err("dictServe.Unregister(): IBusHandlerSubscribe==nil")
+		return
+	}
 	delete(sf.dictServe, handler.Topic())
 }
 
@@ -70,7 +77,7 @@ func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	var (
 		chRes = make(chan IResult[[]byte], 2)
 	)
-	ctx, fnCancel := context.WithTimeout(sf.ctx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
+	ctx, fnCancel := context.WithTimeout(sf.kCtx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
 	defer fnCancel()
 	fnCall := func() {
 		defer close(chRes)

+ 14 - 28
v4/krn/kbus/dict_topic_serve/dict_topic_serve_test.go → v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -3,8 +3,8 @@ package dict_topic_serve
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
 )
 
 type tester struct {
@@ -33,10 +33,10 @@ func TestDictSub(t *testing.T) {
 // Работа ядра завершена
 func (sf *tester) callBad3() {
 	sf.t.Log("callBad3")
-	ctx := kctx.GetKernelCtx()
+	ctx := kctx.GetKernelCtx().Hassert("callBad3()")
 	ctx.Cancel()
 	ctx.Wg().Wait()
-	sf.dict.Register(sf.hand)
+	sf.dict.Register(sf.hand).Hassert("callBad3()")
 	res := sf.dict.SendRequest(sf.hand.Topic(), []byte("test"))
 	if res.IsOk() {
 		sf.t.Fatalf("callBad3(): err==nil")
@@ -57,11 +57,6 @@ func (sf *tester) delGood2() {
 // Удаляет, чего нет
 func (sf *tester) delBad1() {
 	sf.t.Log("delBad1()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("delBad1(): panic==nil")
-		}
-	}()
 	sf.dict.Unregister(nil)
 }
 
@@ -91,34 +86,25 @@ func (sf *tester) sendBad2() {
 // повторное добавление обработчика
 func (sf *tester) addBad2() {
 	sf.t.Log("addBad2")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("addGood1(): panic==nil")
-		}
-	}()
-	sf.dict.Register(sf.hand)
+	res := sf.dict.Register(sf.hand)
+	if res.IsOk() {
+		sf.t.Fatalf("addBad2(): err==nil")
+	}
 }
 
 // Правильное добавление обработчика подписки
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1()")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("addGood1(): panic=%v", _panic)
-		}
-	}()
-	sf.dict.Register(sf.hand)
+	sf.dict.Register(sf.hand).Hassert("addGood1()")
 }
 
 // Вместо обработчика пустышка
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("addBad1(): panic==nil")
-		}
-	}()
-	sf.dict.Register(nil)
+	res := sf.dict.Register(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("addBad1(): err==nil")
+	}
 }
 
 // Вызов несуществующего топика
@@ -143,7 +129,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictServe().(*dictServe)
+	sf.dict = NewDictServe().Hassert("newGood1()")
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictServe==nil")
 	}

+ 23 - 10
v4/krn/kbus/dict_topic_sub/dict_topic_sub.go → v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go

@@ -5,12 +5,11 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/dict_sub_hook"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus/dict_sub_hook"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 type tReadReq struct {
@@ -21,24 +20,33 @@ type tReadReq struct {
 // dictTopicSub -- потокобезопасный словарь подписчиков
 type dictTopicSub struct {
 	sync.RWMutex
-	ctx           IKernelCtx
+	kCtx          IKernelCtx
 	dictTopicHook map[ATopic]IDictSubHook
 }
 
 // NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков
-func NewDictTopicSub() IDictTopicSub {
+func NewDictTopicSub() IResult[*dictTopicSub] {
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("NewDictTopicSub(): kCtx==nil")
+		return NewErr[*dictTopicSub](err)
+	}
+	kCtx := resCtx.Val()
 	sf := &dictTopicSub{
-		ctx:           kctx.GetKernelCtx(),
+		kCtx:          kCtx,
 		dictTopicHook: map[ATopic]IDictSubHook{},
 	}
-	return sf
+	return NewRes(sf)
 }
 
 // Read -- вызывает обработчики при поступлении события
 func (sf *dictTopicSub) Read(topic ATopic, binMsg []byte) {
 	sf.RLock()
 	defer sf.RUnlock()
-	Hassert(topic != "", "dictTopicSub.Read(): topic is empty")
+	if topic == "" {
+		sf.kCtx.Log().Err("dictTopicSub.Read(): topic is empty")
+		return
+	}
 	msg := &tReadReq{
 		topic:  topic,
 		binMsg: binMsg,
@@ -65,7 +73,12 @@ func (sf *dictTopicSub) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	}
 	dictSubHook := sf.dictTopicHook[topic]
 	if dictSubHook == nil {
-		dictSubHook = dict_sub_hook.NewDictSubHook()
+		resNewDictTopicSub := dict_sub_hook.NewDictSubHook()
+		if resNewDictTopicSub.IsErr() {
+			err := fmt.Errorf("dictTopicSub.Subscribe(): NewDictSubHook(), err=\n\t%w", resNewDictTopicSub.Err())
+			return NewErr[bool](err)
+		}
+		dictSubHook = resNewDictTopicSub.Val()
 		sf.dictTopicHook[topic] = dictSubHook
 	}
 	res := dictSubHook.Subscribe(handler)

+ 3 - 8
v4/krn/kbus/dict_topic_sub/dict_topic_sub_test.go → v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go

@@ -3,8 +3,8 @@ package dict_topic_sub
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -98,11 +98,6 @@ func (sf *tester) addBad1() {
 // Нет топика
 func (sf *tester) callBad2() {
 	sf.t.Log("callBad2")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("callBad2(): panic==nil")
-		}
-	}()
 	sf.dict.Read("", []byte("test_msg"))
 }
 
@@ -130,7 +125,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictTopicSub().(*dictTopicSub)
+	sf.dict = NewDictTopicSub().Hassert("newGood1()")
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictSub==nil")
 	}

+ 48 - 20
v4/krn/kbus/kbus_base/kbus_base.go → v4/lev2/kbus_base/kbus_base.go

@@ -5,15 +5,12 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/dict_topic_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/dict_topic_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus/dict_topic_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus/dict_topic_sub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 const (
@@ -36,19 +33,39 @@ var (
 )
 
 // GetKernelBusBase -- возвращает базовую шину сообщений
-func GetKernelBusBase() *KBusBase {
+func GetKernelBusBase() IResult[*KBusBase] {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return Bus_
+		return NewRes(Bus_)
+	}
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetKernelBusBase(): in get from kernCtx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[*KBusBase](err)
+	}
+	kCtx := resKernCtx.Val()
+	resLocCtx := NewLocalCtx(kCtx.Ctx())
+	if resLocCtx.IsErr() {
+		err := fmt.Errorf("GetKernelBusBase(): in get from localCtx, err=\n\t%w", resLocCtx.Err())
+		return NewErr[*KBusBase](err)
+	}
+	resDictServe := dict_topic_serve.NewDictServe()
+	if resDictServe.IsErr() {
+		err := fmt.Errorf("GetKernelBusBase(): in get from dictServe, err=\n\t%w", resDictServe.Err())
+		return NewErr[*KBusBase](err)
+	}
+	resDictTopicSu := dict_topic_sub.NewDictTopicSub()
+	if resDictTopicSu.IsErr() {
+		err := fmt.Errorf("GetKernelBusBase(): in get from dictTopicSu, err=\n\t%w", resDictTopicSu.Err())
+		return NewErr[*KBusBase](err)
 	}
-	ctx := kctx.GetKernelCtx()
 	Bus_ = &KBusBase{
-		Ctx_:      ctx,
-		IsWork_:   safe_bool.NewSafeBool(),
-		dictSub:   dict_topic_sub.NewDictTopicSub(),
-		dictServe: dict_topic_serve.NewDictServe(),
-		ctx:       local_ctx.NewLocalCtx(ctx.Ctx()),
+		Ctx_:      resKernCtx.Val(),
+		IsWork_:   NewSafeBool(),
+		dictSub:   resDictTopicSu.Val(),
+		dictServe: IDictTopicServe(resDictServe.Val()),
+		ctx:       resLocCtx.Val(),
 	}
 	Bus_.log = Bus_.ctx.Log()
 	go Bus_.close()
@@ -56,9 +73,13 @@ func GetKernelBusBase() *KBusBase {
 	Bus_.IsWork_.Set()
 	res := Bus_.Ctx_.Wg().Add(strBusBaseStream)
 	res.Hassert("GetKernelBusBase(): in add name stream(%v)", strBusBaseStream)
-	ctx.Set("kernBusBase", Bus_, "base of data bus")
+	resSet := Bus_.Ctx_.Set("kernBusBase", Bus_, "base of data bus")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetKernelBusBase(): in set kernel bus base to kernel ctx, err=\n\t%w", resSet.Err())
+		return NewErr[*KBusBase](err)
+	}
 	_ = IKernelBus(Bus_)
-	return Bus_
+	return NewRes(Bus_)
 }
 
 // Log -- возвращает лог шины
@@ -87,7 +108,12 @@ func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 		sf.log.Err(err.Error())
 		return NewErr[bool](err)
 	}
-	sf.dictSub.Subscribe(handler)
+	res := sf.dictSub.Subscribe(handler)
+	if res.IsErr() {
+		err := fmt.Errorf("KBusBase.Subscribe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
+		sf.log.Err(err.Error())
+		return NewErr[bool](err)
+	}
 	return NewRes(true)
 }
 
@@ -110,7 +136,9 @@ func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 
 // RegisterServe -- регистрирует обработчики входящих запросов
 func (sf *KBusBase) RegisterServe(handler IBusHandlerServe) IResult[bool] {
-	Hassert(handler != nil, "KBusBase.RegisterServe(): IBusHandlerSubscribe==nil")
+	if handler == nil {
+		return NewErr[bool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
+	}
 	sf.log.Debug("KBusBase.RegisterServe(): handler='%v'", handler.Name())
 	res := sf.dictServe.Register(handler)
 	if res.IsErr() {
@@ -141,7 +169,7 @@ func (sf *KBusBase) IsWork() bool {
 
 // Ожидает закрытия шины в отдельном потоке
 func (sf *KBusBase) close() {
-	sf.Ctx_.Done()
+	sf.Ctx_.Wait()
 	sf.Ctx_.Lock()
 	defer sf.Ctx_.Unlock()
 	if !sf.IsWork_.Get() {

+ 11 - 21
v4/krn/kbus/kbus_base/kbus_base_test.go → v4/lev2/kbus_base/kbus_base_test.go

@@ -3,10 +3,10 @@ package kbus_base
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -70,23 +70,16 @@ func (sf *tester) reqGood1() {
 
 func (sf *tester) servGood1() {
 	sf.t.Log("servGood1")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("servGood1(): panic=%v", _panic)
-		}
-	}()
-	sf.bus.RegisterServe(sf.handServ)
+	sf.bus.RegisterServe(sf.handServ).Hassert("servGood1()")
 }
 
 // Нет обработчика для обслуживания запросов
 func (sf *tester) servBad1() {
 	sf.t.Log("servBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("servBad1(): panic==nil")
-		}
-	}()
-	sf.bus.RegisterServe(nil)
+	res := sf.bus.RegisterServe(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("servBad1(): err==nil")
+	}
 }
 
 // Нет такого топика
@@ -146,7 +139,7 @@ func (sf *tester) new() {
 // Закрытие шины
 func (sf *tester) close() {
 	sf.t.Log("close")
-	ctx := kctx.GetKernelCtx()
+	ctx := kctx.GetKernelCtx().Hassert("close()")
 	ctx.Cancel()
 	ctx.Wg().Wait()
 	sf.bus.(*KBusBase).close()
@@ -174,11 +167,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.bus = GetKernelBusBase()
-	sf.bus = GetKernelBusBase()
-	if sf.bus == nil {
-		sf.t.Fatalf("newGood1(): IKernelBus==nil")
-	}
+	sf.bus = GetKernelBusBase().Hassert("newGood1()")
+	sf.bus = GetKernelBusBase().Hassert("newGood1()")
 	if !sf.bus.IsWork() {
 		sf.t.Fatalf("newGood1(): bus not work")
 	}

+ 58 - 33
v4/krn/kbus/kbus_http/client_bus_http/client_bus_http.go → v4/lev2/kbus_http/client_bus_http/client_bus_http.go

@@ -10,20 +10,16 @@ import (
 
 	"github.com/google/uuid"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_string"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_sub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_unsub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_string"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // ClientBusHttp -- клиент HTTP-шины
@@ -38,13 +34,18 @@ type ClientBusHttp struct {
 
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины
 func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
-	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("ClientBusHttp"))
+	log := NewLogBuf(OptIsTerm(true), OptPrefix("ClientBusHttp"))
 	log.Debug("NewClientBusHttp()")
 	if urlRemote == "" {
 		err := fmt.Errorf("NewClientBusHttp(): urlRemote is empty")
 		return NewErr[IBusClient](err)
 	}
-	kCtx := kctx.GetKernelCtx()
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("NewClientBusHttp(): in get ctx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[IBusClient](err)
+	}
+	kCtx := resKernCtx.Val()
 	resLocal := safe_string.NewSafeStringGetenv("LOCAL_HTTP_URL")
 	if resLocal.IsErr() {
 		err := fmt.Errorf("NewClientBusHttp(): in get env LOCAL_HTTP_URL, err=\n\t%w", resLocal.Err())
@@ -57,11 +58,12 @@ func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
 		return NewErr[IBusClient](err)
 	}
 	kBusHttp := resBus.Val()
+	lCtx := NewLocalCtx(kCtx.Ctx())
 	sf := &ClientBusHttp{
-		ctx:       local_ctx.NewLocalCtx(kCtx.Ctx()),
+		ctx:       lCtx.Val(),
 		log:       log,
 		bus:       kBusHttp,
-		isWork:    safe_bool.NewSafeBool(),
+		isWork:    NewSafeBool(),
 		urlRemote: strings.TrimSuffix(urlRemote, "/"),
 		urlLocal:  strings.TrimSuffix(urlLocal.Get(), "/"),
 	}
@@ -71,7 +73,7 @@ func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
 // Unsubscribe -- отписывается от топика в дистанционной шине
 func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 	_uuid, err := uuid.NewV6()
-	Hassert(err == nil, "ClientBusHttp.Unsubscribe(): in generate UUID v6, err=\n\t%v", err)
+	Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in generate UUID v6, err=\n\t%v", err)
 
 	req := &msg_unsub.UnsubReq{
 		Name_: handler.Name(),
@@ -79,11 +81,11 @@ func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 	}
 	req.SelfCheck()
 	binReq, err := json.MarshalIndent(req, "", "  ")
-	Hassert(err == nil, "ClientBusHttp.Unsubscribe(): in marshal to JSON unsubscribe request, err=\n\t%v", err)
+	Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in marshal to JSON unsubscribe request, err=\n\t%v", err)
 	reader := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest("POST", sf.urlRemote+"/bus/unsub", reader)
-	Hassert(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v")
+	Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v", err)
 
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
@@ -92,17 +94,22 @@ func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 	}
 	resp := &msg_unsub.UnsubResp{}
 	err = json.Unmarshal(binBody, resp)
-	Hassert(err == nil, "ClientBusHttp.Unsubscribe(): in unmarshal response,  err=\n\t%v", err)
+	if err != nil {
+		sf.log.Err("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
+		return
+	}
 	if string(resp.Status_) != "ok" {
 		sf.log.Err("Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 	}
-	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
+	if resp.Uuid_ != req.Uuid_ {
+		sf.log.Err("Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
+	}
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине
 func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	_uuid, err := uuid.NewV6()
-	Hassert(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
+	Hassert()(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_sub.SubscribeReq{
 		Topic_:   handler.Topic(),
 		Uuid_:    _uuid.String(),
@@ -113,7 +120,7 @@ func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	body := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest("POST", sf.urlRemote+"/bus/sub", body)
-	Hassert(err == nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v")
+	Hassert()(err == nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v")
 
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
@@ -122,12 +129,18 @@ func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	}
 	resp := &msg_sub.SubscribeResp{}
 	err = json.Unmarshal(binBody, resp)
-	Hassert(err == nil, "ClientBusHttp.Subscribe(): in unmarshal response,  err=\n\t%v", err)
+	if err != nil {
+		err := fmt.Errorf("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
+		return NewErr[bool](err)
+	}
 	if string(resp.Status_) != "ok" {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 		return NewErr[bool](err)
 	}
-	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
+	if resp.Uuid_ != req.Uuid_ {
+		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
+		return NewErr[bool](err)
+	}
 	res := sf.bus.Subscribe(handler)
 	return res
 }
@@ -135,7 +148,7 @@ func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 // SendRequest -- отправляет в дистанционную шину запрос
 func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	_uuid, err := uuid.NewV6()
-	Hassert(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
+	Hassert()(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_serve.ServeReq{
 		Topic_:  topic,
 		Uuid_:   _uuid.String(),
@@ -146,7 +159,7 @@ func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) IResult[[]byte
 	body := strings.NewReader(string(_binReq))
 
 	hReq, err := http.NewRequest("POST", sf.urlRemote+"/bus/request", body)
-	Hassert(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
+	Hassert()(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
 
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
@@ -155,12 +168,18 @@ func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) IResult[[]byte
 	}
 	resp := &msg_serve.ServeResp{}
 	err = json.Unmarshal(binBody, resp)
-	Hassert(err == nil, "ClientBusHttp.SendRequest(): in unmarshal response,  err=\n\t%v", err)
+	if err != nil {
+		err := fmt.Errorf("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
+		return NewErr[[]byte](err)
+	}
 	if string(resp.Status_) != "ok" {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
 		return NewErr[[]byte](err)
 	}
-	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
+	if resp.Uuid_ != req.Uuid_ {
+		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
+		return NewErr[[]byte](err)
+	}
 	return NewRes(resp.BinResp_)
 }
 
@@ -180,7 +199,7 @@ func (sf *ClientBusHttp) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 // Publish -- публикует сообщение в дистанционной шину
 func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	_uuid, err := uuid.NewV6()
-	Hassert(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
+	Hassert()(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_pub.PublishReq{
 		Topic_:  topic,
 		Uuid_:   _uuid.String(),
@@ -191,7 +210,7 @@ func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	body := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest("POST", sf.urlRemote+"/bus/pub", body)
-	Hassert(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
+	Hassert()(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
@@ -200,12 +219,18 @@ func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	}
 	resp := &msg_pub.PublishResp{}
 	err = json.Unmarshal(binBody, resp)
-	Hassert(err == nil, "ClientBusHttp.Publish(): in unmarshal response,  err=\n\t%v", err)
+	if err != nil {
+		err := fmt.Errorf("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
+		return NewErr[bool](err)
+	}
 	if string(resp.Status_) != "ok" {
 		err := fmt.Errorf("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
 		return NewErr[bool](err)
 	}
-	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
+	if resp.Uuid_ != req.Uuid_ {
+		err := fmt.Errorf("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
+		return NewErr[bool](err)
+	}
 	return NewRes(true)
 }
 

+ 20 - 25
v4/krn/kbus/kbus_http/client_bus_http/client_bus_http_test.go → v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go

@@ -6,15 +6,14 @@ import (
 	"strings"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_base"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_http"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_http"
 )
 
 const (
@@ -24,7 +23,7 @@ const (
 
 type tester struct {
 	t        *testing.T
-	me       *mock_env.MockEnv
+	me       IMockEnv
 	ctx      IKernelCtx
 	cl       *ClientBusHttp
 	handSub  *mock_hand_sub_http.MockHandSubHttp
@@ -37,11 +36,11 @@ func TestClientBusHttp(t *testing.T) {
 	handServ := mock_hand_serve.NewMockHandlerServe("test_topic_serv", "local_hook")
 	sf := &tester{
 		t:        t,
-		me:       mock_env.MakeEnv(),
-		ctx:      kctx.GetKernelCtx(),
+		me:       MakeEnv(),
+		ctx:      kctx.GetKernelCtx().Hassert("TestClientBusHttp()"),
 		handSub:  handSub,
 		handServ: handServ,
-		bus:      kbus_base.GetKernelBusBase(),
+		bus:      kbus_base.GetKernelBusBase().Hassert("TestClientBusHttp()"),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
@@ -370,7 +369,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.ctx.Set("monolitName", "test_client_bus_http", "comment")
+	sf.ctx.Set("monolitName", "test_client_bus_http", "comment").Hassert("newGood1()")
 	sf.cl = NewClientBusHttp(baseUrl).Hassert("newGood1()").(*ClientBusHttp)
 	resServ := kserv_http.GetKernelServHttp()
 	kServHttp := resServ.Hassert("newGood1()")
@@ -387,21 +386,17 @@ func (sf *tester) newGood1() {
 // Пустой URL
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad2(): panic==nil")
-		}
-	}()
-	_ = NewClientBusHttp("")
+	res := NewClientBusHttp("")
+	if res.IsOk() {
+		sf.t.Fatalf("newBad2(): err==nil")
+	}
 }
 
 // Нет ничего для HTTP-шины
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = NewClientBusHttp("url")
+	res := NewClientBusHttp("url")
+	if res.IsOk() {
+		sf.t.Fatalf("newBad1(): err==nil")
+	}
 }

+ 36 - 18
v4/krn/kbus/kbus_http/kbus_http.go → v4/lev2/kbus_http/kbus_http.go

@@ -8,17 +8,16 @@ import (
 
 	"github.com/gofiber/fiber/v2"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_base"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_http"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_sub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_unsub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_http"
 )
 
 // kBusHttp -- шина данных поверх HTTP
@@ -39,11 +38,21 @@ func GetKernelBusHttp() IResult[IKernelBus] {
 	if Bus_ != nil {
 		return NewRes(IKernelBus(Bus_))
 	}
-	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kBusHttp"))
+	log := NewLogBuf(OptIsTerm(true), OptPrefix("kBusHttp"))
 	log.Debug("GetKernelBusHttp(): new")
-	ctx := kctx.GetKernelCtx()
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resKernCtx.Err())
+		return NewErr[IKernelBus](err)
+	}
+	kCtx := resKernCtx.Val()
+	resBus := kbus_base.GetKernelBusBase()
+	if resBus.IsErr() {
+		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resBus.Err())
+		return NewErr[IKernelBus](err)
+	}
 	sf := &kBusHttp{
-		KBusBase: kbus_base.GetKernelBusBase(),
+		KBusBase: resBus.Val(),
 		log:      log,
 	}
 	resServ := kserv_http.GetKernelServHttp()
@@ -57,7 +66,11 @@ func GetKernelBusHttp() IResult[IKernelBus] {
 	fibApp.Post("/bus/unsub", sf.postUnsub)         // Топик отписки, IN
 	fibApp.Post("/bus/request", sf.postSendRequest) // Топик входящих запросов, IN
 	fibApp.Post("/bus/pub", sf.postPublish)         // Топик публикаций подписки, IN
-	ctx.Set("kernBus", sf, "GetKernelBusHttp(): http data bus")
+	resSet := kCtx.Set("kernBus", sf, "GetKernelBusHttp(): http data bus")
+	if resSet.IsErr() {
+		sf.log.Err("GetKernelBusHttp(): err=\n\t%v", resSet.Err())
+		return NewErr[IKernelBus](resSet.Err())
+	}
 	Bus_ = sf
 	return NewRes(IKernelBus(Bus_))
 }
@@ -206,16 +219,21 @@ func (sf *kBusHttp) postUnsub(ctx *fiber.Ctx) error {
 // Процесс отписки от топика
 func (sf *kBusHttp) processUnsubRequest(req *msg_unsub.UnsubReq) *msg_unsub.UnsubResp {
 	req.SelfCheck()
-	_hand := sf.Ctx_.Get(string(req.Name_))
 	resp := &msg_unsub.UnsubResp{
 		Status_: "ok",
 		Uuid_:   req.Uuid_,
 	}
-	if _hand == nil {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): handler name(%v) not exists", req.Name_)
+	optHandler := sf.Ctx_.Get(string(req.Name_))
+	if optHandler.IsNone() {
+		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
+			req.Name_)
+		return resp
+	}
+	if optHandler == nil {
+		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.Name_)
 		return resp
 	}
-	hand := _hand.Val().(IBusHandlerSubscribe)
+	hand := optHandler.Val().Val().(IBusHandlerSubscribe)
 	sf.Unsubscribe(hand)
 	return resp
 }

+ 13 - 14
v4/krn/kbus/kbus_http/kbus_http_test.go → v4/lev2/kbus_http/kbus_http_test.go

@@ -8,16 +8,15 @@ import (
 	"strings"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_sub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_unsub"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -32,8 +31,8 @@ func TestKernelBusHttp(t *testing.T) {
 		handSub:  mock_hand_sub_local.NewMockHandlerSub("topic_sub", "http://localhost:18200/bus/pub"),
 		handServ: mock_hand_serve.NewMockHandlerServe("topic_serv", "name_serv"),
 	}
-	ctx := kctx.GetKernelCtx()
-	ctx.Set("monolitName", "test_monolit", "comment")
+	ctx := kctx.GetKernelCtx().Hassert("TestKernelBusHttp()")
+	ctx.Set("monolitName", "test_monolit", "comment").Hassert("TestKernelBusHttp()")
 	sf.get()
 	sf.req()
 	sf.sub()
@@ -547,7 +546,7 @@ func (sf *tester) reqBad1() {
 // Получает локальную шину
 func (sf *tester) get() {
 	sf.t.Log("get")
-	_ = mock_env.MakeEnv()
+	_ = MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/")
 	_ = GetKernelBusHttp()
@@ -555,5 +554,5 @@ func (sf *tester) get() {
 		sf.t.Fatalf("get(): bus==nil")
 	}
 	_ = GetKernelBusHttp()
-	Bus_.RegisterServe(sf.handServ)
+	Bus_.RegisterServe(sf.handServ).Hassert("get()")
 }

+ 28 - 0
v4/lev2/kbus_local/client_bus_local/client_bus_local.go

@@ -0,0 +1,28 @@
+// package client_bus_local -- клиент локальной шины
+package client_bus_local
+
+import (
+	"fmt"
+
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
+)
+
+// ClientBusLocal -- клиент локальной шины
+type ClientBusLocal struct {
+	IKernelBus
+}
+
+// NewClientBusLocal -- клиент локальной шины
+func NewClientBusLocal() IResult[IBusClient] {
+	resLocal := kbus_local.GetKernelBusLocal()
+	if resLocal.IsErr() {
+		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", resLocal.Err())
+		return NewErr[IBusClient](err)
+	}
+	sf := &ClientBusLocal{
+		IKernelBus: resLocal.Val(),
+	}
+	return NewRes(IBusClient(sf))
+}

+ 1 - 1
v4/krn/kbus/kbus_local/client_bus_local/client_bus_local_test.go → v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go

@@ -21,7 +21,7 @@ func TestClientBusLocal(t *testing.T) {
 // Создание нового клиента
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.cl = NewClientBusLocal()
+	sf.cl = NewClientBusLocal().Hassert("new()")
 	if sf.cl == nil {
 		sf.t.Fatalf("new(): client==nil")
 	}

+ 13 - 5
v4/krn/kbus/kbus_local/kbus_local.go → v4/lev2/kbus_local/kbus_local.go

@@ -2,8 +2,11 @@
 package kbus_local
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_base"
+	"fmt"
+
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
 )
 
 // Локальная шина данных
@@ -16,12 +19,17 @@ var (
 )
 
 // GetKernelBusLocal -- возвращает локальную шину сообщений
-func GetKernelBusLocal() IKernelBus {
+func GetKernelBusLocal() IResult[*kernelBusLocal] {
 	if bus != nil {
-		return bus
+		return NewRes(bus)
+	}
+	resBus := kbus_base.GetKernelBusBase()
+	if resBus.IsErr() {
+		err := fmt.Errorf("GetKernelBusLocal(): in get kernel bus base, err=\n\t%w", resBus.Err())
+		return NewErr[*kernelBusLocal](err)
 	}
 	bus = &kernelBusLocal{
-		KBusBase: kbus_base.GetKernelBusBase(),
+		KBusBase: resBus.Val(),
 	}
-	return bus
+	return NewRes(bus)
 }

+ 4 - 4
v4/krn/kbus/kbus_local/kbus_local_test.go → v4/lev2/kbus_local/kbus_local_test.go

@@ -4,8 +4,8 @@ import (
 	"testing"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -38,8 +38,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.bus = GetKernelBusLocal()
-	sf.bus = GetKernelBusLocal()
+	sf.bus = GetKernelBusLocal().Hassert("newGood1()")
+	sf.bus = GetKernelBusLocal().Hassert("newGood1()")
 	if sf.bus == nil {
 		sf.t.Fatalf("newGood1(): IKernelBus==nil")
 	}

+ 19 - 8
v4/krn/kctx/kctx.go → v4/lev2/kctx/kctx.go

@@ -3,12 +3,13 @@ package kctx
 
 import (
 	"context"
+	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx/kernel_keeper"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx/kwg"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kernel_keeper"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kwg"
 )
 
 // kCtx -- контекст ядра
@@ -28,11 +29,11 @@ var (
 )
 
 // GetKernelCtx -- возвращает контекст ядра
-func GetKernelCtx() IKernelCtx {
+func GetKernelCtx() IResult[*kCtx] {
 	block.Lock()
 	defer block.Unlock()
 	if kernCtx != nil {
-		return kernCtx
+		return NewRes(kernCtx)
 	}
 	ctxBg := context.Background()
 	ctx, fnCancel := context.WithCancel(ctxBg)
@@ -41,12 +42,22 @@ func GetKernelCtx() IKernelCtx {
 		ctx:      ctx,
 		fnCancel: fnCancel,
 	}
-	sf.ILocalCtx = local_ctx.NewLocalCtx(sf.ctx)
+	resLocal := NewLocalCtx(sf.ctx)
+	if resLocal.IsErr() {
+		err := fmt.Errorf("GetKernelCtx(): in get local ctx, err=\n\t%w", resLocal.Err())
+		return NewErr[*kCtx](err)
+	}
+	sf.ILocalCtx = resLocal.Val()
 	sf.log = sf.Log()
 	sf.kernWg = kwg.GetKernelWg(sf.ctx)
-	sf.kernKeeper = kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
+	resKeep := kernel_keeper.GetKernelKeeper(sf.ctx, sf.fnCancel, sf.kernWg)
+	if resKeep.IsErr() {
+		sf.log.Err("GetKernelCtx(): in get kernel keeper, err=\n\t%w", resKeep.Err())
+		return nil
+	}
+	sf.kernKeeper = resKeep.Val()
 	kernCtx = sf
-	return kernCtx
+	return NewRes(kernCtx)
 }
 
 // Keeper -- возвращает сторож системных сигналов

+ 4 - 4
v4/krn/kctx/kctx_test.go → v4/lev2/kctx/kctx_test.go

@@ -18,7 +18,7 @@ func TestKernelCtx(t *testing.T) {
 // Создание контекста ядра
 func (sf *tester) new() {
 	sf.t.Log("new")
-	ctx := GetKernelCtx()
+	ctx := GetKernelCtx().Hassert("new()")
 	if ctx == nil {
 		sf.t.Fatalf("new(): KernelCtx==nil")
 	}
@@ -28,7 +28,7 @@ func (sf *tester) new() {
 	if ctx := ctx.Ctx(); ctx == nil {
 		sf.t.Fatalf("new(): ctx==nil")
 	}
-	ctx.Set("counter", 5, "test_counter")
+	ctx.Set("counter", 5, "test_counter").Hassert("new()")
 	if ctx.Get("counter") == nil {
 		sf.t.Fatalf("new(): counter==nil")
 	}
@@ -40,8 +40,8 @@ func (sf *tester) new() {
 	}
 	ctx.Del("counter")
 	ctx.Cancel()
-	ctx.Done()
-	ctx = GetKernelCtx()
+	ctx.Wait()
+	ctx = GetKernelCtx().Hassert("new()")
 	if ctx == nil {
 		sf.t.Fatalf("new(): KernelCtx==nil")
 	}

+ 19 - 9
v4/krn/kctx/kernel_keeper/kernel_keeper.go → v4/lev2/kernel_keeper/kernel_keeper.go

@@ -3,14 +3,14 @@ package kernel_keeper
 
 import (
 	"context"
+	"fmt"
 	"os"
 	"os/signal"
 	"sync"
 	"syscall"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 )
 
 // kernelKeeper -- сторож системных сигналов
@@ -28,21 +28,31 @@ var (
 )
 
 // GetKernelKeeper -- возвращает новый сторож системных сигналов
-func GetKernelKeeper(ctx context.Context, fnCancel func(), wg IKernelWg) *kernelKeeper {
+func GetKernelKeeper(ctx context.Context, fnCancel func(),
+	wg IKernelWg) IResult[*kernelKeeper] {
 	block.Lock()
 	defer block.Unlock()
 	if kernKeep != nil {
 		kernKeep.log.Debug("GetKernelKeeper()")
-		return kernKeep
+		return NewRes(kernKeep)
+	}
+	if ctx == nil {
+		err := fmt.Errorf("NewKernelCtx(): ctx==nil")
+		return NewErr[*kernelKeeper](err)
+	}
+	if wg == nil {
+		err := fmt.Errorf("NewKernelCtx(): IKernelWg==nil")
+		return NewErr[*kernelKeeper](err)
+	}
+	if fnCancel == nil {
+		err := fmt.Errorf("NewKernelCtx(): fnCancel==nil")
+		return NewErr[*kernelKeeper](err)
 	}
-	Hassert(ctx != nil, "NewKernelCtx(): ctx==nil")
-	Hassert(wg != nil, "NewKernelCtx(): IKernelWg==nil")
-	Hassert(fnCancel != nil, "NewKernelCtx(): fnCancel==nil")
 	sf := &kernelKeeper{
 		ctx:      ctx,
 		fnCancel: fnCancel,
 		wg:       wg,
-		log:      log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kernelKeeper")),
+		log:      NewLogBuf(OptIsTerm(true), OptPrefix("kernelKeeper")),
 		chSys_:   make(chan os.Signal, 2),
 	}
 	sf.log.Debug("GetKernelKeeper(): first run")
@@ -52,7 +62,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(), wg IKernelWg) *kernel
 	go sf.run(sf.chSys_)
 	kernKeep = sf
 	_ = IKernelKeeper(sf)
-	return sf
+	return NewRes(sf)
 }
 
 // Log -- возвращает лог сторожа системных сигналов

+ 2 - 2
v4/krn/kctx/kernel_keeper/kernel_keeper_test.go → v4/lev2/kernel_keeper/kernel_keeper_test.go

@@ -6,8 +6,8 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx/kwg"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kwg"
 )
 
 type tester struct {
@@ -64,7 +64,7 @@ func (sf *tester) get2() {
 // Получает сторож ядра
 func (sf *tester) get() {
 	sf.t.Log("get")
-	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg)
+	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg).Hassert("get()")
 	if keep == nil {
 		sf.t.Fatalf("get(): IKernelKeeper==nil")
 	}

+ 23 - 8
v4/krn/kmodule/kmodule.go → v4/lev2/kmodule/kmodule.go

@@ -5,16 +5,16 @@ import (
 	"fmt"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_string"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmodule/mod_stat"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_int"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_string"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
 )
 
 // kModule -- модуль на основе ядра
@@ -34,12 +34,27 @@ func NewKernelModule(name AModuleName) IResult[IKernelModule] {
 		err := fmt.Errorf("NewKernelModule(): name is empty")
 		return NewErr[IKernelModule](err)
 	}
-	kCtx := kctx.GetKernelCtx()
+	resCtx := kctx.GetKernelCtx()
+	if resCtx.IsErr() {
+		err := fmt.Errorf("NewKernelModule(): in get kernel ctx,err=%v", resCtx.Err())
+		return NewErr[IKernelModule](err)
+	}
+	kCtx := resCtx.Val()
+	resLocal := kbus_local.GetKernelBusLocal()
+	if resLocal.IsErr() {
+		err := fmt.Errorf("NewKernelModule(): in get kernel bus local,err=%v", resLocal.Err())
+		return NewErr[IKernelModule](err)
+	}
+	resLocCtx := local_ctx.NewLocalCtx(kCtx.Ctx())
+	if resLocCtx.IsErr() {
+		err := fmt.Errorf("NewKernelModule(): in new local ctx,err=%v", resLocCtx.Err())
+		return NewErr[IKernelModule](err)
+	}
 	sf := &kModule{
 		kCtx:      kCtx,
-		ctx:       local_ctx.NewLocalCtx(kCtx.Ctx()),
+		ctx:       resLocCtx.Val(),
 		name:      name,
-		bus:       kbus_local.GetKernelBusLocal(),
+		bus:       resLocal.Val(),
 		timePhase: safe_int.NewSafeInt(1000), // 1000 msec
 		strLive:   safe_string.NewSafeString(),
 		stat:      mod_stat.NewModStat(name),

+ 7 - 9
v4/krn/kmodule/kmodule_test.go → v4/lev2/kmodule/kmodule_test.go

@@ -5,9 +5,9 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 type tester struct {
@@ -40,7 +40,7 @@ func TestKernelModule(t *testing.T) {
 // Работа после остановки локальной шины
 func (sf *tester) done() {
 	sf.t.Log("done")
-	kCtx := kctx.GetKernelCtx()
+	kCtx := kctx.GetKernelCtx().Hassert("done()")
 
 	time.Sleep(time.Millisecond * 250)
 	kCtx.Cancel()
@@ -98,10 +98,8 @@ func (sf *tester) newGood1() {
 // Нет имени модуля
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = NewKernelModule("")
+	res := NewKernelModule("")
+	if res.IsOk() {
+		sf.t.Fatalf("newBad1(): err==nil")
+	}
 }

+ 3 - 3
v4/krn/kmodule/mod_stat/mod_stat.go → v4/lev2/kmodule/mod_stat/mod_stat.go

@@ -11,12 +11,12 @@ package mod_stat
 import (
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmodule/mod_stat/mod_stat_day"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmodule/mod_stat/mod_stat_sec"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_int"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_day"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_sec"
 )
 
 // ModStat -- статистика модуля

+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_day/mod_stat_day.go → v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go → v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go → v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go → v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go → v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go → v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go


+ 0 - 0
v4/krn/kmodule/mod_stat/mod_stat_test.go → v4/lev2/kmodule/mod_stat/mod_stat_test.go


+ 36 - 14
v4/krn/kmonolit/kmonolit.go → v4/lev2/kmonolit/kmonolit.go

@@ -4,19 +4,19 @@ package kmonolit
 import (
 	"fmt"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // kMonolit -- объект модульного монолита
 type kMonolit struct {
 	kCtx    IKernelCtx
-	ctx     ILocalCtx
+	lCtx    ILocalCtx
 	log     ILogBuf
 	name    string
 	isLocal bool
@@ -35,27 +35,45 @@ func GetMonolit(name string) IResult[*kMonolit] {
 		return NewRes(mon)
 	}
 	Hassert(name != "", "NewMonolit(): name is empty")
-	kCtx := kctx.GetKernelCtx()
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetMonolit(): err=\n\t%w", resKernCtx.Err())
+		return NewErr[*kMonolit](err)
+	}
+	kCtx := resKernCtx.Val()
 	res := kCtx.Get("isLocal")
-	if res.IsErr() {
-		err := fmt.Errorf("GetMonolit(): in get from kernCtx isLocal, err=\n\t%w", res.Err())
+	if res.IsNone() {
+		err := fmt.Errorf("GetMonolit(): in get from kernCtx isLocal -- not found")
 		return NewErr[*kMonolit](err)
 	}
 	isLocalCtx := res.Val()
 	isLocal := isLocalCtx.Val().(bool)
+	resLocCtx := local_ctx.NewLocalCtx(kCtx.Ctx())
+	if resLocCtx.IsErr() {
+		err := fmt.Errorf("GetMonolit(): in new local_ctx, err=\n\t%w", resLocCtx.Err())
+		return NewErr[*kMonolit](err)
+	}
+	lCtx := resLocCtx.Val()
 	sf := &kMonolit{
 		kCtx:    kCtx,
-		ctx:     local_ctx.NewLocalCtx(kCtx.Ctx()),
+		lCtx:    lCtx,
 		name:    name,
 		dict:    map[AModuleName]IKernelModule{},
 		isWork:  safe_bool.NewSafeBool(),
 		isEnd:   safe_bool.NewSafeBool(),
 		isLocal: isLocal,
 	}
-	sf.log = sf.ctx.Log()
-	sf.kCtx.Set("monolitName", name, "name of monolit")
-	sf.kCtx.Set("monolit", sf, "monolit-app")
-	sf.ctx.Set("monolitName", name, "name of monolit")
+	sf.log = sf.lCtx.Log()
+	resSet := sf.kCtx.Set("monolitName", name, "name of monolit")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolitName, err=\n\t%w", resSet.Err())
+		return NewErr[*kMonolit](err)
+	}
+	resSet = sf.kCtx.Set("monolit", sf, "monolit-app")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolit-app, err=\n\t%w", resSet.Err())
+		return NewErr[*kMonolit](err)
+	}
 	mon = sf
 	_ = IKernelMonolit(sf)
 	return NewRes(sf)
@@ -63,12 +81,12 @@ func GetMonolit(name string) IResult[*kMonolit] {
 
 // Ctx -- возвращает контекст монолита
 func (sf *kMonolit) Ctx() ILocalCtx {
-	return sf.ctx
+	return sf.lCtx
 }
 
 // Log -- возвращает лог монолита
 func (sf *kMonolit) Log() ILogBuf {
-	return sf.ctx.Log()
+	return sf.lCtx.Log()
 }
 
 // Name -- возвращает имя монолита
@@ -96,7 +114,11 @@ func (sf *kMonolit) Add(module IKernelModule) IResult[bool] {
 	}
 	key := fmt.Sprintf("module_%v", len(sf.dict))
 	moduleName := string(module.Name())
-	sf.ctx.Set(key, module, "kMonolit.Add(): module="+moduleName)
+	resSet := sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName)
+	if resSet.IsErr() {
+		err := fmt.Errorf("kMonolit.Add(): in set module(%v) to kernel ctx, err=\n\t%w", moduleName, resSet.Err())
+		return NewErr[bool](err)
+	}
 	return NewRes(true)
 }
 
@@ -129,7 +151,7 @@ func (sf *kMonolit) IsWork() bool {
 
 // Ожидание завершения работы монолита
 func (sf *kMonolit) Wait() {
-	sf.kCtx.Done()
+	sf.kCtx.Wait()
 	sf.kCtx.Wg().Wait()
 	sf.kCtx.Lock()
 	defer sf.kCtx.Unlock()

+ 12 - 14
v4/krn/kmonolit/kmonolit_test.go → v4/lev2/kmonolit/kmonolit_test.go

@@ -4,12 +4,12 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kmodule"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
 )
 
 const (
@@ -45,7 +45,7 @@ func TestKernMono(t *testing.T) {
 
 func (sf *tester) done() {
 	sf.t.Log("done")
-	ctx := kctx.GetKernelCtx()
+	ctx := kctx.GetKernelCtx().Hassert("done()")
 	ctx.Cancel()
 	ctx.Wg().Wait()
 	sf.mon.Run()
@@ -75,13 +75,13 @@ func (sf *mod) Run() {}
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
 	mod := newMod("test_module")
-	sf.mon.Add(mod)
+	sf.mon.Add(mod).Hassert("addGood1()")
 }
 
 func (sf *tester) run() {
 	sf.t.Log("run")
 	mod := newMod("test_mod1")
-	sf.mon.Add(mod)
+	sf.mon.Add(mod).Hassert("run()")
 	sf.mon.Run()
 	isWork := sf.mon.IsWork()
 	if !isWork {
@@ -103,8 +103,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	ctx := kctx.GetKernelCtx()
-	ctx.Set("isLocal", true, "type bus")
+	ctx := kctx.GetKernelCtx().Hassert("newGood1()")
+	ctx.Set("isLocal", true, "type bus").Hassert("newGood1()")
 	for {
 		SleepMs()
 		if ctx.Get("isLocal") != nil {
@@ -133,10 +133,8 @@ func (sf *tester) newGood1() {
 // Нет признака локальности
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = GetMonolit("test_32")
+	res := GetMonolit("test_32")
+	if res.IsOk() {
+		sf.t.Fatalf("newBad1(): res.IsOk()==true")
+	}
 }

+ 33 - 18
v4/krn/kserv_http/kserv_http.go → v4/lev2/kserv_http/kserv_http.go

@@ -15,13 +15,13 @@ import (
 	"github.com/gofiber/fiber/v2/middleware/filesystem"
 	"github.com/gofiber/fiber/v2/middleware/monitor"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 const (
@@ -31,7 +31,7 @@ const (
 // kServHttp -- встроенный HTTP-сервер
 type kServHttp struct {
 	kCtx     IKernelCtx
-	ctx      ILocalCtx
+	lCtx     ILocalCtx
 	log      ILogBuf
 	strUrl   string // URL, на котором слушает HTTP-сервер
 	fiberApp *fiber.App
@@ -45,6 +45,7 @@ var embedDirStatic embed.FS
 var (
 	kernServHttp *kServHttp
 	block        sync.Mutex
+	assert       = helpers.Assert
 )
 
 // GetKernelServHttp -- возвращает  встроенный HTTP-сервер
@@ -57,16 +58,23 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 	}
 	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttp"))
 	log.Debug("GetKernelServHttp(): first run")
-	ctx := kctx.GetKernelCtx()
-
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetKernelServHttp(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[IKernelServerHttp](err)
+	}
+	kCtx := resKernCtx.Val()
 	strUrl := os.Getenv("LOCAL_HTTP_URL")
-	Hassert(strUrl != "", "GetKernelServHttp(): env LOCAL_HTTP_URL not set")
-	res := ctx.Get("monolitName")
-	if res.IsErr() {
-		err := fmt.Errorf("GetKernelServHttp(): in get from kCtx monolit name, err=\n\t%w", res.Err())
+	if strUrl == "" {
+		err := fmt.Errorf("GetKernelServHttp(): env LOCAL_HTTP_URL not set")
+		return NewErr[IKernelServerHttp](err)
+	}
+	optMonolit := kCtx.Get("monolitName")
+	if optMonolit.IsNone() {
+		err := fmt.Errorf("GetKernelServHttp(): not have monolit name from kCtx")
 		return NewErr[IKernelServerHttp](err)
 	}
-	strMonolit := res.Val().Val().(string)
+	strMonolit := optMonolit.Val().Val().(string)
 	confFiber := fiber.Config{
 		ServerHeader:      strMonolit,
 		UnescapePath:      true,
@@ -76,10 +84,15 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 		Network:           "tcp4",
 		EnablePrintRoutes: true,
 	}
+	resLocCtx := local_ctx.NewLocalCtx(kCtx.Ctx())
+	if resLocCtx.IsErr() {
+		err := fmt.Errorf("GetKernelServHttp(): in get LocalCtx, err=\n\t%w", resLocCtx.Err())
+		return NewErr[IKernelServerHttp](err)
+	}
 	sf := &kServHttp{
-		kCtx:     ctx,
+		kCtx:     kCtx,
 		log:      log,
-		ctx:      local_ctx.NewLocalCtx(ctx.Ctx()),
+		lCtx:     resLocCtx.Val(),
 		strUrl:   strUrl,
 		fiberApp: fiber.New(confFiber),
 		isWork:   safe_bool.NewSafeBool(),
@@ -97,13 +110,13 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 	sf.fiberApp.Get("/monitor", monitor.New(monitor.Config{Title: strMonolit}))
 	res1 := sf.kCtx.Wg().Add(streamName)
 	res1.Hassert("GetKernelServHttp(): in add stream %v", streamName)
-	resSet := ctx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
+	resSet := kCtx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelServHttp(): in set fiber app, err=\n\t%w", resSet.Err())
 		return NewErr[IKernelServerHttp](err)
 	}
 	kernServHttp = sf
-	resSet = ctx.Set("kServHttp", kernServHttp, "kServHttp")
+	resSet = kCtx.Set("kServHttp", kernServHttp, "kServHttp")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelServHttp(): in set kernServHttp, err=\n\t%w", resSet.Err())
 		return NewErr[IKernelServerHttp](err)
@@ -126,8 +139,10 @@ func (sf *kServHttp) Fiber() *fiber.App {
 	return sf.fiberApp
 }
 
-// Run -- запускает сервер в работу (блокирующий вызов)
+// Run -- запускает сервер в работу (не блокирующий вызов)
 func (sf *kServHttp) Run() {
+	block.Lock()
+	defer block.Unlock()
 	if sf.isEnd.Get() {
 		return
 	}
@@ -184,14 +199,14 @@ func (sf *kServHttp) fnChErr(chErr <-chan string) {
 
 // Ожидает окончания работы
 func (sf *kServHttp) close() {
-	sf.kCtx.Done()
+	sf.kCtx.Wait()
 	if !sf.isWork.Get() {
 		return
 	}
 	sf.isWork.Reset()
 	sf.isEnd.Set()
 	err := sf.fiberApp.Server().Shutdown()
-	Assert(err == nil, "kServHttp.close(): in close server, err=\n\t%v", err)
+	assert(err == nil, "kServHttp.close(): in close server, err=\n\t%v", err)
 	sf.kCtx.Wg().Done(streamName)
 	sf.log.Debug("close(): end")
 }

+ 12 - 16
v4/krn/kserv_http/kserv_http_test.go → v4/lev2/kserv_http/kserv_http_test.go

@@ -4,10 +4,10 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 const (
@@ -22,7 +22,7 @@ type tester struct {
 }
 
 func TestKernelServHttp(t *testing.T) {
-	ctx := kctx.GetKernelCtx()
+	ctx := kctx.GetKernelCtx().Hassert("TestKernelServHttp()")
 	sf := &tester{
 		t:   t,
 		ctx: ctx,
@@ -79,7 +79,7 @@ func (sf *tester) newGood1() {
 	sf.me = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	os.Setenv("LOCAL_HTTP_URL", baseUrl)
-	sf.ctx.Set("monolitName", "test_monolit", "comment")
+	sf.ctx.Set("monolitName", "test_monolit", "comment").Hassert("newGood1()")
 	serv := GetKernelServHttp().Hassert("newGood1()").(*kServHttp)
 	if serv != kernServHttp {
 		sf.t.Fatalf("newGood1(): bad IKernelServHttp")
@@ -102,21 +102,17 @@ func (sf *tester) newGood1() {
 // Не указана SERVER_HTTP_PORT
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad2(): panic==nil")
-		}
-	}()
-	_ = GetKernelServHttp()
+	res := GetKernelServHttp()
+	if res.IsOk() {
+		sf.t.Fatalf("newBad2(): res.IsOk()==true")
+	}
 }
 
 // Нет контекста ядра
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1()")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = GetKernelServHttp()
+	res := GetKernelServHttp()
+	if res.IsOk() {
+		sf.t.Fatalf("newBad1(): res.IsOk()==true")
+	}
 }

+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-grid.min.css → v4/lev2/kserv_http/static/css/bootstrap-grid.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-grid.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-grid.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-grid.rtl.min.css → v4/lev2/kserv_http/static/css/bootstrap-grid.rtl.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-grid.rtl.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-grid.rtl.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-reboot.min.css → v4/lev2/kserv_http/static/css/bootstrap-reboot.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-reboot.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-reboot.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-reboot.rtl.min.css → v4/lev2/kserv_http/static/css/bootstrap-reboot.rtl.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-reboot.rtl.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-reboot.rtl.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-utilities.min.css → v4/lev2/kserv_http/static/css/bootstrap-utilities.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-utilities.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-utilities.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-utilities.rtl.min.css → v4/lev2/kserv_http/static/css/bootstrap-utilities.rtl.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap-utilities.rtl.min.css.map → v4/lev2/kserv_http/static/css/bootstrap-utilities.rtl.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap.min.css → v4/lev2/kserv_http/static/css/bootstrap.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap.min.css.map → v4/lev2/kserv_http/static/css/bootstrap.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap.rtl.min.css → v4/lev2/kserv_http/static/css/bootstrap.rtl.min.css


+ 0 - 0
v4/krn/kserv_http/static/css/bootstrap.rtl.min.css.map → v4/lev2/kserv_http/static/css/bootstrap.rtl.min.css.map


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.bundle.min.js → v4/lev2/kserv_http/static/js/bootstrap.bundle.min.js


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.bundle.min.js.map → v4/lev2/kserv_http/static/js/bootstrap.bundle.min.js.map


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.esm.min.js → v4/lev2/kserv_http/static/js/bootstrap.esm.min.js


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.esm.min.js.map → v4/lev2/kserv_http/static/js/bootstrap.esm.min.js.map


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.min.js → v4/lev2/kserv_http/static/js/bootstrap.min.js


+ 0 - 0
v4/krn/kserv_http/static/js/bootstrap.min.js.map → v4/lev2/kserv_http/static/js/bootstrap.min.js.map


+ 0 - 0
v4/krn/kserv_http/static/js/htmx.min.js → v4/lev2/kserv_http/static/js/htmx.min.js


+ 0 - 0
v4/krn/kserv_http/static/js/hyperscript.min.js → v4/lev2/kserv_http/static/js/hyperscript.min.js


+ 16 - 11
v4/krn/kserv_http_std/kserv_http_std.go → v4/lev2/kserv_http_std/kserv_http_std.go

@@ -7,15 +7,14 @@ import (
 	"sync"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/safe_int"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке
 type kServHttpStd struct {
-	ctx    IKernelCtx
+	kCtx   IKernelCtx
 	log    ILogBuf
 	port   int
 	server *http.Server
@@ -27,23 +26,29 @@ var (
 )
 
 // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке
-func GetKservHttpStd() *kServHttpStd {
+func GetKservHttpStd() IResult[*kServHttpStd] {
 	mu.Lock()
 	defer mu.Unlock()
 	if kServ != nil {
-		return kServ
+		return NewRes(kServ)
 	}
-	log := kern.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttpStd"))
+	log := NewLogBuf(OptIsTerm(true), OptPrefix("kServHttpStd"))
 	log.Debug("GetKservHttpStd()")
-	resPort := safe_int.NewSafeIntGetenv("SERV_HTTP_STD_PORT")
+	resPort := NewSafeIntGetenv("SERV_HTTP_STD_PORT")
 	resPort.Hassert("in get env SERV_HTTP_STD_PORT")
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetKservHttpStd(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[*kServHttpStd](err)
+	}
+	kCtx := resKernCtx.Val()
 	sf := &kServHttpStd{
-		ctx:  kern.GetKernelCtx(),
+		kCtx: kCtx,
 		log:  log,
 		port: resPort.Val().Get(),
 	}
 	kServ = sf
-	return sf
+	return NewRes(sf)
 }
 
 // Run -- запускает сервер вы работу
@@ -63,7 +68,7 @@ func (sf *kServHttpStd) Run() {
 		}
 	}()
 	go sf.close()
-	if err := sf.server.Shutdown(sf.ctx.Ctx()); err != nil {
+	if err := sf.server.Shutdown(sf.kCtx.Ctx()); err != nil {
 		sf.log.Debug("Ошибка при graceful shutdown: %v", err)
 	}
 

+ 26 - 12
v4/krn/kstore_kv/kstore_kv.go → v4/lev2/kstore_kv/kstore_kv.go

@@ -9,13 +9,13 @@ import (
 
 	"github.com/dgraph-io/badger/v4"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 const (
@@ -26,7 +26,7 @@ const (
 type kStoreKv struct {
 	sync.RWMutex
 	kCtx      IKernelCtx
-	ctx       ILocalCtx
+	lCtx      ILocalCtx
 	log       ILogBuf
 	wg        IKernelWg
 	storePath string
@@ -40,26 +40,40 @@ var (
 )
 
 // GetKernelStore -- возвращает новое локальное хранилище ядра
-func GetKernelStore() IKernelStoreKv {
+func GetKernelStore() IResult[*kStoreKv] {
 	block.Lock()
 	defer block.Unlock()
 	if kernStore != nil {
 		kernStore.log.Debug("GetKernelStore()")
-		return kernStore
+		return NewRes(kernStore)
 	}
-	ctx := kctx.GetKernelCtx()
+	resKernCtx := kctx.GetKernelCtx()
+	if resKernCtx.IsErr() {
+		err := fmt.Errorf("GetKernelStore(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
+		return NewErr[*kStoreKv](err)
+	}
+	kCtx := resKernCtx.Val()
 	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kStoreKv"))
+	resLocCtx := local_ctx.NewLocalCtx(kCtx.Ctx())
+	if resLocCtx.IsErr() {
+		err := fmt.Errorf("GetKernelStore(): in get local ctx, err=\n\t%w", resLocCtx.Err())
+		return NewErr[*kStoreKv](err)
+	}
 	sf := &kStoreKv{
-		kCtx:   ctx,
-		ctx:    local_ctx.NewLocalCtx(ctx.Ctx()),
-		wg:     ctx.Wg(),
+		kCtx:   kCtx,
+		lCtx:   resLocCtx.Val(),
+		wg:     kCtx.Wg(),
 		isWork: safe_bool.NewSafeBool(),
 		log:    log,
 	}
 	sf.open()
 	kernStore = sf
-	ctx.Set("kernStoreKV", kernStore, "fast KV store on Badger")
-	return kernStore
+	resSet := kCtx.Set("kernStoreKV", kernStore, "fast KV store on Badger")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetKernelStore(): in set kernel store KV to kernel ctx, err=\n\t%w", resSet.Err())
+		return NewErr[*kStoreKv](err)
+	}
+	return NewRes(kernStore)
 }
 
 // Log -- возвращает локальный лог
@@ -214,7 +228,7 @@ func (sf *kStoreKv) wait(chWait chan int) {
 
 // Ожидает закрытия контекста ядра, закрывает хранилище
 func (sf *kStoreKv) close() {
-	sf.kCtx.Done()
+	sf.kCtx.Wait()
 	sf.Lock()
 	defer sf.Unlock()
 	if !sf.isWork.Get() {

+ 11 - 13
v4/krn/kstore_kv/kstore_kv_test.go → v4/lev2/kstore_kv/kstore_kv_test.go

@@ -5,9 +5,9 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 type tester struct {
@@ -18,7 +18,7 @@ type tester struct {
 }
 
 func TestKernelStore(t *testing.T) {
-	ctx := kctx.GetKernelCtx()
+	ctx := kctx.GetKernelCtx().Hassert("TestKernelStore()")
 	sf := &tester{
 		t:   t,
 		me:  mock_env.MakeEnv(),
@@ -50,7 +50,9 @@ func (sf *tester) workBad1() {
 		sf.t.Fatalf("workBad1(): set, err==nil")
 	}
 	opt := kernStore.Get("test_key")
-	opt.Hassert("workBad1(): in get, err==nil")
+	if opt.IsOk() {
+		sf.t.Fatalf("workBad1(): get, val==nil")
+	}
 	res = kernStore.Delete("test_key")
 	if res.IsOk() {
 		sf.t.Fatalf("workBad1(): del, err==nil")
@@ -65,7 +67,9 @@ func (sf *tester) del() {
 		sf.t.Fatalf("del(): err=%v", res.Err())
 	}
 	opt := kernStore.Get("test_key")
-	opt.Hassert("del(): val!==nil")
+	if opt.IsOk() {
+		sf.t.Fatalf("del(): val!=nil")
+	}
 }
 
 // Поиск по префиксу
@@ -134,14 +138,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	store := GetKernelStore()
-	if store == nil {
-		sf.t.Fatalf("newGood1(): KernelStore==nil")
-	}
-	store = GetKernelStore()
-	if store == nil {
-		sf.t.Fatalf("newGood1(): KernelStore==nil")
-	}
+	_ = GetKernelStore().Hassert("newGood1()")
+	store := GetKernelStore().Hassert("newGood1()")
 	if log := store.Log(); log == nil {
 		sf.t.Fatalf("newGood1(): log==nil")
 	}

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor