瀏覽代碼

SVI Добавление v4

SVI 5 月之前
父節點
當前提交
3e8fc70bbc
共有 100 個文件被更改,包括 547 次插入517 次删除
  1. 0 28
      v3/cmd/demo/main.go
  2. 0 59
      v3/mds/mod_keeper/mod_keeper.go
  3. 0 56
      v3/mds/mod_serv_http/mod_serv_http.go
  4. 0 0
      v4/.env
  5. 10 5
      v4/Taskfile.yml
  6. 28 0
      v4/cmd/demo/main.go
  7. 2 2
      v4/cmd/demo/main_test.go
  8. 0 0
      v4/demo.sh
  9. 0 0
      v4/docs/alias.md
  10. 0 0
      v4/docs/helpers.md
  11. 0 0
      v4/docs/idict_topic_serve.md
  12. 0 0
      v4/docs/img/coverage.png
  13. 0 0
      v4/docs/img/coverage.svg
  14. 0 0
      v4/docs/img/mit.png
  15. 0 0
      v4/docs/img/mit.svg
  16. 0 0
      v4/docs/img/ucl.png
  17. 0 0
      v4/docs/img/ucl.svg
  18. 0 0
      v4/docs/index.md
  19. 0 0
      v4/docs/types.md
  20. 1 1
      v4/go.mod
  21. 0 0
      v4/go.sum
  22. 0 0
      v4/ikernel_bus.md
  23. 4 4
      v4/kc/log_buf/log_buf.go
  24. 2 2
      v4/kc/log_buf/log_buf_test.go
  25. 2 2
      v4/kc/log_buf/log_bus/log_bus.go
  26. 0 0
      v4/kc/log_buf/log_bus/log_bus_test.go
  27. 5 4
      v4/kc/log_buf/log_bus/log_topic/log_topic.go
  28. 2 2
      v4/kc/log_buf/log_bus/log_topic/log_topic_test.go
  29. 3 3
      v4/kc/log_buf/log_msg/log_msg.go
  30. 0 0
      v4/kc/log_buf/log_msg/log_msg_test.go
  31. 19 14
      v4/kc/safe_bool_react/safe_bool_react.go
  32. 2 2
      v4/kc/safe_bool_react/safe_bool_react_test.go
  33. 10 9
      v4/kc/safe_int/safe_int.go
  34. 1 1
      v4/kc/safe_int/safe_int_test.go
  35. 7 6
      v4/kc/safe_string/safe_string.go
  36. 1 1
      v4/kc/safe_string/safe_string_test.go
  37. 86 55
      v4/kern.go
  38. 3 3
      v4/kern_test.go
  39. 12 6
      v4/krn/kbus/dict_sub_hook/dict_sub_hook.go
  40. 1 1
      v4/krn/kbus/dict_sub_hook/dict_sub_hook_test.go
  41. 18 10
      v4/krn/kbus/dict_topic_serve/dict_topic_serve.go
  42. 2 2
      v4/krn/kbus/dict_topic_serve/dict_topic_serve_test.go
  43. 22 9
      v4/krn/kbus/dict_topic_sub/dict_topic_sub.go
  44. 10 20
      v4/krn/kbus/dict_topic_sub/dict_topic_sub_test.go
  45. 22 15
      v4/krn/kbus/kbus_base/kbus_base.go
  46. 4 4
      v4/krn/kbus/kbus_base/kbus_base_test.go
  47. 49 28
      v4/krn/kbus/kbus_http/client_bus_http/client_bus_http.go
  48. 18 18
      v4/krn/kbus/kbus_http/client_bus_http/client_bus_http_test.go
  49. 21 15
      v4/krn/kbus/kbus_http/kbus_http.go
  50. 30 20
      v4/krn/kbus/kbus_http/kbus_http_test.go
  51. 2 2
      v4/krn/kbus/kbus_local/client_bus_local/client_bus_local.go
  52. 1 1
      v4/krn/kbus/kbus_local/client_bus_local/client_bus_local_test.go
  53. 2 2
      v4/krn/kbus/kbus_local/kbus_local.go
  54. 3 3
      v4/krn/kbus/kbus_local/kbus_local_test.go
  55. 2 2
      v4/krn/kbus/kbus_msg/msg_pub/msg_pub.go
  56. 0 0
      v4/krn/kbus/kbus_msg/msg_pub/msg_pub_test.go
  57. 2 2
      v4/krn/kbus/kbus_msg/msg_serve/msg_serve.go
  58. 0 0
      v4/krn/kbus/kbus_msg/msg_serve/msg_serve_test.go
  59. 2 2
      v4/krn/kbus/kbus_msg/msg_sub/msg_sub.go
  60. 0 0
      v4/krn/kbus/kbus_msg/msg_sub/msg_sub_test.go
  61. 2 2
      v4/krn/kbus/kbus_msg/msg_unsub/msg_unsub.go
  62. 0 0
      v4/krn/kbus/kbus_msg/msg_unsub/msg_unsub_test.go
  63. 4 4
      v4/krn/kctx/kctx.go
  64. 5 3
      v4/krn/kctx/kctx_test.go
  65. 3 3
      v4/krn/kctx/kernel_keeper/kernel_keeper.go
  66. 2 2
      v4/krn/kctx/kernel_keeper/kernel_keeper_test.go
  67. 8 7
      v4/krn/kctx/kwg/kwg.go
  68. 1 1
      v4/krn/kctx/kwg/kwg_test.go
  69. 9 8
      v4/krn/kint/kint.go
  70. 0 0
      v4/krn/kint/kint_test.go
  71. 18 13
      v4/krn/kmodule/kmodule.go
  72. 4 4
      v4/krn/kmodule/kmodule_test.go
  73. 6 6
      v4/krn/kmodule/mod_stat/mod_stat.go
  74. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_day/mod_stat_day.go
  75. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go
  76. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go
  77. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go
  78. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  79. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go
  80. 0 0
      v4/krn/kmodule/mod_stat/mod_stat_test.go
  81. 28 13
      v4/krn/kmonolit/kmonolit.go
  82. 11 9
      v4/krn/kmonolit/kmonolit_test.go
  83. 29 15
      v4/krn/kserv_http/kserv_http.go
  84. 6 6
      v4/krn/kserv_http/kserv_http_test.go
  85. 0 0
      v4/krn/kserv_http/static/css/bootstrap-grid.min.css
  86. 0 0
      v4/krn/kserv_http/static/css/bootstrap-grid.min.css.map
  87. 0 0
      v4/krn/kserv_http/static/css/bootstrap-grid.rtl.min.css
  88. 0 0
      v4/krn/kserv_http/static/css/bootstrap-grid.rtl.min.css.map
  89. 0 0
      v4/krn/kserv_http/static/css/bootstrap-reboot.min.css
  90. 0 0
      v4/krn/kserv_http/static/css/bootstrap-reboot.min.css.map
  91. 0 0
      v4/krn/kserv_http/static/css/bootstrap-reboot.rtl.min.css
  92. 0 0
      v4/krn/kserv_http/static/css/bootstrap-reboot.rtl.min.css.map
  93. 0 0
      v4/krn/kserv_http/static/css/bootstrap-utilities.min.css
  94. 0 0
      v4/krn/kserv_http/static/css/bootstrap-utilities.min.css.map
  95. 0 0
      v4/krn/kserv_http/static/css/bootstrap-utilities.rtl.min.css
  96. 0 0
      v4/krn/kserv_http/static/css/bootstrap-utilities.rtl.min.css.map
  97. 0 0
      v4/krn/kserv_http/static/css/bootstrap.min.css
  98. 0 0
      v4/krn/kserv_http/static/css/bootstrap.min.css.map
  99. 0 0
      v4/krn/kserv_http/static/css/bootstrap.rtl.min.css
  100. 0 0
      v4/krn/kserv_http/static/css/bootstrap.rtl.min.css.map

+ 0 - 28
v3/cmd/demo/main.go

@@ -1,28 +0,0 @@
-// package main -- пускач для демонстратора монолита
-package main
-
-import (
-	"gitp78su.ipnodns.ru/svi/kern/v3"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-)
-
-var app IKernelMonolit
-
-func main() {
-	app = kern.GetMonolitLocal("Demo monolit")
-
-	modServHttp := kern.GetModuleServHttp()
-	app.Add(modServHttp)
-
-	modKernelCtx := kern.GetModuleKernelCtx()
-	app.Add(modKernelCtx)
-
-	modKernKeep := kern.GetModuleKernelKeeper()
-	app.Add(modKernKeep)
-
-	modWui := kern.GetModuleWui()
-	app.Add(modWui)
-
-	app.Run()
-	app.Wait()
-}

+ 0 - 59
v3/mds/mod_keeper/mod_keeper.go

@@ -1,59 +0,0 @@
-// package mod_keeper -- модуль сторожа ядра
-package mod_keeper
-
-import (
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/http_api"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/page_module"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/page_monolit"
-)
-
-// ModuleKeeper -- модуль сторожа
-type ModuleKeeper struct {
-	IKernelModule
-	kCtx      IKernelCtx
-	kServHttp IKernelServerHttp
-	log       ILogBuf
-}
-
-var (
-	mod   *ModuleKeeper
-	block sync.Mutex
-)
-
-// GetModuleKeeper -- возвращает новый модуль сторожа ядра
-func GetModuleKeeper() *ModuleKeeper {
-	block.Lock()
-	defer block.Unlock()
-	if mod != nil {
-		return nil
-	}
-	sf := &ModuleKeeper{
-		kCtx:          kctx.GetKernelCtx(),
-		IKernelModule: kmodule.NewKernelModule("kKeeper"),
-		kServHttp:     kserv_http.GetKernelServHttp(),
-	}
-	sf.log = sf.kCtx.Keeper().Log()
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
-
-	_ = http_api.NewHttpApi()
-	mod = sf
-	return sf
-}
-
-// Run -- запускает модуль в работу
-func (sf *ModuleKeeper) Run() {
-	sf.log.Info("ModuleKernelCtx.Run(): module=%v, is run", sf.Name())
-	go sf.kServHttp.Run()
-}
-
-// IsWork -- признак работы модуля
-func (sf *ModuleKeeper) IsWork() bool {
-	return sf.kCtx.Wg().IsWork()
-}

+ 0 - 56
v3/mds/mod_serv_http/mod_serv_http.go

@@ -1,56 +0,0 @@
-// package mod_serv_http -- модуль HTTP-сервера
-package mod_serv_http
-
-import (
-	"sync"
-
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/http_api"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/page_module"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http/page_monolit"
-)
-
-// ModuleServHttp -- модуль HTTP-сервера
-type ModuleServHttp struct {
-	IKernelModule
-	kServHttp IKernelServerHttp
-	log       ILogBuf
-}
-
-var (
-	mod   *ModuleServHttp
-	block sync.RWMutex
-)
-
-// GetModuleServHttp -- возвращает новый модуль HTTP-сервера
-func GetModuleServHttp() *ModuleServHttp {
-	block.Lock()
-	defer block.Unlock()
-	if mod != nil {
-		return mod
-	}
-	sf := &ModuleServHttp{
-		IKernelModule: kmodule.NewKernelModule("kServHttp"),
-		kServHttp:     kserv_http.GetKernelServHttp(),
-	}
-	sf.log = sf.Ctx().Log()
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
-
-	_ = http_api.NewHttpApi()
-	mod = sf
-	return sf
-}
-
-// Run -- запускает модуль в работу
-func (sf *ModuleServHttp) Run() {
-	sf.log.Info("ModuleServHttp.Run(): module=%v, is run", sf.Name())
-	go sf.kServHttp.Run()
-}
-
-// IsWork -- признак работы модуля
-func (sf *ModuleServHttp) IsWork() bool {
-	return sf.kServHttp.IsWork()
-}

+ 0 - 0
v3/.env → v4/.env


+ 10 - 5
v3/Taskfile.yml → v4/Taskfile.yml

@@ -9,18 +9,18 @@ dotenv: [.env]
 
 tasks:
   default:
-    desc: Вывод справки
+    desc: "Вывод справки"
     cmds:
       - echo "{{.HELP}}"
     silent: true
   demo:
-    desc: Запуск демо-проекта
+    desc: "Запуск демо-проекта"
     cmds:
       - clear
       - go fmt ./...
       - go build -race -o ./bin_dev/demo ./cmd/demo/main.go
   mod:
-    desc: Обновление зависимостей
+    desc: "Обновление зависимостей"
     cmds:
       - clear
       - go fmt ./...
@@ -28,14 +28,14 @@ tasks:
       - go mod vendor
       - go fmt ./...
   test:
-    desc: Запуск тестов
+    desc: "Запуск тестов"
     cmds:
       - clear
       - go fmt ./...
       - go test -race -shuffle=on -timeout=30s -coverprofile=./cover.out ./...
       - go tool cover -func=./cover.out
   lint:
-    desc: Запуск всех линтеров
+    desc: "Запуск всех линтеров"
     cmds:
       - clear
       - go fmt ./...
@@ -50,3 +50,8 @@ tasks:
       # - gocyclo -over 11 .
       # - go install github.com/securego/gosec/cmd/gosec@latest
       # - gosec ./...
+  fmt:
+    desc: "Форматирование кода"
+    cmds:
+      - clear
+      - go fmt ./...

+ 28 - 0
v4/cmd/demo/main.go

@@ -0,0 +1,28 @@
+// package main -- пускач для демонстратора монолита
+package main
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+)
+
+var app IKernelMonolit
+
+func main() {
+	app = kern.GetMonolitLocal("Demo monolit").Hassert("main()")
+
+	modServHttp := kern.GetModuleServHttp().Hassert("main()")
+	app.Add(modServHttp).Hassert("main()")
+
+	modKernelCtx := kern.GetModuleKernelCtx().Hassert("main()")
+	app.Add(modKernelCtx).Hassert("main()")
+
+	modKernKeep := kern.GetModuleKernelKeeper().Hassert("main()")
+	app.Add(modKernKeep).Hassert("main()")
+
+	modWui := kern.GetModuleWui().Hassert("main()")
+	app.Add(modWui).Hassert("main()")
+
+	app.Run()
+	app.Wait()
+}

+ 2 - 2
v3/cmd/demo/main_test.go → v4/cmd/demo/main_test.go

@@ -5,8 +5,8 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
 )
 
 func TestMain(t *testing.T) {

+ 0 - 0
v3/demo.sh → v4/demo.sh


+ 0 - 0
v3/docs/alias.md → v4/docs/alias.md


+ 0 - 0
v3/docs/helpers.md → v4/docs/helpers.md


+ 0 - 0
v3/docs/idict_topic_serve.md → v4/docs/idict_topic_serve.md


+ 0 - 0
v3/docs/img/coverage.png → v4/docs/img/coverage.png


+ 0 - 0
v3/docs/img/coverage.svg → v4/docs/img/coverage.svg


+ 0 - 0
v3/docs/img/mit.png → v4/docs/img/mit.png


+ 0 - 0
v3/docs/img/mit.svg → v4/docs/img/mit.svg


+ 0 - 0
v3/docs/img/ucl.png → v4/docs/img/ucl.png


+ 0 - 0
v3/docs/img/ucl.svg → v4/docs/img/ucl.svg


+ 0 - 0
v3/docs/index.md → v4/docs/index.md


+ 0 - 0
v3/docs/types.md → v4/docs/types.md


+ 1 - 1
v3/go.mod → v4/go.mod

@@ -1,4 +1,4 @@
-module gitp78su.ipnodns.ru/svi/kern/v3
+module gitp78su.ipnodns.ru/svi/kern/v4
 
 go 1.24.2
 

+ 0 - 0
v3/go.sum → v4/go.sum


+ 0 - 0
v3/ikernel_bus.md → v4/ikernel_bus.md


+ 4 - 4
v3/kc/log_buf/log_buf.go → v4/kc/log_buf/log_buf.go

@@ -5,10 +5,10 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf/log_msg"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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/safe_bool"
 )
 
 // logBuf -- потокобезопасный буфер лога

+ 2 - 2
v3/kc/log_buf/log_buf_test.go → v4/kc/log_buf/log_buf_test.go

@@ -3,8 +3,8 @@ package log_buf
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 type tester struct {

+ 2 - 2
v3/kc/log_buf/log_bus/log_bus.go → v4/kc/log_buf/log_bus/log_bus.go

@@ -4,8 +4,8 @@ package log_bus
 import (
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type LogDictTopic struct {

+ 0 - 0
v3/kc/log_buf/log_bus/log_bus_test.go → v4/kc/log_buf/log_bus/log_bus_test.go


+ 5 - 4
v3/kc/log_buf/log_bus/log_topic/log_topic.go → v4/kc/log_buf/log_bus/log_topic/log_topic.go

@@ -4,9 +4,10 @@ package log_topic
 import (
 	"fmt"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "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"
 )
 
 // LogTopic -- элемент лога шины
@@ -27,7 +28,7 @@ func NewLogTopic(topic ATopic, client IBusClient) *LogTopic {
 }
 
 // Pub -- публикует сообщение в топик
-func (sf *LogTopic) Pub(binMsg []byte) Result[bool] {
+func (sf *LogTopic) Pub(binMsg []byte) IResult[bool] {
 	res := sf.client.Publish(sf.topic, binMsg)
 	if res.IsErr() {
 		err := fmt.Errorf("LogTopic.Pub(): in pub with client, err=\n\t%v", res.Err())

+ 2 - 2
v3/kc/log_buf/log_bus/log_topic/log_topic_test.go → v4/kc/log_buf/log_bus/log_topic/log_topic_test.go

@@ -3,8 +3,8 @@ package log_topic
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_local/client_bus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local/client_bus_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
 )
 
 type tester struct {

+ 3 - 3
v3/kc/log_buf/log_msg/log_msg.go → v4/kc/log_buf/log_msg/log_msg.go

@@ -4,9 +4,9 @@ package log_msg
 import (
 	"fmt"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 const (

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


+ 19 - 14
v3/kc/safe_bool_react/safe_bool_react.go → v4/kc/safe_bool_react/safe_bool_react.go

@@ -7,8 +7,8 @@ import (
 	"strings"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // safeBoolReact -- потокобезопасный булевый признак с реакцией на своё изменение
@@ -26,26 +26,26 @@ func NewSafeBoolReact() ISafeBoolReact {
 	return sf
 }
 
-// NewSafeBoolReactFromStr -- возвращает новое потокобезоппсное булево с реакцией из строки
-func NewSafeBoolReactFromStr(strVal string) Result[ISafeBoolReact] {
+// NewSafeBoolReactFromStr -- возвращает новое потокобезопасное булево с реакцией из строки
+func NewSafeBoolReactFromStr(strVal string) IResult[ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeBoolReactFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
 		return NewErr[ISafeBoolReact](err)
 	}
-	return NewOk(sf)
+	return NewRes(sf)
 }
 
-// NewSafeBoolGetenv -- возвращает новое потокобезоппсное целое с реакцией из окружения
-func NewSafeBoolGetenv(env string) Result[ISafeBoolReact] {
+// NewSafeBoolGetenv -- возвращает новое потокобезопасное целое с реакцией из окружения
+func NewSafeBoolGetenv(env string) IResult[ISafeBoolReact] {
 	sf := NewSafeBoolReact()
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
 		return NewErr[ISafeBoolReact](err)
 	}
-	return NewOk(sf)
+	return NewRes(sf)
 }
 
 // Delete -- удаляет функцию обратного вызова из наблюдения
@@ -56,13 +56,18 @@ func (sf *safeBoolReact) Delete(key string) {
 }
 
 // Add -- добавляет функцию обратного вызова
-func (sf *safeBoolReact) Add(key string, fn func(bool)) {
+func (sf *safeBoolReact) Add(key string, fn func(bool)) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
-	Hassert(key != "", "safeBoolReact.Add(): key is empty")
+	if key == "" {
+		return NewErr[bool](fmt.Errorf("safeBoolReact.Add(): key is empty"))
+	}
 	_, isOk := sf.dict[key]
-	Hassert(!isOk, "safeBoolReact.Add(): key already exists")
+	if isOk {
+		return NewErr[bool](fmt.Errorf("safeBoolReact.Add(): key(%v) already exists", key))
+	}
 	sf.dict[key] = fn
+	return NewRes(true)
 }
 
 // Get -- возвращает хранимый булевый признак
@@ -93,7 +98,7 @@ func (sf *safeBoolReact) Reset() {
 }
 
 // FromStr -- получает число из строки
-func (sf *safeBoolReact) FromStr(strVal string) Result[bool] {
+func (sf *safeBoolReact) FromStr(strVal string) IResult[bool] {
 	strVal = strings.ToLower(strVal)
 	sf.Lock()
 	defer sf.Unlock()
@@ -105,11 +110,11 @@ func (sf *safeBoolReact) FromStr(strVal string) Result[bool] {
 	default:
 		return NewErr[bool](fmt.Errorf("safeBoolReact.FromStr(): val(%v) bad", strVal))
 	}
-	return NewOk(sf.val)
+	return NewRes(sf.val)
 }
 
 // Getenv -- получает значение из окружения
-func (sf *safeBoolReact) Getenv(env string) Result[bool] {
+func (sf *safeBoolReact) Getenv(env string) IResult[bool] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {

+ 2 - 2
v3/kc/safe_bool_react/safe_bool_react_test.go → v4/kc/safe_bool_react/safe_bool_react_test.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
@@ -115,7 +115,7 @@ func (sf *tester) del() {
 // Добавляет функцию обратного вызова
 func (sf *tester) add() {
 	sf.t.Log("add")
-	sf.sbr.Add("test", sf.fnBack)
+	sf.sbr.Add("test", sf.fnBack).Hassert("add()")
 }
 
 // Функция обратного вызова для контроля

+ 10 - 9
v3/kc/safe_int/safe_int.go → v4/kc/safe_int/safe_int.go

@@ -5,8 +5,9 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kint"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kint"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // safeInt -- потокобезопасное целое
@@ -24,25 +25,25 @@ func NewSafeInt(val int) ISafeInt {
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки
-func NewSafeIntFromStr(strVal string) Result[ISafeInt] {
+func NewSafeIntFromStr(strVal string) IResult[ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeIntFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
 		return NewErr[ISafeInt](err)
 	}
-	return NewOk(sf)
+	return NewRes(sf)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения
-func NewSafeIntGetenv(env string) Result[ISafeInt] {
+func NewSafeIntGetenv(env string) IResult[ISafeInt] {
 	sf := NewSafeInt(0)
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeIntGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
 		return NewErr[ISafeInt](err)
 	}
-	return NewOk(sf)
+	return NewRes(sf)
 }
 
 // FromBool -- устанавливает значение из булева значения
@@ -88,14 +89,14 @@ func (sf *safeInt) Reset() {
 }
 
 // FromStr -- получает число из строки
-func (sf *safeInt) FromStr(strVal string) Result[int] {
+func (sf *safeInt) FromStr(strVal string) IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromStr(strVal)
 }
 
 // FromByte -- получает число из среза байт
-func (sf *safeInt) FromByte(binData []byte) Result[int] {
+func (sf *safeInt) FromByte(binData []byte) IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.FromByte(binData)
@@ -123,7 +124,7 @@ func (sf *safeInt) ToStr() string {
 }
 
 // Getenv -- получает значение из окружения
-func (sf *safeInt) Getenv(env string) Result[int] {
+func (sf *safeInt) Getenv(env string) IResult[int] {
 	sf.Lock()
 	defer sf.Unlock()
 	return sf.val.Getenv(env)

+ 1 - 1
v3/kc/safe_int/safe_int_test.go → v4/kc/safe_int/safe_int_test.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {

+ 7 - 6
v3/kc/safe_string/safe_string.go → v4/kc/safe_string/safe_string.go

@@ -6,7 +6,8 @@ import (
 	"os"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // safeString -- потокобезопасная строка
@@ -21,15 +22,15 @@ func NewSafeString() ISafeString {
 	return sf
 }
 
-// NewSafeStringGetenv -- возвращает новуб потокобезопасную строку из окружения
-func NewSafeStringGetenv(env string) Result[ISafeString] {
+// NewSafeStringGetenv -- возвращает новую потокобезопасную строку из окружения
+func NewSafeStringGetenv(env string) IResult[ISafeString] {
 	sf := NewSafeString()
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeStringGetenv(): in get from env(%v), err=\n\t%w", env, res.Err())
 		return NewErr[ISafeString](err)
 	}
-	return NewOk(sf)
+	return NewRes(sf)
 }
 
 // Byte -- возвращает байтовое представление строки
@@ -61,12 +62,12 @@ func (sf *safeString) Reset() {
 }
 
 // Getenv -- получает значение из окружения
-func (sf *safeString) Getenv(env string) Result[string] {
+func (sf *safeString) Getenv(env string) IResult[string] {
 	strVal := os.Getenv(env)
 	if strVal == "" {
 		err := fmt.Errorf("safeString.Getenv(): from env(%v), val is empty", env)
 		return NewErr[string](err)
 	}
 	sf.val = strVal
-	return NewOk(strVal)
+	return NewRes(strVal)
 }

+ 1 - 1
v3/kc/safe_string/safe_string_test.go → v4/kc/safe_string/safe_string_test.go

@@ -4,7 +4,7 @@ import (
 	"os"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {

+ 86 - 55
v3/kern.go → v4/kern.go

@@ -3,31 +3,34 @@ package kern
 
 import (
 	"context"
-
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool_react"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_string"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_http/client_bus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_local/client_bus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kint"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmonolit"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kstore_kv"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_keeper"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_serv_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mds/mod_wui"
+	"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"
 )
 
 // GetKernelCtx -- возвращает контекст ядра
@@ -43,7 +46,7 @@ func GetKernelStoreKv() IKernelStoreKv {
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра
-func GetKernelServerHttp() IKernelServerHttp {
+func GetKernelServerHttp() IResult[IKernelServerHttp] {
 	kernServHttp := kserv_http.GetKernelServHttp()
 	return kernServHttp
 }
@@ -63,13 +66,13 @@ func GetKernelBusLocal() IKernelBus {
 }
 
 // GetKernelBusHttp -- возвращает HTTP шину данных
-func GetKernelBusHttp() IKernelBus {
+func GetKernelBusHttp() IResult[IKernelBus] {
 	bus := kbus_http.GetKernelBusHttp()
 	return bus
 }
 
 // GetMonolitLocal -- возвращает монолит с локальной шиной
-func GetMonolitLocal(name string) IKernelMonolit {
+func GetMonolitLocal(name string) IResult[IKernelMonolit] {
 	ctx := kctx.GetKernelCtx()
 	ctx.Set("isLocal", true, "bus type")
 	for {
@@ -78,13 +81,17 @@ func GetMonolitLocal(name string) IKernelMonolit {
 			break
 		}
 	}
-	monolit := kmonolit.GetMonolit(name)
+	res := kmonolit.GetMonolit(name)
+	if res.IsErr() {
+		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", res.Err())
+		return NewErr[IKernelMonolit](err)
+	}
 	_ = kbus_local.GetKernelBusLocal()
-	return monolit
+	return NewRes(IKernelMonolit(res.Val()))
 }
 
 // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP
-func GetMonolitHttp(name string) IKernelMonolit {
+func GetMonolitHttp(name string) IResult[IKernelMonolit] {
 	ctx := kctx.GetKernelCtx()
 	_ = kbus_http.GetKernelBusHttp()
 	ctx.Set("isLocal", false, "bus type")
@@ -94,14 +101,18 @@ func GetMonolitHttp(name string) IKernelMonolit {
 			break
 		}
 	}
-	monolit := kmonolit.GetMonolit(name)
-	return monolit
+	res := kmonolit.GetMonolit(name)
+	if res.IsErr() {
+		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", res.Err())
+		return NewErr[IKernelMonolit](err)
+	}
+	return NewRes(IKernelMonolit(res.Val()))
 }
 
 // NewKernelModule -- возвращает новый модуль на ядре
-func NewKernelModule(name AModuleName) IKernelModule {
-	mod := kmodule.NewKernelModule(name)
-	return mod
+func NewKernelModule(name AModuleName) IResult[IKernelModule] {
+	resMod := kmodule.NewKernelModule(name)
+	return resMod
 }
 
 // NewClientBusLocal -- возвращает клиент для работы с локальной шиной
@@ -111,33 +122,53 @@ func NewClientBusLocal() IBusClient {
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP
-func NewClientBusHttp(url string) IBusClient {
+func NewClientBusHttp(url string) IResult[IBusClient] {
 	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
 
 // GetModuleServHttp -- возвращает модуль для IKernelServHttp
-func GetModuleServHttp() IKernelModule {
-	modServHttp := mod_serv_http.GetModuleServHttp()
-	return modServHttp
+func GetModuleServHttp() IResult[IKernelModule] {
+	resHttp := mod_serv_http.GetModuleServHttp()
+	if resHttp.IsErr() {
+		err := fmt.Errorf("GetModuleServHttp(): err=\n\t%w", resHttp.Err())
+		return NewErr[IKernelModule](err)
+	}
+	modServHttp := resHttp.Val()
+	return NewRes(IKernelModule(modServHttp))
 }
 
 // GetModuleKernelCtx -- возвращает модуль для IKernelCtx
-func GetModuleKernelCtx() IKernelModule {
-	modKernelCtx := mod_kctx.GetModuleKernelCtx()
-	return modKernelCtx
+func GetModuleKernelCtx() IResult[IKernelModule] {
+	resMod := mod_kctx.GetModuleKernelCtx()
+	if resMod.IsErr() {
+		err := fmt.Errorf("GetModuleKernelCtx(): err=\n\t%w", resMod.Err())
+		return NewErr[IKernelModule](err)
+	}
+	mod := resMod.Val()
+	return NewRes(IKernelModule(mod))
 }
 
 // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper
-func GetModuleKernelKeeper() IKernelModule {
-	modKernelKeeper := mod_keeper.GetModuleKeeper()
-	return modKernelKeeper
+func GetModuleKernelKeeper() IResult[IKernelModule] {
+	resKeeper := mod_keeper.GetModuleKeeper()
+	if resKeeper.IsErr() {
+		err := fmt.Errorf("GetModuleKernelKeeper(): err=\n\t%w", resKeeper.Err())
+		return NewErr[IKernelModule](err)
+	}
+	modKernelKeeper := resKeeper.Val()
+	return NewRes(IKernelModule(modKernelKeeper))
 }
 
 // GetModuleWui -- возвращает модуль для WUI
-func GetModuleWui() IKernelModule {
-	mod := mod_wui.GetModuleWui()
-	return mod
+func GetModuleWui() IResult[IKernelModule] {
+	resMod := mod_wui.GetModuleWui()
+	if resMod.IsErr() {
+		err := fmt.Errorf("GetModuleWui(): err=\n\t%w", resMod.Err())
+		return NewErr[IKernelModule](err)
+	}
+	modWui := resMod.Val()
+	return NewRes(IKernelModule(modWui))
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог
@@ -177,22 +208,22 @@ func NewSafeString() ISafeString {
 }
 
 // MakeOk -- возвращает новый положительный результат операции
-func MakeOk[T any](res T) Result[T] {
-	return NewOk(res)
+func MakeOk[T any](res T) IResult[T] {
+	return NewRes(res)
 }
 
 // MakeErr -- возвращает новую ошибку результат операции
-func MakeErr[T any](err error) Result[T] {
+func MakeErr[T any](err error) IResult[T] {
 	return NewErr[T](err)
 }
 
 // MakeSome -- возвращает новый не пустой результат операции
-func MakeSome[T any](some T) Option[T] {
-	return NewSome(some)
+func MakeSome[T any](some T) IOption[T] {
+	return NewOpt(some)
 }
 
 // MakeNone -- возвращает новый пустой результат операции
-func MakeNone[T any]() Option[T] {
+func MakeNone[T any]() IOption[T] {
 	return NewNone[T]()
 }
 

+ 3 - 3
v3/kern_test.go → v4/kern_test.go

@@ -5,8 +5,8 @@ import (
 	"os"
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
+	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
+	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
 )
 
 const (
@@ -165,7 +165,7 @@ func (sf *tester) new() {
 		sf.t.Fatalf("new(): cal(%v)!=28", val)
 	}
 
-	kernServHttp := GetKernelServerHttp()
+	kernServHttp := GetKernelServerHttp().Hassert("new()")
 	go kernServHttp.Run()
 	ctx.Cancel()
 	ctx.Wg().Wait()

+ 12 - 6
v3/krn/kbus/dict_sub_hook/dict_sub_hook.go → v4/krn/kbus/dict_sub_hook/dict_sub_hook.go

@@ -2,12 +2,14 @@
 package dict_sub_hook
 
 import (
+	"fmt"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // dictSubHook -- словарь потребителей топика по подписке
@@ -37,13 +39,17 @@ func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
 }
 
 // Subscribe -- добавляет в словарь подписки новый обработчик
-func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) {
+func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil")
+	if handler == nil {
+		err := fmt.Errorf("dictSubHook.Subscribe(): handler==nil")
+		return NewErr[bool](err)
+	}
 	handlerName := handler.Name()
 	sf.dict[handlerName] = true
 	sf.ctx.Set(string(handlerName), handler, "subscribe handler")
+	return NewRes(true)
 }
 
 // Read -- вызывает все обработчики словаря подписок

+ 1 - 1
v3/krn/kbus/dict_sub_hook/dict_sub_hook_test.go → v4/krn/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -3,7 +3,7 @@ package dict_sub_hook
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local"
+	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
 )
 
 type tester struct {

+ 18 - 10
v3/krn/kbus/dict_topic_serve/dict_topic_serve.go → v4/krn/kbus/dict_topic_serve/dict_topic_serve.go

@@ -7,10 +7,11 @@ import (
 	"sync"
 	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // dictServe -- потокобезопасный словарь обработчиков запросов
@@ -32,14 +33,21 @@ func NewDictServe() IDictTopicServe {
 }
 
 // Register -- регистрирует обработчик запросов
-func (sf *dictServe) Register(handler IBusHandlerServe) {
+func (sf *dictServe) Register(handler IBusHandlerServe) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
-	Hassert(handler != nil, "dictServe.Register(): IBusHandlerSubscribe==nil")
+	if handler == nil {
+		return NewErr[bool](fmt.Errorf("dictServe.Register(): IBusHandlerSubscribe==nil"))
+	}
 	topic := handler.Topic()
-	Hassert(topic != "", "dictServe.Register(): empty topic of handler")
+	if topic == "" {
+		return NewErr[bool](fmt.Errorf("dictServe.Register(): empty topic of handler"))
+	}
 	isTwinRegister := sf.register(handler)
-	Hassert(!isTwinRegister, "dictServe.Register(): handler of topic (%v) already register", handler.Topic())
+	if isTwinRegister {
+		return NewErr[bool](fmt.Errorf("dictServe.Register(): handler of topic (%v) already register", topic))
+	}
+	return NewRes(true)
 }
 
 // Unregister -- удаляет обработчик запросов из словаря
@@ -51,7 +59,7 @@ func (sf *dictServe) Unregister(handler IBusHandlerServe) {
 }
 
 // SendRequest -- вызывает обработчик при поступлении запроса
-func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) Result[[]byte] {
+func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic]
@@ -60,7 +68,7 @@ func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) Result[[]byte] {
 		return NewErr[[]byte](err)
 	}
 	var (
-		chRes = make(chan Result[[]byte], 2)
+		chRes = make(chan IResult[[]byte], 2)
 	)
 	ctx, fnCancel := context.WithTimeout(sf.ctx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
 	defer fnCancel()

+ 2 - 2
v3/krn/kbus/dict_topic_serve/dict_topic_serve_test.go → v4/krn/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -3,8 +3,8 @@ package dict_topic_serve
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
+	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_serve"
 )
 
 type tester struct {

+ 22 - 9
v3/krn/kbus/dict_topic_sub/dict_topic_sub.go → v4/krn/kbus/dict_topic_sub/dict_topic_sub.go

@@ -2,13 +2,15 @@
 package dict_topic_sub
 
 import (
+	"fmt"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/dict_sub_hook"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 type tReadReq struct {
@@ -49,18 +51,29 @@ func (sf *dictTopicSub) Read(topic ATopic, binMsg []byte) {
 }
 
 // Subscribe -- подписывает обработчик на топик
-func (sf *dictTopicSub) Subscribe(handler IBusHandlerSubscribe) {
+func (sf *dictTopicSub) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
-	Hassert(handler != nil, "dictTopicSub.Subscribe(): IBusHandlerSubscribe==nil")
+	if handler == nil {
+		err := fmt.Errorf("dictTopicSub.Subscribe(): handler==nil")
+		return NewErr[bool](err)
+	}
 	topic := handler.Topic()
-	Hassert(topic != "", "dictTopicSub.Subscribe(): topic is empty")
+	if topic == "" {
+		err := fmt.Errorf("dictTopicSub.Subscribe(): topic==\"\"")
+		return NewErr[bool](err)
+	}
 	dictSubHook := sf.dictTopicHook[topic]
 	if dictSubHook == nil {
 		dictSubHook = dict_sub_hook.NewDictSubHook()
 		sf.dictTopicHook[topic] = dictSubHook
 	}
-	dictSubHook.Subscribe(handler)
+	res := dictSubHook.Subscribe(handler)
+	if res.IsErr() {
+		err := fmt.Errorf("dictTopicSub.Subscribe(): in add subscribe dict handler, err=\n\t%w", res.Err())
+		return NewErr[bool](err)
+	}
+	return NewRes(true)
 }
 
 // Unsubscribe -- отписывает обработчик

+ 10 - 20
v3/krn/kbus/dict_topic_sub/dict_topic_sub_test.go → v4/krn/kbus/dict_topic_sub/dict_topic_sub_test.go

@@ -3,8 +3,8 @@ package dict_topic_sub
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_hand_sub_local"
 )
 
 type tester struct {
@@ -75,34 +75,24 @@ func (sf *tester) callGood1() {
 // повторное добавление обработчика
 func (sf *tester) addGood2() {
 	sf.t.Log("addGood2")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("addGood2(): panic=%v", _panic)
-		}
-	}()
-	sf.dict.Subscribe(sf.hand)
+	res := sf.dict.Subscribe(sf.hand)
+	res.Hassert("addGood2()")
 }
 
 // Правильное добавление обработчика подписки
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1()")
-	defer func() {
-		if _panic := recover(); _panic != nil {
-			sf.t.Fatalf("addGood1(): panic=%v", _panic)
-		}
-	}()
-	sf.dict.Subscribe(sf.hand)
+	res := sf.dict.Subscribe(sf.hand)
+	res.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.Subscribe(nil)
+	res := sf.dict.Subscribe(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("addBad1(): res.IsOk()==true")
+	}
 }
 
 // Нет топика

+ 22 - 15
v3/krn/kbus/kbus_base/kbus_base.go → v4/krn/kbus/kbus_base/kbus_base.go

@@ -5,14 +5,15 @@ import (
 	"fmt"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/dict_topic_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/dict_topic_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 const (
@@ -79,7 +80,7 @@ func (sf *KBusBase) Unsubscribe(handler IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывает обработчик на топик
-func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) Result[bool] {
+func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.log.Debug("KBusBase.Subscribe(): handler='%v'", handler.Name())
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.Subscribe():  handler='%v', bus already closed", handler.Name())
@@ -87,11 +88,11 @@ func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) Result[bool] {
 		return NewErr[bool](err)
 	}
 	sf.dictSub.Subscribe(handler)
-	return NewOk(true)
+	return NewRes(true)
 }
 
 // SendRequest -- отправляет запрос в шину данных
-func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) Result[[]byte] {
+func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	sf.log.Debug("KBusBase.SendRequest(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.SendRequest():  topic='%v', bus already closed", topic)
@@ -108,14 +109,20 @@ func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) Result[[]byte] {
 }
 
 // RegisterServe -- регистрирует обработчики входящих запросов
-func (sf *KBusBase) RegisterServe(handler IBusHandlerServe) {
+func (sf *KBusBase) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 	Hassert(handler != nil, "KBusBase.RegisterServe(): IBusHandlerSubscribe==nil")
 	sf.log.Debug("KBusBase.RegisterServe(): handler='%v'", handler.Name())
-	sf.dictServe.Register(handler)
+	res := sf.dictServe.Register(handler)
+	if res.IsErr() {
+		err := fmt.Errorf("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
+		sf.log.Err(err.Error())
+		return NewErr[bool](err)
+	}
+	return NewRes(true)
 }
 
 // Publish -- публикует сообщение в шину
-func (sf *KBusBase) Publish(topic ATopic, binMsg []byte) Result[bool] {
+func (sf *KBusBase) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	sf.log.Debug("KBusBase.Publish(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.Publish(): topic='%v',bus already closed", topic)
@@ -124,7 +131,7 @@ func (sf *KBusBase) Publish(topic ATopic, binMsg []byte) Result[bool] {
 	}
 	// Асинхронный запуск чтения
 	go sf.dictSub.Read(topic, binMsg)
-	return NewOk(true)
+	return NewRes(true)
 }
 
 // IsWork -- возвращает признак работы шины

+ 4 - 4
v3/krn/kbus/kbus_base/kbus_base_test.go → v4/krn/kbus/kbus_base/kbus_base_test.go

@@ -3,10 +3,10 @@ package kbus_base
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local"
+	"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"
 )
 
 type tester struct {

+ 49 - 28
v3/krn/kbus/kbus_http/client_bus_http/client_bus_http.go → v4/krn/kbus/kbus_http/client_bus_http/client_bus_http.go

@@ -6,23 +6,24 @@ import (
 	"fmt"
 	"io"
 	"net/http"
-	"os"
 	"strings"
 
 	"github.com/google/uuid"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // ClientBusHttp -- клиент HTTP-шины
@@ -36,22 +37,35 @@ type ClientBusHttp struct {
 }
 
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины
-func NewClientBusHttp(urlRemote string) IBusClient {
+func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
 	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("ClientBusHttp"))
 	log.Debug("NewClientBusHttp()")
-	Hassert(urlRemote != "", "NewClientBusHttp(): urlRemote is empty")
+	if urlRemote == "" {
+		err := fmt.Errorf("NewClientBusHttp(): urlRemote is empty")
+		return NewErr[IBusClient](err)
+	}
 	kCtx := kctx.GetKernelCtx()
-	urlLocal := os.Getenv("LOCAL_HTTP_URL")
-	Hassert(urlLocal != "", "NewClientBusHttp(): env LOCAL_HTTP_URL not set")
+	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())
+		return NewErr[IBusClient](err)
+	}
+	urlLocal := resLocal.Val()
+	resBus := kbus_http.GetKernelBusHttp()
+	if resBus.IsErr() {
+		err := fmt.Errorf("NewClientBusHttp(): in get bus, err=\n\t%w", resBus.Err())
+		return NewErr[IBusClient](err)
+	}
+	kBusHttp := resBus.Val()
 	sf := &ClientBusHttp{
 		ctx:       local_ctx.NewLocalCtx(kCtx.Ctx()),
 		log:       log,
-		bus:       kbus_http.GetKernelBusHttp(),
+		bus:       kBusHttp,
 		isWork:    safe_bool.NewSafeBool(),
 		urlRemote: strings.TrimSuffix(urlRemote, "/"),
-		urlLocal:  strings.TrimSuffix(urlLocal, "/"),
+		urlLocal:  strings.TrimSuffix(urlLocal.Get(), "/"),
 	}
-	return sf
+	return NewRes(IBusClient(sf))
 }
 
 // Unsubscribe -- отписывается от топика в дистанционной шине
@@ -86,7 +100,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине
-func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) Result[bool] {
+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)
 	req := &msg_sub.SubscribeReq{
@@ -119,7 +133,7 @@ func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) Result[bool] {
 }
 
 // SendRequest -- отправляет в дистанционную шину запрос
-func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) Result[[]byte] {
+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)
 	req := &msg_serve.ServeReq{
@@ -147,17 +161,24 @@ func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) Result[[]byte]
 		return NewErr[[]byte](err)
 	}
 	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
-	return NewOk(resp.BinResp_)
+	return NewRes(resp.BinResp_)
 }
 
 // RegisterServe -- регистрирует в локальной шине обработчик
-func (sf *ClientBusHttp) RegisterServe(handler IBusHandlerServe) {
-	Hassert(handler != nil, "ClientBusHttp.RegisterServe(): handler==nil")
-	sf.bus.RegisterServe(handler)
+func (sf *ClientBusHttp) RegisterServe(handler IBusHandlerServe) IResult[bool] {
+	if handler == nil {
+		return NewErr[bool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
+	}
+	res := sf.bus.RegisterServe(handler)
+	if res.IsErr() {
+		err := fmt.Errorf("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
+		return NewErr[bool](err)
+	}
+	return NewRes(true)
 }
 
 // Publish -- публикует сообщение в дистанционной шину
-func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) Result[bool] {
+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)
 	req := &msg_pub.PublishReq{
@@ -185,7 +206,7 @@ func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) Result[bool] {
 		return NewErr[bool](err)
 	}
 	Hassert(resp.Uuid_ == req.Uuid_, "ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
-	return NewOk(true)
+	return NewRes(true)
 }
 
 // Единый обработчик запросов

+ 18 - 18
v3/krn/kbus/kbus_http/client_bus_http/client_bus_http_test.go → v4/krn/kbus/kbus_http/client_bus_http/client_bus_http_test.go

@@ -6,15 +6,15 @@ import (
 	"strings"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_base"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_http"
+	"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"
 )
 
 const (
@@ -119,18 +119,17 @@ func (sf *tester) reg() {
 
 func (sf *tester) regGood1() {
 	sf.t.Log("regGood1")
-	sf.cl.RegisterServe(sf.handServ)
+	res := sf.cl.RegisterServe(sf.handServ)
+	res.Hassert("regGood1()")
 }
 
 // Нет серверного обработчика
 func (sf *tester) regBad1() {
 	sf.t.Log("regBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("regBad1(): panic==nil")
-		}
-	}()
-	sf.cl.RegisterServe(nil)
+	res := sf.cl.RegisterServe(nil)
+	if res.IsOk() {
+		sf.t.Fatalf("regBad1(): res.IsOk()")
+	}
 }
 
 // Правильная отписка
@@ -372,8 +371,9 @@ func (sf *tester) newGood1() {
 		}
 	}()
 	sf.ctx.Set("monolitName", "test_client_bus_http", "comment")
-	sf.cl = NewClientBusHttp(baseUrl).(*ClientBusHttp)
-	kServHttp := kserv_http.GetKernelServHttp()
+	sf.cl = NewClientBusHttp(baseUrl).Hassert("newGood1()").(*ClientBusHttp)
+	resServ := kserv_http.GetKernelServHttp()
+	kServHttp := resServ.Hassert("newGood1()")
 	kServHttp.Run()
 
 	if log := sf.cl.Log(); log == nil {

+ 21 - 15
v3/krn/kbus/kbus_http/kbus_http.go → v4/krn/kbus/kbus_http/kbus_http.go

@@ -8,16 +8,17 @@ import (
 
 	"github.com/gofiber/fiber/v2"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_base"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_http"
+	"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"
 )
 
 // kBusHttp -- шина данных поверх HTTP
@@ -32,11 +33,11 @@ var (
 )
 
 // GetKernelBusHttp -- возвращает шину HTTP
-func GetKernelBusHttp() IKernelBus {
+func GetKernelBusHttp() IResult[IKernelBus] {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return Bus_
+		return NewRes(IKernelBus(Bus_))
 	}
 	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kBusHttp"))
 	log.Debug("GetKernelBusHttp(): new")
@@ -45,15 +46,20 @@ func GetKernelBusHttp() IKernelBus {
 		KBusBase: kbus_base.GetKernelBusBase(),
 		log:      log,
 	}
-	servHttp := kserv_http.GetKernelServHttp()
-	fibApp := servHttp.Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	if resServ.IsErr() {
+		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resServ.Err())
+		return NewErr[IKernelBus](err)
+	}
+	serv := resServ.Val()
+	fibApp := serv.Fiber()
 	fibApp.Post("/bus/sub", sf.postSub)             // Топик подписки, IN
 	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")
 	Bus_ = sf
-	return Bus_
+	return NewRes(IKernelBus(Bus_))
 }
 
 // Входящий запрос HTTP на подписку

+ 30 - 20
v3/krn/kbus/kbus_http/kbus_http_test.go → v4/krn/kbus/kbus_http/kbus_http_test.go

@@ -8,16 +8,16 @@ import (
 	"strings"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_pub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_sub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_msg/msg_unsub"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kserv_http"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local"
+	"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"
 )
 
 type tester struct {
@@ -63,7 +63,8 @@ func (sf *tester) unsubGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("unsubGood2").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/unsub", body)
 	if err != nil {
 		sf.t.Fatalf("unsubGood2(): err=%v", err)
@@ -95,7 +96,8 @@ func (sf *tester) unsubBad3() {
 	req := "tra-la-la"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("unsubBad3").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/unsub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -181,7 +183,8 @@ func (sf *tester) pubGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("pubGood2").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/pub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -212,7 +215,8 @@ func (sf *tester) pubBad3() {
 	req := "tra-la-la"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("pubBad3").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/pub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -302,7 +306,8 @@ func (sf *tester) subGood2() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("subGood2").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/sub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -385,7 +390,8 @@ func (sf *tester) subBad1() {
 	req := "tra-ta-ta"
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("subBad1").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/sub", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -422,7 +428,8 @@ func (sf *tester) reqBad4() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("reqBad4").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/request", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -456,7 +463,8 @@ func (sf *tester) reqGood1() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("reqGood1").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/request", body)
 	hReq.Header.Add("Content-Type", "application/json")
 	if err != nil {
@@ -491,7 +499,8 @@ func (sf *tester) reqBad3() {
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("reqBad3").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/request", body)
 	if err != nil {
 		sf.t.Fatalf("reqBad3(): err=%v", err)
@@ -509,7 +518,8 @@ func (sf *tester) reqBad3() {
 func (sf *tester) reqBad2() {
 	sf.t.Log("reqBad1")
 	body := strings.NewReader("test_msg")
-	fibApp := kserv_http.GetKernelServHttp().Fiber()
+	resServ := kserv_http.GetKernelServHttp()
+	fibApp := resServ.Hassert("reqBad2").Fiber()
 	hReq, err := http.NewRequest("POST", "/bus/request", body)
 	if err != nil {
 		sf.t.Fatalf("reqBad1(): err=%v", err)

+ 2 - 2
v3/krn/kbus/kbus_local/client_bus_local/client_bus_local.go → v4/krn/kbus/kbus_local/client_bus_local/client_bus_local.go

@@ -2,8 +2,8 @@
 package client_bus_local
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_local"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_local"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // ClientBusLocal -- клиент локальной шины

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

@@ -3,7 +3,7 @@ package client_bus_local
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {

+ 2 - 2
v3/krn/kbus/kbus_local/kbus_local.go → v4/krn/kbus/kbus_local/kbus_local.go

@@ -2,8 +2,8 @@
 package kbus_local
 
 import (
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_base"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kbus/kbus_base"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // Локальная шина данных

+ 3 - 3
v3/krn/kbus/kbus_local/kbus_local_test.go → v4/krn/kbus/kbus_local/kbus_local_test.go

@@ -3,9 +3,9 @@ package kbus_local
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_serve"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_hand_sub_local"
+	. "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"
 )
 
 type tester struct {

+ 2 - 2
v3/krn/kbus/kbus_msg/msg_pub/msg_pub.go → v4/krn/kbus/kbus_msg/msg_pub/msg_pub.go

@@ -2,8 +2,8 @@
 package msg_pub
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 // PublishReq -- запрос на публикацию

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


+ 2 - 2
v3/krn/kbus/kbus_msg/msg_serve/msg_serve.go → v4/krn/kbus/kbus_msg/msg_serve/msg_serve.go

@@ -2,8 +2,8 @@
 package msg_serve
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 // ServeReq -- входящий запрос на обслуживание

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


+ 2 - 2
v3/krn/kbus/kbus_msg/msg_sub/msg_sub.go → v4/krn/kbus/kbus_msg/msg_sub/msg_sub.go

@@ -2,8 +2,8 @@
 package msg_sub
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 // SubscribeReq -- входящий запрос на подписку

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


+ 2 - 2
v3/krn/kbus/kbus_msg/msg_unsub/msg_unsub.go → v4/krn/kbus/kbus_msg/msg_unsub/msg_unsub.go

@@ -2,8 +2,8 @@
 package msg_unsub
 
 import (
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
 )
 
 // UnsubReq -- запрос на отписку от топика

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


+ 4 - 4
v3/krn/kctx/kctx.go → v4/krn/kctx/kctx.go

@@ -5,10 +5,10 @@ import (
 	"context"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx/kernel_keeper"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx/kwg"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // kCtx -- контекст ядра

+ 5 - 3
v3/krn/kctx/kctx_test.go → v4/krn/kctx/kctx_test.go

@@ -32,9 +32,11 @@ func (sf *tester) new() {
 	if ctx.Get("counter") == nil {
 		sf.t.Fatalf("new(): counter==nil")
 	}
-	counter := ctx.Get("counter").Val().(int)
-	if counter != 5 {
-		sf.t.Fatalf("new(): counter(%v)!=5", counter)
+	res := ctx.Get("counter")
+	ctxVal := res.Hassert("new()")
+	val := ctxVal.Val().(int)
+	if val != 5 {
+		sf.t.Fatalf("new(): counter(%v)!=5", val)
 	}
 	ctx.Del("counter")
 	ctx.Cancel()

+ 3 - 3
v3/krn/kctx/kernel_keeper/kernel_keeper.go → v4/krn/kctx/kernel_keeper/kernel_keeper.go

@@ -8,9 +8,9 @@ import (
 	"sync"
 	"syscall"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // kernelKeeper -- сторож системных сигналов

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

@@ -6,8 +6,8 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx/kwg"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx/kwg"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {

+ 8 - 7
v3/krn/kctx/kwg/kwg.go → v4/krn/kctx/kwg/kwg.go

@@ -8,11 +8,12 @@ import (
 	"fmt"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/kc/log_buf"
+	. "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/safe_bool"
 )
 
 // kernelWg -- именованный ожидатель потоков ядра
@@ -99,7 +100,7 @@ func (sf *kernelWg) Wait() {
 }
 
 // Add -- добавляет поток в ожидание
-func (sf *kernelWg) Add(name AStreamName) Result[bool] {
+func (sf *kernelWg) Add(name AStreamName) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Add(): stream='%v'", name)
@@ -111,7 +112,7 @@ func (sf *kernelWg) Add(name AStreamName) Result[bool] {
 	_, isOk := sf.dictStream[name]
 	Hassert(!isOk, "Add(): stream '%v' already exists", name)
 	sf.dictStream[name] = true
-	return NewOk(true)
+	return NewRes(true)
 }
 
 // Ожидает окончания работы ожидателя групп

+ 1 - 1
v3/krn/kctx/kwg/kwg_test.go → v4/krn/kctx/kwg/kwg_test.go

@@ -5,7 +5,7 @@ import (
 	"testing"
 	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {

+ 9 - 8
v3/krn/kint/kint.go → v4/krn/kint/kint.go

@@ -8,8 +8,9 @@ import (
 	"os"
 	"strconv"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/helpers"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // Целочисленная переменная ядра
@@ -51,13 +52,13 @@ func (sf *KernInt) Reset() {
 }
 
 // FromStr -- устанавливает значение из строки
-func (sf *KernInt) FromStr(strVal string) Result[int] {
+func (sf *KernInt) FromStr(strVal string) IResult[int] {
 	iVal, err := strconv.Atoi(strVal)
 	if err != nil {
 		return NewErr[int](fmt.Errorf("KInt.FromStr(): vak(%v) bad, err=\n\t%w", strVal, err))
 	}
 	sf.val = iVal
-	return NewOk(iVal)
+	return NewRes(iVal)
 }
 
 // ToStr -- возвращает как строку
@@ -66,7 +67,7 @@ func (sf *KernInt) ToStr() string {
 }
 
 // FromByte -- устанавливает значение из байтов (BigEndian, net order)
-func (sf *KernInt) FromByte(binData []byte) Result[int] {
+func (sf *KernInt) FromByte(binData []byte) IResult[int] {
 	lenBin := len(binData)
 	if lenBin < 8 {
 		return NewErr[int](fmt.Errorf("KInt.FromByte(): len(%v) bytes shorts", lenBin))
@@ -76,7 +77,7 @@ func (sf *KernInt) FromByte(binData []byte) Result[int] {
 	err := binary.Read(buf, binary.BigEndian, &signed)
 	Hassert(err == nil, "KernInt.FromByte(): in read []byte, err=\n\t%w", err)
 	sf.val = int(signed)
-	return NewOk(sf.val)
+	return NewRes(sf.val)
 }
 
 // ToByte -- возвращает как срез байт
@@ -102,12 +103,12 @@ func (sf *KernInt) ToBool() bool {
 }
 
 // Getenv -- устанавливает значение из окружения
-func (sf *KernInt) Getenv(env string) Result[int] {
+func (sf *KernInt) Getenv(env string) IResult[int] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
 		err := fmt.Errorf("safeInt.Getenv(): from env %v, err=\n\t%w", env, res.Err())
 		return NewErr[int](err)
 	}
-	return NewOk(sf.val)
+	return NewRes(sf.val)
 }

+ 0 - 0
v3/krn/kint/kint_test.go → v4/krn/kint/kint_test.go


+ 18 - 13
v3/krn/kmodule/kmodule.go → v4/krn/kmodule/kmodule.go

@@ -2,17 +2,19 @@
 package kmodule
 
 import (
+	"fmt"
 	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_int"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_string"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kbus/kbus_local"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule/mod_stat"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // kModule -- модуль на основе ядра
@@ -27,8 +29,11 @@ type kModule struct {
 }
 
 // NewKernelModule -- возвращает новый модуль на основе ядра
-func NewKernelModule(name AModuleName) IKernelModule {
-	Hassert(name != "", "NewKernelModule(): name is empty")
+func NewKernelModule(name AModuleName) IResult[IKernelModule] {
+	if name == "" {
+		err := fmt.Errorf("NewKernelModule(): name is empty")
+		return NewErr[IKernelModule](err)
+	}
 	kCtx := kctx.GetKernelCtx()
 	sf := &kModule{
 		kCtx:      kCtx,
@@ -40,7 +45,7 @@ func NewKernelModule(name AModuleName) IKernelModule {
 		stat:      mod_stat.NewModStat(name),
 	}
 	go sf.sigLive()
-	return sf
+	return NewRes(IKernelModule(sf))
 }
 
 // Stat -- возвращает статистику модуля
@@ -84,7 +89,7 @@ func (sf *kModule) sigLive() {
 	var (
 		topic  = sf.name + "_live"
 		iPhase = 0
-		res    Result[bool]
+		res    IResult[bool]
 	)
 	fnPhase := func() {
 		time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))

+ 4 - 4
v3/krn/kmodule/kmodule_test.go → v4/krn/kmodule/kmodule_test.go

@@ -5,9 +5,9 @@ import (
 	"testing"
 	"time"
 
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
+	"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"
 )
 
 type tester struct {
@@ -81,7 +81,7 @@ func (sf *tester) new() {
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	sf.mod = NewKernelModule("test_module")
+	sf.mod = NewKernelModule("test_module").Hassert("newGood1()")
 	if name := sf.mod.Name(); name != "test_module" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_module'", name)
 	}

+ 6 - 6
v3/krn/kmodule/mod_stat/mod_stat.go → v4/krn/kmodule/mod_stat/mod_stat.go

@@ -11,12 +11,12 @@ package mod_stat
 import (
 	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_int"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule/mod_stat/mod_stat_day"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule/mod_stat/mod_stat_sec"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // ModStat -- статистика модуля

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


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


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


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


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


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


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


+ 28 - 13
v3/krn/kmonolit/kmonolit.go → v4/krn/kmonolit/kmonolit.go

@@ -4,12 +4,13 @@ package kmonolit
 import (
 	"fmt"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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"
 )
 
 // kMonolit -- объект модульного монолита
@@ -29,12 +30,19 @@ var (
 )
 
 // GetMonolit -- возвращает монолит
-func GetMonolit(name string) IKernelMonolit {
+func GetMonolit(name string) IResult[*kMonolit] {
 	if mon != nil {
-		return mon
+		return NewRes(mon)
 	}
 	Hassert(name != "", "NewMonolit(): name is empty")
 	kCtx := kctx.GetKernelCtx()
+	res := kCtx.Get("isLocal")
+	if res.IsErr() {
+		err := fmt.Errorf("GetMonolit(): in get from kernCtx isLocal, err=\n\t%w", res.Err())
+		return NewErr[*kMonolit](err)
+	}
+	isLocalCtx := res.Val()
+	isLocal := isLocalCtx.Val().(bool)
 	sf := &kMonolit{
 		kCtx:    kCtx,
 		ctx:     local_ctx.NewLocalCtx(kCtx.Ctx()),
@@ -42,14 +50,15 @@ func GetMonolit(name string) IKernelMonolit {
 		dict:    map[AModuleName]IKernelModule{},
 		isWork:  safe_bool.NewSafeBool(),
 		isEnd:   safe_bool.NewSafeBool(),
-		isLocal: kCtx.Get("isLocal").Val().(bool),
+		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")
 	mon = sf
-	return sf
+	_ = IKernelMonolit(sf)
+	return NewRes(sf)
 }
 
 // Ctx -- возвращает контекст монолита
@@ -68,12 +77,17 @@ func (sf *kMonolit) Name() string {
 }
 
 // Add -- добавляет модуль в монолит
-func (sf *kMonolit) Add(module IKernelModule) {
+func (sf *kMonolit) Add(module IKernelModule) IResult[bool] {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
-	Hassert(module != nil, "kMonolit.Add(): module==nil")
+	if module == nil {
+		return NewErr[bool](fmt.Errorf("kMonolit.Add(): module==nil"))
+	}
 	_, isOk := sf.dict[module.Name()]
-	Hassert(!isOk, "kMonolit.Add(): module(%v) already exists", module.Name())
+	if isOk {
+		err := fmt.Errorf("kMonolit.Add(): module(%v) already exists", module.Name())
+		return NewErr[bool](err)
+	}
 	sf.dict[module.Name()] = module
 	sf.log.Debug("kMonolit.Add(): module='%v'", module.Name())
 	if sf.isWork.Get() {
@@ -83,6 +97,7 @@ func (sf *kMonolit) Add(module IKernelModule) {
 	key := fmt.Sprintf("module_%v", len(sf.dict))
 	moduleName := string(module.Name())
 	sf.ctx.Set(key, module, "kMonolit.Add(): module="+moduleName)
+	return NewRes(true)
 }
 
 // Run -- запускает монолит в работу

+ 11 - 9
v3/krn/kmonolit/kmonolit_test.go → v4/krn/kmonolit/kmonolit_test.go

@@ -4,12 +4,12 @@ import (
 	"os"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/kalias"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kmodule"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
+	"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"
 )
 
 const (
@@ -65,7 +65,7 @@ type mod struct {
 
 func newMod(name AModuleName) IKernelModule {
 	sf := &mod{
-		IKernelModule: kmodule.NewKernelModule(name),
+		IKernelModule: kmodule.NewKernelModule(name).Hassert("newMod()"),
 	}
 	return sf
 }
@@ -111,7 +111,8 @@ func (sf *tester) newGood1() {
 			break
 		}
 	}
-	sf.mon = GetMonolit("test_monolit")
+	resMon := GetMonolit("test_monolit")
+	sf.mon = resMon.Hassert("newGood1()")
 	isLocal := sf.mon.IsLocal()
 	if !isLocal {
 		sf.t.Fatalf("newGood1(): isLocal==false")
@@ -125,7 +126,8 @@ func (sf *tester) newGood1() {
 	if ctx := sf.mon.Ctx(); ctx == nil {
 		sf.t.Fatalf("newGood1(): ctx==nil")
 	}
-	sf.mon = GetMonolit("")
+	resMon = GetMonolit("")
+	sf.mon = resMon.Hassert("newGood1()")
 }
 
 // Нет признака локальности

+ 29 - 15
v3/krn/kserv_http/kserv_http.go → v4/krn/kserv_http/kserv_http.go

@@ -15,12 +15,13 @@ import (
 	"github.com/gofiber/fiber/v2/middleware/filesystem"
 	"github.com/gofiber/fiber/v2/middleware/monitor"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/local_ctx"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/log_buf"
-	"gitp78su.ipnodns.ru/svi/kern/v3/kc/safe_bool"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
+	"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/result"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
 const (
@@ -47,12 +48,12 @@ var (
 )
 
 // GetKernelServHttp -- возвращает  встроенный HTTP-сервер
-func GetKernelServHttp() IKernelServerHttp {
+func GetKernelServHttp() IResult[IKernelServerHttp] {
 	block.Lock()
 	defer block.Unlock()
 	if kernServHttp != nil {
 		kernServHttp.log.Debug("GetKernelServHttp()")
-		return kernServHttp
+		return NewRes(IKernelServerHttp(kernServHttp))
 	}
 	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttp"))
 	log.Debug("GetKernelServHttp(): first run")
@@ -60,7 +61,12 @@ func GetKernelServHttp() IKernelServerHttp {
 
 	strUrl := os.Getenv("LOCAL_HTTP_URL")
 	Hassert(strUrl != "", "GetKernelServHttp(): env LOCAL_HTTP_URL not set")
-	strMonolit := ctx.Get("monolitName").Val().(string)
+	res := ctx.Get("monolitName")
+	if res.IsErr() {
+		err := fmt.Errorf("GetKernelServHttp(): in get from kCtx monolit name, err=\n\t%w", res.Err())
+		return NewErr[IKernelServerHttp](err)
+	}
+	strMonolit := res.Val().Val().(string)
 	confFiber := fiber.Config{
 		ServerHeader:      strMonolit,
 		UnescapePath:      true,
@@ -88,13 +94,21 @@ func GetKernelServHttp() IKernelServerHttp {
 		Browse:     true,
 		MaxAge:     3600 * 24,
 	}))
-	sf.fiberApp.Get("/monitor", monitor.New(monitor.Config{Title: ctx.Get("monolitName").Val().(string)}))
-	res := sf.kCtx.Wg().Add(streamName)
-	res.Hassert("GetKernelServHttp(): in add stream %v", streamName)
-	ctx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
+	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")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetKernelServHttp(): in set fiber app, err=\n\t%w", resSet.Err())
+		return NewErr[IKernelServerHttp](err)
+	}
 	kernServHttp = sf
-	ctx.Set("kServHttp", kernServHttp, "kServHttp")
-	return kernServHttp
+	resSet = ctx.Set("kServHttp", kernServHttp, "kServHttp")
+	if resSet.IsErr() {
+		err := fmt.Errorf("GetKernelServHttp(): in set kernServHttp, err=\n\t%w", resSet.Err())
+		return NewErr[IKernelServerHttp](err)
+	}
+	return NewRes(IKernelServerHttp(kernServHttp))
 }
 
 // IsWork -- возвращает признак работы

+ 6 - 6
v3/krn/kserv_http/kserv_http_test.go → v4/krn/kserv_http/kserv_http_test.go

@@ -4,10 +4,10 @@ import (
 	"os"
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v3/kc/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v3/krn/kctx"
-	. "gitp78su.ipnodns.ru/svi/kern/v3/krn/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v3/mock/mock_env"
+	"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"
 )
 
 const (
@@ -60,7 +60,7 @@ func (sf *tester) new() {
 // Повторный запуск сервера на том же порту
 func (sf *tester) newBad3() {
 	sf.t.Log("newBad3()")
-	serv := GetKernelServHttp()
+	serv := GetKernelServHttp().Hassert("newBad1")
 	go serv.Run()
 	count := 0
 	for count < 20 {
@@ -80,7 +80,7 @@ func (sf *tester) newGood1() {
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	os.Setenv("LOCAL_HTTP_URL", baseUrl)
 	sf.ctx.Set("monolitName", "test_monolit", "comment")
-	serv := GetKernelServHttp().(*kServHttp)
+	serv := GetKernelServHttp().Hassert("newGood1()").(*kServHttp)
 	if serv != kernServHttp {
 		sf.t.Fatalf("newGood1(): bad IKernelServHttp")
 	}

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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


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


部分文件因文件數量過多而無法顯示