Browse Source

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

SVI 10 tháng trước cách đây
mục cha
commit
d3baea2af3
100 tập tin đã thay đổi với 962 bổ sung và 556 xóa
  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")
 	}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác