SVI 2 mesiacov pred
rodič
commit
b4e19574d7
63 zmenil súbory, kde vykonal 789 pridanie a 735 odobranie
  1. 2 1
      v4/.golangci.yml
  2. 5 0
      v4/Taskfile.yml
  3. 1 0
      v4/cmd/demo/main_test.go
  4. 2 2
      v4/kern.go
  5. 112 102
      v4/kern_test.go
  6. 2 1
      v4/lev0/helpers/helpers.go
  7. 1 1
      v4/lev0/helpers/helpers_test.go
  8. 68 50
      v4/lev1/kint/kint_test.go
  9. 3 2
      v4/lev1/log_buf/log_buf.go
  10. 5 9
      v4/lev1/mock_env/mock_env.go
  11. 8 5
      v4/lev1/option/option_test.go
  12. 9 6
      v4/lev1/result/result_test.go
  13. 6 6
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go
  14. 5 5
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go
  15. 8 8
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go
  16. 8 8
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go
  17. 6 6
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go
  18. 8 8
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go
  19. 11 11
      v4/lev2/kbus_base/kbus_base.go
  20. 14 14
      v4/lev2/kbus_http/client_bus_http/client_bus_http.go
  21. 29 25
      v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go
  22. 11 11
      v4/lev2/kbus_http/kbus_http.go
  23. 36 31
      v4/lev2/kbus_http/kbus_http_test.go
  24. 1 1
      v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go
  25. 3 3
      v4/lev2/kbus_local/kbus_local.go
  26. 1 1
      v4/lev2/kbus_local/kbus_local_test.go
  27. 8 8
      v4/lev2/kctx/kctx.go
  28. 1 1
      v4/lev2/kctx/kctx_test.go
  29. 5 5
      v4/lev2/kernel_keeper/kernel_keeper.go
  30. 2 2
      v4/lev2/kernel_keeper/kernel_keeper_test.go
  31. 11 11
      v4/lev2/kmodule/kmodule.go
  32. 5 5
      v4/lev2/kmodule/kmodule_test.go
  33. 7 7
      v4/lev2/kmodule/mod_stat/mod_stat.go
  34. 72 68
      v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go
  35. 2 2
      v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go
  36. 54 53
      v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go
  37. 2 2
      v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go
  38. 56 56
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  39. 3 3
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go
  40. 3 3
      v4/lev2/kmodule/mod_stat/mod_stat_test.go
  41. 11 11
      v4/lev2/kmonolit/kmonolit.go
  42. 3 3
      v4/lev2/kmonolit/kmonolit_test.go
  43. 29 25
      v4/lev2/kserv_http/kserv_http.go
  44. 5 5
      v4/lev2/kserv_http/kserv_http_test.go
  45. 4 4
      v4/lev2/kserv_http_std/kserv_http_std.go
  46. 12 12
      v4/lev2/kstore_kv/kstore_kv.go
  47. 7 7
      v4/lev2/kstore_kv/kstore_kv_test.go
  48. 7 7
      v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go
  49. 4 4
      v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec_test.go
  50. 4 4
      v4/lev2/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  51. 2 2
      v4/lev2/kstore_kv_std/kv_bucket_ram/kv_bucket_ram.go
  52. 5 5
      v4/lev2/kstore_kv_std/rec_kv/rec_kv.go
  53. 3 3
      v4/lev2/kstore_kv_std/rec_kv/rec_kv_test.go
  54. 12 10
      v4/lev2/kstore_kv_std/rec_meta/rec_meta.go
  55. 1 1
      v4/lev2/kwg/kwg.go
  56. 6 6
      v4/lev2/mock_hand_serve/mock_hand_serve.go
  57. 6 6
      v4/lev2/mock_hand_sub_local/mock_hand_sub.go
  58. 6 1
      v4/lev2/wui/whx/whx_test.go
  59. 1 0
      v4/lev3/mod_serv_http/http_api/http_api_test.go
  60. 55 70
      v4/lev3/mod_serv_http/page_module/page_module_test.go
  61. 4 0
      v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go
  62. 1 1
      v4/lev3/mod_wui/mod_wui.go
  63. 5 5
      v4/lev3/mod_wui/mod_wui_test.go

+ 2 - 1
v4/.golangci.yml

@@ -17,7 +17,7 @@ linters:
    - godox
    - lll
    - maintidx
-   # - mnd
+   #- mnd
    - nestif
    - nilerr
    - nonamedreturns
@@ -28,6 +28,7 @@ linters:
    - unparam
    - usestdlibvars
    - wrapcheck
+   #- wsl
 
 issues:
   max-issues-per-linter: 0

+ 5 - 0
v4/Taskfile.yml

@@ -60,3 +60,8 @@ tasks:
     cmds:
       - clear
       - go fmt ./...
+  lazy:
+    desc: "Запуск lazygit (с обновлением)"
+    cmds:
+      - go install github.com/jesseduffield/lazygit@latest
+      - lazygit

+ 1 - 0
v4/cmd/demo/main_test.go

@@ -10,6 +10,7 @@ import (
 )
 
 func TestMain(t *testing.T) {
+	t.Log("TestMain")
 	_ = mock_env.MakeEnv()
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	os.Setenv("LOCAL_HTTP_URL", "http://localhost:18332/")

+ 2 - 2
v4/kern.go

@@ -176,7 +176,7 @@ func NewClientBusLocal() IResult[IBusClient] {
 		return NewErr[IBusClient](err)
 	}
 	client := res.Val()
-	return NewRes(IBusClient(client))
+	return NewRes(client)
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP
@@ -261,7 +261,7 @@ func NewLocalCtx(ctx context.Context) IResult[ILocalCtx] {
 		return NewErr[ILocalCtx](err)
 	}
 	ctx_ := resCtx.Val()
-	return NewRes(ILocalCtx(ctx_))
+	return NewRes(ctx_)
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку

+ 112 - 102
v4/kern_test.go

@@ -49,109 +49,13 @@ func (sf *tester) newModBad() {
 func (sf *tester) new() {
 	sf.t.Log("new")
 	ctx := GetKernelCtx().Hassert("new()")
-	{
-		if ctx == nil {
-			sf.t.Fatalf("new(): IKernelCtx==nil")
-		}
-		store := GetKernelStoreKv().Hassert("new()")
-		res := store.Delete("test_builders")
-		if res.IsErr() {
-			sf.t.Fatalf("new(): get empty key, store, err=%v", res.Err())
-		}
-		safeBool := NewSafeBool()
-		if safeBool == nil {
-			sf.t.Fatalf("new(): ISafeBool==nil")
-		}
-
-		kernBus := GetKernelBusLocal()
-		if kernBus == nil {
-			sf.t.Fatalf("new(): (local) IKernelBus==nil")
-		}
-
-		kernBusHttp := GetKernelBusHttp()
-		if kernBusHttp == nil {
-			sf.t.Fatalf("new(): (http) IKernelBus==nil")
-		}
-
-	}
-	{
-		monLocal := GetMonolitLocal("mon_local")
-		if monLocal == nil {
-			sf.t.Fatalf("new(): (local) IKernelMonolit==nil")
-		}
-
-		monHttp := GetMonolitHttp("mon_http")
-		if monHttp == nil {
-			sf.t.Fatalf("new(): (http) IKernelMonolit==nil")
-		}
-
-		mod := NewKernelModule("test_mod")
-		if mod == nil {
-			sf.t.Fatalf("new(): IKernelModule==nil")
-		}
-
-		clientLocal := NewClientBusLocal()
-		if clientLocal == nil {
-			sf.t.Fatalf("new(): (local) IBusClient==nil")
-		}
-		clientHttp := NewClientBusHttp("test_url")
-		if clientHttp == nil {
-			sf.t.Fatalf("new(): (http) IBusClient==nil")
-		}
-
-	}
-	{
-		modServHttp := GetModuleServHttp()
-		if modServHttp == nil {
-			sf.t.Fatalf("new(): modServHttp==nil")
-		}
-
-		modKernelCtx := GetModuleKernelCtx()
-		if modKernelCtx == nil {
-			sf.t.Fatalf("new(): modKernelCtx==nil")
-		}
-		modKernelKeeper := GetModuleKernelKeeper()
-		if modKernelKeeper == nil {
-			sf.t.Fatalf("new(): modKernelKeeper==nil")
-		}
-		modWui := GetModuleWui()
-		if modWui == nil {
-			sf.t.Fatalf("new(): modWui==nil")
-		}
-
-		logBuf := NewLogBuf(log_buf.OptIsTerm(true))
-		if logBuf == nil {
-			sf.t.Fatalf("new(): ILogBuf==nil")
-		}
-		boolReact := NewSafeBoolReact()
-		if boolReact == nil {
-			sf.t.Fatalf("new(): ISafeBoolReact==nil")
-		}
-		safeInt := NewSafeInt(12)
-		if safeInt == nil {
-			sf.t.Fatalf("new(): ISafeInt==nil")
-		}
-		lCtx := NewLocalCtx(ctx.Ctx())
-		if lCtx == nil {
-			sf.t.Fatalf("new(): ILocalCtx==nil")
-		}
-	}
-	{
-		safeStr := NewSafeString()
-		if safeStr == nil {
-			sf.t.Fatalf("new(): ISafeStr==nil")
-		}
-
-		fnHassert := Hassert()
-		if fnHassert == nil {
-			sf.t.Fatalf("new(): Hassert==nil")
-		}
-
-		fnAssert := Assert()
-		if fnAssert == nil {
-			sf.t.Fatalf("new(): Assert==nil")
-		}
+	if ctx == nil {
+		sf.t.Fatalf("new(): IKernelCtx==nil")
 	}
+	sf.new0()
+	sf.new1()
+	sf.new2()
+	sf.new3()
 
 	_ = MakeOk("test ok")
 	_ = MakeErr[bool](fmt.Errorf("test err"))
@@ -170,3 +74,109 @@ func (sf *tester) new() {
 	ctx.Cancel()
 	ctx.Wg().Wait()
 }
+
+func (sf *tester) new3() {
+	safeStr := NewSafeString()
+	if safeStr == nil {
+		sf.t.Fatalf("new(): ISafeStr==nil")
+	}
+
+	fnHassert := Hassert()
+	if fnHassert == nil {
+		sf.t.Fatalf("new(): Hassert==nil")
+	}
+
+	fnAssert := Assert()
+	if fnAssert == nil {
+		sf.t.Fatalf("new(): Assert==nil")
+	}
+}
+
+func (sf *tester) new2() {
+	ctx := GetKernelCtx().Hassert("new()")
+	if ctx == nil {
+		sf.t.Fatalf("new(): IKernelCtx==nil")
+	}
+	modServHttp := GetModuleServHttp()
+	if modServHttp == nil {
+		sf.t.Fatalf("new2(): modServHttp==nil")
+	}
+
+	modKernelCtx := GetModuleKernelCtx()
+	if modKernelCtx == nil {
+		sf.t.Fatalf("new2(): modKernelCtx==nil")
+	}
+	modKernelKeeper := GetModuleKernelKeeper()
+	if modKernelKeeper == nil {
+		sf.t.Fatalf("new2(): modKernelKeeper==nil")
+	}
+	modWui := GetModuleWui()
+	if modWui == nil {
+		sf.t.Fatalf("new2(): modWui==nil")
+	}
+
+	logBuf := NewLogBuf(log_buf.OptIsTerm(true))
+	if logBuf == nil {
+		sf.t.Fatalf("new2(): ILogBuf==nil")
+	}
+	boolReact := NewSafeBoolReact()
+	if boolReact == nil {
+		sf.t.Fatalf("new2(): ISafeBoolReact==nil")
+	}
+	safeInt := NewSafeInt(12)
+	if safeInt == nil {
+		sf.t.Fatalf("new2(): ISafeInt==nil")
+	}
+	lCtx := NewLocalCtx(ctx.Ctx())
+	if lCtx == nil {
+		sf.t.Fatalf("new2(): ILocalCtx==nil")
+	}
+}
+
+func (sf *tester) new1() {
+	monLocal := GetMonolitLocal("mon_local")
+	if monLocal == nil {
+		sf.t.Fatalf("new1(): (local) IKernelMonolit==nil")
+	}
+
+	monHttp := GetMonolitHttp("mon_http")
+	if monHttp == nil {
+		sf.t.Fatalf("new1(): (http) IKernelMonolit==nil")
+	}
+
+	mod := NewKernelModule("test_mod")
+	if mod == nil {
+		sf.t.Fatalf("new1(): IKernelModule==nil")
+	}
+
+	clientLocal := NewClientBusLocal()
+	if clientLocal == nil {
+		sf.t.Fatalf("new1(): (local) IBusClient==nil")
+	}
+	clientHttp := NewClientBusHttp("test_url")
+	if clientHttp == nil {
+		sf.t.Fatalf("new1(): (http) IBusClient==nil")
+	}
+}
+
+func (sf *tester) new0() {
+	store := GetKernelStoreKv().Hassert("new()")
+	res := store.Delete("test_builders")
+	if res.IsErr() {
+		sf.t.Fatalf("new0(): get empty key, store, err=%v", res.Err())
+	}
+	safeBool := NewSafeBool()
+	if safeBool == nil {
+		sf.t.Fatalf("new0(): ISafeBool==nil")
+	}
+
+	kernBus := GetKernelBusLocal()
+	if kernBus == nil {
+		sf.t.Fatalf("new0(): (local) IKernelBus==nil")
+	}
+
+	kernBusHttp := GetKernelBusHttp()
+	if kernBusHttp == nil {
+		sf.t.Fatalf("new0(): (http) IKernelBus==nil")
+	}
+}

+ 2 - 1
v4/lev0/helpers/helpers.go

@@ -5,6 +5,7 @@ package helpers
 
 import (
 	"fmt"
+	"log"
 	"os"
 	"time"
 
@@ -30,7 +31,7 @@ func Assert(isCond bool, msgFormat string, args ...any) {
 	if IsStageLocal {
 		panic(msg)
 	}
-	fmt.Print(msg)
+	log.Print(msg)
 }
 
 // FnHassert -- проверяет с жёстким падением условие

+ 1 - 1
v4/lev0/helpers/helpers_test.go

@@ -122,7 +122,7 @@ func (sf *tester) hassertLocal() {
 	Hassert(false, "tra-la-la")
 }
 
-//========================================================================
+// ========================================================================
 
 // Проверка мягкого ассерта
 func (sf *tester) assert() {

+ 68 - 50
v4/lev1/kint/kint_test.go

@@ -3,6 +3,8 @@ package kint
 import (
 	"os"
 	"testing"
+
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
@@ -23,49 +25,51 @@ func (sf *tester) new() {
 	if val == nil {
 		sf.t.Fatalf("new(): val==nil")
 	}
-	val0 := val.Get()
-	if val0 != 12 {
-		sf.t.Fatalf("new(): val0=%v !12", val0)
-	}
-	val.Set(14)
-	if val.Get() != 14 {
-		sf.t.Fatalf("new(): val=%v !14", val.Get())
-	}
-	val.Reset()
-	if val.Get() != 0 {
-		sf.t.Fatalf("new(): val=%v !0", val.Get())
-	}
-	resStr := val.FromStr("26")
-	if val.Get() != 26 {
-		sf.t.Fatalf("new(): val=%v !26", val.Get())
+
+	sf.new0(val)
+	sf.new1(val)
+	sf.new2(val)
+	sf.new3(val)
+}
+
+func (sf *tester) new3(val Int) {
+	_ = os.Unsetenv("TEST_VAL")
+	_ = os.Setenv("TEST_VAL", "57")
+	resInt := val.Getenv("TEST_VAL")
+	resInt.Hassert("get env")
+	if resInt.Val() != 57 {
+		sf.t.Fatalf("new(): isVal==true")
 	}
-	resStr.Hassert("bad convert")
 
-	resStr = val.FromStr("k26")
-	if val.Get() != 26 {
-		sf.t.Fatalf("new(): val=%v !26", val.Get())
+	_ = os.Unsetenv("TEST_VAL")
+	_ = os.Setenv("TEST_VAL", "u578")
+	resInt = val.Getenv("TEST_VAL")
+	if resInt.IsOk() {
+		sf.t.Fatalf("new(): ok==true")
 	}
-	if !resStr.IsErr() {
-		sf.t.Fatalf("new(): err==nil")
+	if val.Get() != 57 {
+		sf.t.Fatalf("new(): val=%v !57", val.Get())
 	}
-	strVal := val.ToStr()
-	if strVal != "26" {
-		sf.t.Fatalf("new(): val=%v !26", strVal)
+
+	val.Inc()
+	if val.Get() != 58 {
+		sf.t.Fatalf("new(): val=%v !58", val.Get())
 	}
-	binData := val.ToByte()
-	if len(binData) != 8 {
-		sf.t.Fatalf("new(): len=%v !8", len(binData))
+	val.Dec()
+	if val.Get() != 57 {
+		sf.t.Fatalf("new(): val=%v !57", val.Get())
 	}
-	resInt := val.FromByte(binData)
-	resInt.Hassert("FromByte")
+}
 
+func (sf *tester) new2(val Int) {
+	binData := val.ToByte()
 	binData = binData[:2]
 	res := val.FromByte(binData)
 	if res.IsOk() {
 		sf.t.Fatalf("new(): err==nil")
 	}
 
-	resInt = val.FromByte([]byte("travolta"))
+	resInt := val.FromByte([]byte("travolta"))
 	if resInt.IsErr() {
 		sf.t.Fatalf("new(): err==nil")
 	}
@@ -84,31 +88,45 @@ func (sf *tester) new() {
 	if !isBool {
 		sf.t.Fatalf("new(): isBool==false")
 	}
+}
 
-	_ = os.Unsetenv("TEST_VAL")
-	_ = os.Setenv("TEST_VAL", "57")
-	resInt = val.Getenv("TEST_VAL")
-	resInt.Hassert("get env")
-	if resInt.Val() != 57 {
-		sf.t.Fatalf("new(): isVal==true")
+func (sf *tester) new1(val Int) {
+	resStr := val.FromStr("k26")
+	if val.Get() != 26 {
+		sf.t.Fatalf("new(): val=%v !26", val.Get())
 	}
-
-	_ = os.Unsetenv("TEST_VAL")
-	_ = os.Setenv("TEST_VAL", "u578")
-	resInt = val.Getenv("TEST_VAL")
-	if resInt.IsOk() {
-		sf.t.Fatalf("new(): ok==true")
+	if !resStr.IsErr() {
+		sf.t.Fatalf("new(): err==nil")
 	}
-	if val.Get() != 57 {
-		sf.t.Fatalf("new(): val=%v !57", val.Get())
+	strVal := val.ToStr()
+	if strVal != "26" {
+		sf.t.Fatalf("new(): val=%v !26", strVal)
+	}
+	binData := val.ToByte()
+	if len(binData) != 8 {
+		sf.t.Fatalf("new(): len=%v !8", len(binData))
 	}
+	resInt := val.FromByte(binData)
+	resInt.Hassert("FromByte")
 
-	val.Inc()
-	if val.Get() != 58 {
-		sf.t.Fatalf("new(): val=%v !58", val.Get())
+}
+
+func (sf *tester) new0(val Int) {
+	val0 := val.Get()
+	if val0 != 12 {
+		sf.t.Fatalf("new(): val0=%v !12", val0)
 	}
-	val.Dec()
-	if val.Get() != 57 {
-		sf.t.Fatalf("new(): val=%v !57", val.Get())
+	val.Set(14)
+	if val.Get() != 14 {
+		sf.t.Fatalf("new(): val=%v !14", val.Get())
 	}
+	val.Reset()
+	if val.Get() != 0 {
+		sf.t.Fatalf("new(): val=%v !0", val.Get())
+	}
+	resStr := val.FromStr("26")
+	if val.Get() != 26 {
+		sf.t.Fatalf("new(): val=%v !26", val.Get())
+	}
+	resStr.Hassert("bad convert")
 }

+ 3 - 2
v4/lev1/log_buf/log_buf.go

@@ -3,6 +3,7 @@ package log_buf
 
 import (
 	"fmt"
+	"log"
 	"sync"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -187,10 +188,10 @@ func (sf *LogBuf) printTerm(msg ILogMsg) {
 	if helpers.IsStageProd {
 		switch level {
 		case "ERRO", "WARN":
-			fmt.Printf("%v   %v\n", level, msg.String())
+			log.Printf("%v   %v\n", level, msg.String())
 		default:
 			return
 		}
 	}
-	fmt.Printf("%v\n", msg.String())
+	log.Printf("%v\n", msg.String())
 }

+ 5 - 9
v4/lev1/mock_env/mock_env.go

@@ -28,15 +28,14 @@ func MakeEnv() *MockEnv {
 	}
 	sf.setPath()
 	sf.readEnv()
-	err := sf.parseEnv()
-	Hassert(err == nil, "MakeEnv(): parseEnv, err=\n\t%v", err)
-	err = sf.SetAll()
+	sf.parseEnv()
+	err := sf.SetAll()
 	Hassert(err == nil, "MakeEnv(): SetAll, err=\n\t%v", err)
 	return sf
 }
 
 // Парсит полученный текст .env для установки переменных окружения
-func (sf *MockEnv) parseEnv() error {
+func (sf *MockEnv) parseEnv() {
 	lstStr := strings.Split(sf.strEnv, "\n")
 	for _, val := range lstStr {
 		pair := strings.TrimSuffix(val, "\r")
@@ -46,14 +45,12 @@ func (sf *MockEnv) parseEnv() error {
 		if strings.HasPrefix(val, "#") {
 			continue
 		}
-		err := sf.parseEnvStr(pair)
-		Hassert(err == nil, "MockEnv.parseEnv(): in parse str(%v), err=\n\t%w", pair, err)
+		sf.parseEnvStr(pair)
 	}
-	return nil
 }
 
 // Парсит строку окружения
-func (sf *MockEnv) parseEnvStr(pair string) error {
+func (sf *MockEnv) parseEnvStr(pair string) {
 	lstPair := strings.Split(pair, "=")
 	Hassert(len(lstPair) >= 2, "MockEnv.parseEnvStr(): pair(%v) not have =", pair)
 	key := lstPair[0]
@@ -68,7 +65,6 @@ func (sf *MockEnv) parseEnvStr(pair string) error {
 
 	Hassert(val != "", "MockEnv.parseEnvStr(): in pair(%v) val is empty", pair)
 	sf.dictEnv[key] = val
-	return nil
 }
 
 // Читает файл переменных окружения

+ 8 - 5
v4/lev1/option/option_test.go

@@ -84,6 +84,10 @@ func (sf *testerOption) unwrapErr(res IOption[string]) {
 	_ = res.Val()
 }
 
+const (
+	str = "test val"
+)
+
 func (sf *testerOption) createSomeGood2() {
 	sf.t.Log("createSomeGood2")
 	defer func() {
@@ -91,7 +95,6 @@ func (sf *testerOption) createSomeGood2() {
 			sf.t.Fatalf("createSomeGood2(): panic=%v", _panic)
 		}
 	}()
-	str := "test val"
 	res := NewOpt(str)
 	if !res.IsVal() {
 		sf.t.Fatalf("createSomeGood1(): not ok")
@@ -99,16 +102,16 @@ func (sf *testerOption) createSomeGood2() {
 	if res.IsNone() {
 		sf.t.Fatalf("createSomeGood1(): is err")
 	}
-	if val := res.Val(); val != "test val" {
+	if val := res.Val(); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "test val" {
+	if val := res.ValOr("test1"); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "test val" {
+	if val := res.ValOr("test1"); val != "str" {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
-	if val := res.ValOrFn(sf.fnWrap); val != "test val" {
+	if val := res.ValOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createSomeGood1(): val bad")
 	}
 	res.Hassert("test")

+ 9 - 6
v4/lev1/result/result_test.go

@@ -152,6 +152,10 @@ func (sf *tester) createErrBad1() {
 	_ = NewErr[bool](err)
 }
 
+const (
+	str = "test val"
+)
+
 func (sf *tester) createOkGood2() {
 	sf.t.Log("createOkGood2")
 	defer func() {
@@ -159,7 +163,6 @@ func (sf *tester) createOkGood2() {
 			sf.t.Fatalf("createOkGood2(): panic=%v", _panic)
 		}
 	}()
-	str := "test val"
 	res := NewRes(str)
 	if !res.IsOk() {
 		sf.t.Fatalf("createOkGood1(): not ok")
@@ -167,21 +170,21 @@ func (sf *tester) createOkGood2() {
 	if res.IsErr() {
 		sf.t.Fatalf("createOkGood1(): is err")
 	}
-	if val := res.Val(); val != "test val" {
+	if val := res.Val(); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "test val" {
+	if val := res.ValOr("test1"); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOr("test1"); val != "test val" {
+	if val := res.ValOr("test1"); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	if val := res.ValOrFn(sf.fnWrap); val != "test val" {
+	if val := res.ValOrFn(sf.fnWrap); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
 	res0 := NewErr[any](fmt.Errorf("test_error"))
 	if err := res0.Err(); err == nil {
-		sf.t.Fatalf("createOkGood1(): err ==nil")
+		sf.t.Fatalf("createOkGood1(): err==nil")
 	}
 	res.Hassert("test")
 	res.Assert("test")

+ 6 - 6
v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go

@@ -1,4 +1,4 @@
-// package dict_sub_hook -- словарь потребителей топика по подписке
+// package dict_sub_hook -- словарь потребителей топика по подписке.
 package dict_sub_hook
 
 import (
@@ -11,14 +11,14 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-// dictSubHook -- словарь потребителей топика по подписке
+// dictSubHook -- словарь потребителей топика по подписке.
 type dictSubHook struct {
 	ctx   IKernelCtx
 	dict  map[AHandlerName]bool // В качестве ключа -- URL веб-хука
 	block sync.RWMutex
 }
 
-// NewDictSubHook -- возвращает новый словарь веб-хуков одного топика
+// NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
 func NewDictSubHook() IResult[IDictSubHook] {
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
@@ -32,7 +32,7 @@ func NewDictSubHook() IResult[IDictSubHook] {
 	return NewRes(IDictSubHook(sf))
 }
 
-// Unsubscribe -- удаляет из словаря подписки обработчик
+// Unsubscribe -- удаляет из словаря подписки обработчик.
 func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
@@ -45,7 +45,7 @@ func (sf *dictSubHook) Unsubscribe(handler IBusHandlerSubscribe) {
 	sf.ctx.Del(string(handlerName))
 }
 
-// Subscribe -- добавляет в словарь подписки новый обработчик
+// Subscribe -- добавляет в словарь подписки новый обработчик.
 func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
@@ -63,7 +63,7 @@ func (sf *dictSubHook) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	return NewRes(true)
 }
 
-// Read -- вызывает все обработчики словаря подписок
+// Read -- вызывает все обработчики словаря подписок.
 func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()

+ 5 - 5
v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -25,19 +25,19 @@ func TestDictSubWebHook(t *testing.T) {
 	sf.unsub()
 }
 
-// Отписка обработчика от топика
+// Отписка обработчика от топика.
 func (sf *tester) unsub() {
 	sf.t.Log("unsub")
 	sf.dict.Unsubscribe(sf.handSub)
 }
 
-// Чтение входящего сообщения по подписке
+// Чтение входящего сообщения по подписке.
 func (sf *tester) read() {
 	sf.t.Log("read")
 	sf.dict.Read([]byte("test_msg"))
 }
 
-// Добавляет хуки в словарь
+// Добавляет хуки в словарь.
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.addBad1()
@@ -54,7 +54,7 @@ func (sf *tester) addGood1() {
 	}
 }
 
-// нет веб-хука для добавления
+// нет веб-хука для добавления.
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1")
 	res := sf.dict.Subscribe(nil)
@@ -63,7 +63,7 @@ func (sf *tester) addBad1() {
 	}
 }
 
-// Создание словаря
+// Создание словаря.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.dict = NewDictSubHook().Hassert("new()").(*dictSubHook)

+ 8 - 8
v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go

@@ -1,4 +1,4 @@
-// package dict_topic_serve -- словарь топиков обработчиков запросов
+// package dict_topic_serve -- словарь топиков обработчиков запросов.
 package dict_topic_serve
 
 import (
@@ -13,16 +13,16 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-// dictServe -- потокобезопасный словарь обработчиков запросов
+// dictServe -- потокобезопасный словарь обработчиков запросов.
 //
-// Допускается только один обработчик запросов на один топик
+// Допускается только один обработчик запросов на один топик.
 type dictServe struct {
 	sync.RWMutex
 	kCtx      IKernelCtx
 	dictServe map[ATopic]IBusHandlerServe
 }
 
-// NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов
+// NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов.
 func NewDictServe() IResult[*dictServe] {
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
@@ -36,7 +36,7 @@ func NewDictServe() IResult[*dictServe] {
 	return NewRes(sf)
 }
 
-// Register -- регистрирует обработчик запросов
+// Register -- регистрирует обработчик запросов.
 func (sf *dictServe) Register(handler IBusHandlerServe) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
@@ -54,7 +54,7 @@ func (sf *dictServe) Register(handler IBusHandlerServe) IResult[bool] {
 	return NewRes(true)
 }
 
-// Unregister -- удаляет обработчик запросов из словаря
+// Unregister -- удаляет обработчик запросов из словаря.
 func (sf *dictServe) Unregister(handler IBusHandlerServe) {
 	sf.Lock()
 	defer sf.Unlock()
@@ -65,7 +65,7 @@ func (sf *dictServe) Unregister(handler IBusHandlerServe) {
 	delete(sf.dictServe, handler.Topic())
 }
 
-// SendRequest -- вызывает обработчик при поступлении запроса
+// SendRequest -- вызывает обработчик при поступлении запроса.
 func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -96,7 +96,7 @@ func (sf *dictServe) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 
 var TimeoutDefault = 15000
 
-// регистрирует обработчик запросов
+// регистрирует обработчик запросов.
 func (sf *dictServe) register(handler IBusHandlerServe) bool {
 	topic := handler.Topic()
 	_, isOk := sf.dictServe[topic]

+ 8 - 8
v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -30,7 +30,7 @@ func TestDictSub(t *testing.T) {
 	sf.callBad3()
 }
 
-// Работа ядра завершена
+// Работа ядра завершена.
 func (sf *tester) callBad3() {
 	sf.t.Log("callBad3")
 	ctx := kctx.GetKernelCtx().Hassert("callBad3()")
@@ -54,7 +54,7 @@ func (sf *tester) delGood2() {
 	sf.dict.Unregister(sf.hand)
 }
 
-// Удаляет, чего нет
+// Удаляет, чего нет.
 func (sf *tester) delBad1() {
 	sf.t.Log("delBad1()")
 	sf.dict.Unregister(nil)
@@ -72,7 +72,7 @@ func (sf *tester) sendGood1() {
 	}
 }
 
-// Обработчик вернул ошибку
+// Обработчик вернул ошибку.
 func (sf *tester) sendBad2() {
 	sf.t.Log("sendBad2")
 	sf.hand.IsBad_.Set()
@@ -83,7 +83,7 @@ func (sf *tester) sendBad2() {
 	sf.hand.IsBad_.Reset()
 }
 
-// повторное добавление обработчика
+// повторное добавление обработчика.
 func (sf *tester) addBad2() {
 	sf.t.Log("addBad2")
 	res := sf.dict.Register(sf.hand)
@@ -92,13 +92,13 @@ func (sf *tester) addBad2() {
 	}
 }
 
-// Правильное добавление обработчика подписки
+// Правильное добавление обработчика подписки.
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1()")
 	sf.dict.Register(sf.hand).Hassert("addGood1()")
 }
 
-// Вместо обработчика пустышка
+// Вместо обработчика пустышка.
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1()")
 	res := sf.dict.Register(nil)
@@ -107,7 +107,7 @@ func (sf *tester) addBad1() {
 	}
 }
 
-// Вызов несуществующего топика
+// Вызов несуществующего топика.
 func (sf *tester) sendBad1() {
 	sf.t.Log("sendBad1")
 	res := sf.dict.SendRequest("test_bad_topic", []byte("test"))
@@ -116,7 +116,7 @@ func (sf *tester) sendBad1() {
 	}
 }
 
-// Создание словаря подписчиков
+// Создание словаря подписчиков.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newGood1()

+ 6 - 6
v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go

@@ -1,4 +1,4 @@
-// package dict_topic_sub -- потокобезопасный словарь подписчиков локальной шины
+// package dict_topic_sub -- потокобезопасный словарь подписчиков локальной шины.
 package dict_topic_sub
 
 import (
@@ -17,14 +17,14 @@ type tReadReq struct {
 	binMsg []byte
 }
 
-// dictTopicSub -- потокобезопасный словарь подписчиков
+// dictTopicSub -- потокобезопасный словарь подписчиков.
 type dictTopicSub struct {
 	sync.RWMutex
 	kCtx          IKernelCtx
 	dictTopicHook map[ATopic]IDictSubHook
 }
 
-// NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков
+// NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков.
 func NewDictTopicSub() IResult[*dictTopicSub] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
@@ -39,7 +39,7 @@ func NewDictTopicSub() IResult[*dictTopicSub] {
 	return NewRes(sf)
 }
 
-// Read -- вызывает обработчики при поступлении события
+// Read -- вызывает обработчики при поступлении события.
 func (sf *dictTopicSub) Read(topic ATopic, binMsg []byte) {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -58,7 +58,7 @@ func (sf *dictTopicSub) Read(topic ATopic, binMsg []byte) {
 	dictHook.Read(msg.binMsg)
 }
 
-// Subscribe -- подписывает обработчик на топик
+// Subscribe -- подписывает обработчик на топик.
 func (sf *dictTopicSub) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
@@ -89,7 +89,7 @@ func (sf *dictTopicSub) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	return NewRes(true)
 }
 
-// Unsubscribe -- отписывает обработчик
+// Unsubscribe -- отписывает обработчик.
 func (sf *dictTopicSub) Unsubscribe(handler IBusHandlerSubscribe) {
 	sf.Lock()
 	defer sf.Unlock()

+ 8 - 8
v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go

@@ -30,7 +30,7 @@ func TestDictSub(t *testing.T) {
 	sf.unsub1()
 }
 
-// Прямой вызов отписки от топика которого точно нет
+// Прямой вызов отписки от топика которого точно нет.
 func (sf *tester) unsub1() {
 	sf.t.Log("unsub1")
 	sf.dict.Unsubscribe(sf.hand)
@@ -61,7 +61,7 @@ func (sf *tester) delGood2() {
 	sf.dict.Unsubscribe(sf.hand)
 }
 
-// Удаляет, чего нет
+// Удаляет, чего нет.
 func (sf *tester) delBad1() {
 	sf.t.Log("delBad1()")
 	sf.dict.Unsubscribe(nil)
@@ -72,21 +72,21 @@ func (sf *tester) callGood1() {
 	sf.dict.Read(sf.hand.Topic(), []byte("test_good"))
 }
 
-// повторное добавление обработчика
+// повторное добавление обработчика.
 func (sf *tester) addGood2() {
 	sf.t.Log("addGood2")
 	res := sf.dict.Subscribe(sf.hand)
 	res.Hassert("addGood2()")
 }
 
-// Правильное добавление обработчика подписки
+// Правильное добавление обработчика подписки.
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1()")
 	res := sf.dict.Subscribe(sf.hand)
 	res.Hassert("addGood1()")
 }
 
-// Вместо обработчика пустышка
+// Вместо обработчика пустышка.
 func (sf *tester) addBad1() {
 	sf.t.Log("addBad1()")
 	res := sf.dict.Subscribe(nil)
@@ -95,13 +95,13 @@ func (sf *tester) addBad1() {
 	}
 }
 
-// Нет топика
+// Нет топика.
 func (sf *tester) callBad2() {
 	sf.t.Log("callBad2")
 	sf.dict.Read("", []byte("test_msg"))
 }
 
-// Нет данных в топике
+// Нет данных в топике.
 func (sf *tester) callGood10() {
 	sf.t.Log("callGood10")
 	defer func() {
@@ -112,7 +112,7 @@ func (sf *tester) callGood10() {
 	sf.dict.Read("test_bad_topic", []byte("test"))
 }
 
-// Создание словаря подписчиков
+// Создание словаря подписчиков.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newGood1()

+ 11 - 11
v4/lev2/kbus_base/kbus_base.go

@@ -1,4 +1,4 @@
-// package kbus_base -- базовая часть шины данных
+// package kbus_base -- базовая часть шины данных.
 package kbus_base
 
 import (
@@ -17,7 +17,7 @@ const (
 	strBusBaseStream = "bus_base"
 )
 
-// KBusBase -- базовая часть шины данных
+// KBusBase -- базовая часть шины данных.
 type KBusBase struct {
 	Ctx_      IKernelCtx
 	IsWork_   ISafeBool
@@ -32,7 +32,7 @@ var (
 	block sync.Mutex
 )
 
-// GetKernelBusBase -- возвращает базовую шину сообщений
+// GetKernelBusBase -- возвращает базовую шину сообщений.
 func GetKernelBusBase() IResult[*KBusBase] {
 	block.Lock()
 	defer block.Unlock()
@@ -82,7 +82,7 @@ func GetKernelBusBase() IResult[*KBusBase] {
 	return NewRes(Bus_)
 }
 
-// Log -- возвращает лог шины
+// Log -- возвращает лог шины.
 func (sf *KBusBase) Log() ILogBuf {
 	return sf.log
 }
@@ -94,13 +94,13 @@ func (sf *KBusBase) run() {
 	}
 }
 
-// Unsubscribe -- отписывает обработчик от топика
+// Unsubscribe -- отписывает обработчик от топика.
 func (sf *KBusBase) Unsubscribe(handler IBusHandlerSubscribe) {
 	sf.log.Debug("KBusBase.Unsubscribe(): handler='%v'", handler.Name())
 	sf.dictSub.Unsubscribe(handler)
 }
 
-// Subscribe -- подписывает обработчик на топик
+// Subscribe -- подписывает обработчик на топик.
 func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	sf.log.Debug("KBusBase.Subscribe(): handler='%v'", handler.Name())
 	if !sf.IsWork_.Get() {
@@ -117,7 +117,7 @@ func (sf *KBusBase) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	return NewRes(true)
 }
 
-// SendRequest -- отправляет запрос в шину данных
+// SendRequest -- отправляет запрос в шину данных.
 func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	sf.log.Debug("KBusBase.SendRequest(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
@@ -134,7 +134,7 @@ func (sf *KBusBase) SendRequest(topic ATopic, binReq []byte) IResult[[]byte] {
 	return res
 }
 
-// RegisterServe -- регистрирует обработчики входящих запросов
+// RegisterServe -- регистрирует обработчики входящих запросов.
 func (sf *KBusBase) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 	if handler == nil {
 		return NewErr[bool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
@@ -149,7 +149,7 @@ func (sf *KBusBase) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 	return NewRes(true)
 }
 
-// Publish -- публикует сообщение в шину
+// Publish -- публикует сообщение в шину.
 func (sf *KBusBase) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	sf.log.Debug("KBusBase.Publish(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
@@ -162,12 +162,12 @@ func (sf *KBusBase) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	return NewRes(true)
 }
 
-// IsWork -- возвращает признак работы шины
+// IsWork -- возвращает признак работы шины.
 func (sf *KBusBase) IsWork() bool {
 	return sf.IsWork_.Get()
 }
 
-// Ожидает закрытия шины в отдельном потоке
+// Ожидает закрытия шины в отдельном потоке.
 func (sf *KBusBase) close() {
 	sf.Ctx_.Wait()
 	sf.Ctx_.Lock()

+ 14 - 14
v4/lev2/kbus_http/client_bus_http/client_bus_http.go

@@ -1,4 +1,4 @@
-// package client_bus_http -- клиент HTTP-шины
+// package client_bus_http -- клиент HTTP-шины.
 package client_bus_http
 
 import (
@@ -22,7 +22,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-// ClientBusHttp -- клиент HTTP-шины
+// ClientBusHttp -- клиент HTTP-шины.
 type ClientBusHttp struct {
 	bus       IKernelBus
 	ctx       ILocalCtx
@@ -32,7 +32,7 @@ type ClientBusHttp struct {
 	urlLocal  string // URL локальной шины для веб-хуков
 }
 
-// NewClientBusHttp - -возвращает новый клиент HTTP-шины
+// NewClientBusHttp - -возвращает новый клиент HTTP-шины.
 func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
 	log := NewLogBuf(OptIsTerm(true), OptPrefix("ClientBusHttp"))
 	log.Debug("NewClientBusHttp()")
@@ -70,7 +70,7 @@ func NewClientBusHttp(urlRemote string) IResult[IBusClient] {
 	return NewRes(IBusClient(sf))
 }
 
-// Unsubscribe -- отписывается от топика в дистанционной шине
+// 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)
@@ -98,7 +98,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 		sf.log.Err("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
 		return
 	}
-	if string(resp.Status_) != "ok" {
+	if resp.Status_ != "ok" {
 		sf.log.Err("Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 	}
 	if resp.Uuid_ != req.Uuid_ {
@@ -106,7 +106,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler IBusHandlerSubscribe) {
 	}
 }
 
-// Subscribe -- подписывается на топик в дистанционной шине
+// 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)
@@ -145,7 +145,7 @@ func (sf *ClientBusHttp) Subscribe(handler IBusHandlerSubscribe) IResult[bool] {
 	return res
 }
 
-// SendRequest -- отправляет в дистанционную шину запрос
+// 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)
@@ -172,7 +172,7 @@ func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) IResult[[]byte
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
 		return NewErr[[]byte](err)
 	}
-	if string(resp.Status_) != "ok" {
+	if resp.Status_ != "ok" {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
 		return NewErr[[]byte](err)
 	}
@@ -183,7 +183,7 @@ func (sf *ClientBusHttp) SendRequest(topic ATopic, binReq []byte) IResult[[]byte
 	return NewRes(resp.BinResp_)
 }
 
-// RegisterServe -- регистрирует в локальной шине обработчик
+// RegisterServe -- регистрирует в локальной шине обработчик.
 func (sf *ClientBusHttp) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 	if handler == nil {
 		return NewErr[bool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
@@ -196,7 +196,7 @@ func (sf *ClientBusHttp) RegisterServe(handler IBusHandlerServe) IResult[bool] {
 	return NewRes(true)
 }
 
-// Publish -- публикует сообщение в дистанционной шину
+// 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)
@@ -223,7 +223,7 @@ func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 		err := fmt.Errorf("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
 		return NewErr[bool](err)
 	}
-	if string(resp.Status_) != "ok" {
+	if resp.Status_ != "ok" {
 		err := fmt.Errorf("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
 		return NewErr[bool](err)
 	}
@@ -234,7 +234,7 @@ func (sf *ClientBusHttp) Publish(topic ATopic, binMsg []byte) IResult[bool] {
 	return NewRes(true)
 }
 
-// Единый обработчик запросов
+// Единый обработчик запросов.
 func (sf *ClientBusHttp) makePost(hReq *http.Request) ([]byte, error) {
 	hReq.Header.Add("Content-Type", "application/json")
 	_resp, err := http.DefaultClient.Do(hReq)
@@ -250,12 +250,12 @@ func (sf *ClientBusHttp) makePost(hReq *http.Request) ([]byte, error) {
 	return binBody, err
 }
 
-// Log -- возвращает локальный лог клиента
+// Log -- возвращает локальный лог клиента.
 func (sf *ClientBusHttp) Log() ILogBuf {
 	return sf.log
 }
 
-// IsWork -- возвращает признак работы
+// IsWork -- возвращает признак работы.
 func (sf *ClientBusHttp) IsWork() bool {
 	return sf.bus.IsWork()
 }

+ 29 - 25
v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go

@@ -63,7 +63,7 @@ func TestClientBusHttp(t *testing.T) {
 	sf.ctx.Wg().Wait()
 }
 
-// Отправка запросов
+// Отправка запросов.
 func (sf *tester) send() {
 	sf.t.Log("send")
 	sf.sendBad1()
@@ -86,11 +86,15 @@ func (sf *tester) sendGood1() {
 	}
 }
 
-// Левый адрес
+const (
+	strTraTaTa = "tra-ta-ta"
+)
+
+// Левый адрес.
 func (sf *tester) sendBad2() {
 	sf.t.Log("sendBad2")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = "tra-ta-ta"
+	sf.cl.urlRemote = strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -100,7 +104,7 @@ func (sf *tester) sendBad2() {
 	}
 }
 
-// Нет такого топика
+// Нет такого топика.
 func (sf *tester) sendBad1() {
 	sf.t.Log("sendBad1")
 	res := sf.cl.SendRequest("test_bad_topic", []byte("test msg"))
@@ -109,7 +113,7 @@ func (sf *tester) sendBad1() {
 	}
 }
 
-// Регистрация серверного обработчика
+// Регистрация серверного обработчика.
 func (sf *tester) reg() {
 	sf.t.Log("reg")
 	sf.regBad1()
@@ -122,7 +126,7 @@ func (sf *tester) regGood1() {
 	res.Hassert("regGood1()")
 }
 
-// Нет серверного обработчика
+// Нет серверного обработчика.
 func (sf *tester) regBad1() {
 	sf.t.Log("regBad1")
 	res := sf.cl.RegisterServe(nil)
@@ -131,7 +135,7 @@ func (sf *tester) regBad1() {
 	}
 }
 
-// Правильная отписка
+// Правильная отписка.
 func (sf *tester) unsubGood1() {
 	sf.t.Log("unsubGood1")
 	defer func() {
@@ -142,7 +146,7 @@ func (sf *tester) unsubGood1() {
 	sf.cl.Unsubscribe(sf.handSub)
 }
 
-// Публикация сообщения
+// Публикация сообщения.
 func (sf *tester) pub() {
 	sf.t.Log("pub")
 	sf.pubBad1()
@@ -150,7 +154,7 @@ func (sf *tester) pub() {
 	sf.pubBad2()
 }
 
-// С шиной что-то случилось
+// С шиной что-то случилось.
 func (sf *tester) pubBad2() {
 	sf.t.Log("pubBad2")
 	sf.bus.IsWork_.Reset()
@@ -196,11 +200,11 @@ func (sf *tester) pubGood1() {
 	}
 }
 
-// Левый адрес
+// Левый адрес.
 func (sf *tester) pubBad1() {
 	sf.t.Log("pubBad1")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = "tra-ta-ta"
+	sf.cl.urlRemote = strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -215,7 +219,7 @@ func (sf *tester) pubBad1() {
 	}
 }
 
-// Подписка на топик
+// Подписка на топик.
 func (sf *tester) sub() {
 	sf.t.Log("sub")
 	sf.subBad1()
@@ -225,7 +229,7 @@ func (sf *tester) sub() {
 	sf.subGood1()
 }
 
-// С шиной что-то случилось
+// С шиной что-то случилось.
 func (sf *tester) subBad3() {
 	sf.t.Log("subBad3")
 	bus := kbus_http.Bus_
@@ -261,7 +265,7 @@ func (sf *tester) subGood1() {
 	}
 }
 
-// Кривой запрос в сеть
+// Кривой запрос в сеть.
 func (sf *tester) subBad4() {
 	sf.t.Log("subBad4")
 	reader := strings.NewReader("")
@@ -278,11 +282,11 @@ func (sf *tester) subBad4() {
 	}
 }
 
-// Левый адрес
+// Левый адрес.
 func (sf *tester) subBad2() {
 	sf.t.Log("subBad2")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = "tra-ta-ta"
+	sf.cl.urlRemote = strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -297,7 +301,7 @@ func (sf *tester) subBad2() {
 	}
 }
 
-// Нет обработчика
+// Нет обработчика.
 func (sf *tester) subBad1() {
 	sf.t.Log("subBad1")
 	defer func() {
@@ -308,7 +312,7 @@ func (sf *tester) subBad1() {
 	_ = sf.cl.Subscribe(nil)
 }
 
-// Отписка от топика
+// Отписка от топика.
 func (sf *tester) unsub() {
 	sf.t.Log("unsub")
 	sf.unsubBad1()
@@ -316,11 +320,11 @@ func (sf *tester) unsub() {
 	sf.unsubBad3()
 }
 
-// Левый адрес
+// Левый адрес.
 func (sf *tester) unsubBad3() {
 	sf.t.Log("unsubBad3")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = "tra-ta-ta"
+	sf.cl.urlRemote = strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -332,7 +336,7 @@ func (sf *tester) unsubBad3() {
 	sf.cl.Unsubscribe(sf.handSub)
 }
 
-// Ещё нет такой подписки
+// Ещё нет такой подписки.
 func (sf *tester) unsubBad2() {
 	sf.t.Log("unsubBad2")
 	defer func() {
@@ -343,7 +347,7 @@ func (sf *tester) unsubBad2() {
 	sf.cl.Unsubscribe(sf.handSub)
 }
 
-// Нет обработчика
+// Нет обработчика.
 func (sf *tester) unsubBad1() {
 	sf.t.Log("unsubBad1")
 	defer func() {
@@ -354,7 +358,7 @@ func (sf *tester) unsubBad1() {
 	sf.cl.Unsubscribe(nil)
 }
 
-// Создание нового клиента
+// Создание нового клиента.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newBad1()
@@ -383,7 +387,7 @@ func (sf *tester) newGood1() {
 	}
 }
 
-// Пустой URL
+// Пустой URL.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
 	res := NewClientBusHttp("")
@@ -392,7 +396,7 @@ func (sf *tester) newBad2() {
 	}
 }
 
-// Нет ничего для HTTP-шины
+// Нет ничего для HTTP-шины.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
 	res := NewClientBusHttp("url")

+ 11 - 11
v4/lev2/kbus_http/kbus_http.go

@@ -1,4 +1,4 @@
-// package kbus_http -- шина сообщений поверх HTTP
+// package kbus_http -- шина сообщений поверх HTTP.
 package kbus_http
 
 import (
@@ -20,7 +20,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_http"
 )
 
-// kBusHttp -- шина данных поверх HTTP
+// kBusHttp -- шина данных поверх HTTP.
 type kBusHttp struct {
 	*kbus_base.KBusBase
 	log ILogBuf
@@ -31,7 +31,7 @@ var (
 	block sync.Mutex
 )
 
-// GetKernelBusHttp -- возвращает шину HTTP
+// GetKernelBusHttp -- возвращает шину HTTP.
 func GetKernelBusHttp() IResult[IKernelBus] {
 	block.Lock()
 	defer block.Unlock()
@@ -75,7 +75,7 @@ func GetKernelBusHttp() IResult[IKernelBus] {
 	return NewRes(IKernelBus(Bus_))
 }
 
-// Входящий запрос HTTP на подписку
+// Входящий запрос HTTP на подписку.
 func (sf *kBusHttp) postSub(ctx *fiber.Ctx) error {
 	sf.log.Debug("postSub()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
@@ -99,7 +99,7 @@ func (sf *kBusHttp) postSub(ctx *fiber.Ctx) error {
 	return ctx.JSON(resp)
 }
 
-// Процесс подписки веб-хука
+// Процесс подписки веб-хука.
 func (sf *kBusHttp) processSubscribe(req *msg_sub.SubscribeReq) *msg_sub.SubscribeResp {
 	req.SelfCheck()
 	handler := mock_hand_sub_http.NewMockHandSubHttp(req.Topic_, req.WebHook_)
@@ -116,7 +116,7 @@ func (sf *kBusHttp) processSubscribe(req *msg_sub.SubscribeReq) *msg_sub.Subscri
 	return resp
 }
 
-// Входящая публикация
+// Входящая публикация.
 func (sf *kBusHttp) postPublish(ctx *fiber.Ctx) error {
 	sf.log.Debug("postPublish()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
@@ -139,7 +139,7 @@ func (sf *kBusHttp) postPublish(ctx *fiber.Ctx) error {
 	return ctx.JSON(resp)
 }
 
-// Выполняет процесс публикации
+// Выполняет процесс публикации.
 func (sf *kBusHttp) processPublish(req *msg_pub.PublishReq) *msg_pub.PublishResp {
 	req.SelfCheck()
 	res := sf.Publish(req.Topic_, req.BinMsg_)
@@ -154,7 +154,7 @@ func (sf *kBusHttp) processPublish(req *msg_pub.PublishReq) *msg_pub.PublishResp
 	return resp
 }
 
-// Входящий запрос
+// Входящий запрос.
 func (sf *kBusHttp) postSendRequest(ctx *fiber.Ctx) error {
 	sf.log.Debug("postSendRequest()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
@@ -177,7 +177,7 @@ func (sf *kBusHttp) postSendRequest(ctx *fiber.Ctx) error {
 	return ctx.JSON(resp)
 }
 
-// Обрабатывает входящий запрос
+// Обрабатывает входящий запрос.
 func (sf *kBusHttp) processSendRequest(req *msg_serve.ServeReq) *msg_serve.ServeResp {
 	req.SelfCheck()
 	res := sf.SendRequest(req.Topic_, req.BinReq_)
@@ -193,7 +193,7 @@ func (sf *kBusHttp) processSendRequest(req *msg_serve.ServeReq) *msg_serve.Serve
 	return resp
 }
 
-// Входящая отписка от топика по HTTP
+// Входящая отписка от топика по HTTP.
 func (sf *kBusHttp) postUnsub(ctx *fiber.Ctx) error {
 	sf.log.Debug("postUnsub()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
@@ -216,7 +216,7 @@ func (sf *kBusHttp) postUnsub(ctx *fiber.Ctx) error {
 	return ctx.JSON(resp)
 }
 
-// Процесс отписки от топика
+// Процесс отписки от топика.
 func (sf *kBusHttp) processUnsubRequest(req *msg_unsub.UnsubReq) *msg_unsub.UnsubResp {
 	req.SelfCheck()
 	resp := &msg_unsub.UnsubResp{

+ 36 - 31
v4/lev2/kbus_http/kbus_http_test.go

@@ -40,7 +40,7 @@ func TestKernelBusHttp(t *testing.T) {
 	sf.unsub()
 }
 
-// Запрос на отписку
+// Запрос на отписку.
 func (sf *tester) unsub() {
 	sf.t.Log("unsub")
 	sf.unsubBad1()
@@ -84,12 +84,12 @@ func (sf *tester) unsubGood2() {
 	if err != nil {
 		sf.t.Fatalf("unsubGood2(): err=%v", err)
 	}
-	if string(resp.Status_) != "ok" {
-		sf.t.Fatalf("unsubGood2(): resp(%v)!='ok'", string(resp.Status_))
+	if resp.Status_ != "ok" {
+		sf.t.Fatalf("unsubGood2(): resp(%v)!='ok'", resp.Status_)
 	}
 }
 
-// Кривой запрос
+// Кривой запрос.
 func (sf *tester) unsubBad3() {
 	sf.t.Log("unsubBad3")
 	req := "tra-la-la"
@@ -106,6 +106,7 @@ func (sf *tester) unsubBad3() {
 	if err != nil {
 		sf.t.Fatalf("unsubBad3(): after request, err=%v", err)
 	}
+	defer _resp.Body.Close()
 	if _resp.StatusCode == 200 {
 		sf.t.Fatalf("unsubBad3(): statusCode(%v)==200", _resp.StatusCode)
 	}
@@ -132,7 +133,7 @@ func (sf *tester) unsubGood1() {
 	}
 }
 
-// Все поля на месте, нет подписчика
+// Все поля на месте, нет подписчика.
 func (sf *tester) unsubBad2() {
 	sf.t.Log("unsubBad2")
 	Bus_.Unsubscribe(sf.handSub)
@@ -151,7 +152,7 @@ func (sf *tester) unsubBad2() {
 	}
 }
 
-// Нет полей для процесса отписки
+// Нет полей для процесса отписки.
 func (sf *tester) unsubBad1() {
 	sf.t.Log("unsubBad1")
 	defer func() {
@@ -163,7 +164,7 @@ func (sf *tester) unsubBad1() {
 	_ = Bus_.processUnsubRequest(req)
 }
 
-// Запрос на публикацию
+// Запрос на публикацию.
 func (sf *tester) pub() {
 	sf.t.Log("pub")
 	sf.pubBad1()
@@ -203,12 +204,12 @@ func (sf *tester) pubGood2() {
 	if err != nil {
 		sf.t.Fatalf("pubGood2(): err=%v", err)
 	}
-	if string(resp.Status_) != "ok" {
-		sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", string(resp.Status_))
+	if resp.Status_ != "ok" {
+		sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", resp.Status_)
 	}
 }
 
-// Кривой запрос
+// Кривой запрос.
 func (sf *tester) pubBad3() {
 	sf.t.Log("pubBad3")
 	req := "tra-la-la"
@@ -225,12 +226,13 @@ func (sf *tester) pubBad3() {
 	if err != nil {
 		sf.t.Fatalf("pubBad3(): after request, err=%v", err)
 	}
+	defer _resp.Body.Close()
 	if _resp.StatusCode == 200 {
 		sf.t.Fatalf("pubBad3(): statusCode(%v)==200", _resp.StatusCode)
 	}
 }
 
-// Что-то случилось внутри шины
+// Что-то случилось внутри шины.
 func (sf *tester) pubBad2() {
 	sf.t.Log("pubBad2")
 	Bus_.IsWork_.Reset()
@@ -247,7 +249,7 @@ func (sf *tester) pubBad2() {
 	}
 }
 
-// Все поля на месте
+// Все поля на месте.
 func (sf *tester) pubGood1() {
 	sf.t.Log("pubGood1")
 	res := Bus_.Subscribe(sf.handSub)
@@ -262,18 +264,18 @@ func (sf *tester) pubGood1() {
 	_ = Bus_.processPublish(req)
 	for {
 		SleepMs()
-		msg := string(sf.handSub.Msg())
+		msg := sf.handSub.Msg()
 		if msg != "" {
 			break
 		}
 	}
-	msg := string(sf.handSub.Msg())
+	msg := sf.handSub.Msg()
 	if msg != "test_pub" {
 		sf.t.Fatalf("pubGood1(): msg(%v)!='test_pub'", msg)
 	}
 }
 
-// Нет полей для процесса публикации
+// Нет полей для процесса публикации.
 func (sf *tester) pubBad1() {
 	sf.t.Log("pubBad1")
 	defer func() {
@@ -285,7 +287,7 @@ func (sf *tester) pubBad1() {
 	_ = Bus_.processPublish(req)
 }
 
-// Запрос подписки на топик
+// Запрос подписки на топик.
 func (sf *tester) sub() {
 	sf.t.Log("sub")
 	sf.subBad1()
@@ -295,7 +297,7 @@ func (sf *tester) sub() {
 	sf.subGood2()
 }
 
-// Полный процесс подписки
+// Полный процесс подписки.
 func (sf *tester) subGood2() {
 	sf.t.Log("subGood2")
 	req := &msg_sub.SubscribeReq{
@@ -326,12 +328,12 @@ func (sf *tester) subGood2() {
 	if err != nil {
 		sf.t.Fatalf("subBad1(): err=%v", err)
 	}
-	if string(resp.Status_) != "ok" {
-		sf.t.Fatalf("subBad1(): resp(%v)!='ok'", string(resp.Status_))
+	if resp.Status_ != "ok" {
+		sf.t.Fatalf("subBad1(): resp(%v)!='ok'", resp.Status_)
 	}
 }
 
-// Отключена базовая шина
+// Отключена базовая шина.
 func (sf *tester) subBad3() {
 	sf.t.Log("subBad3")
 	req := &msg_sub.SubscribeReq{
@@ -353,7 +355,7 @@ func (sf *tester) subBad3() {
 	}
 }
 
-// Проверка полей запроса в процессе подписки
+// Проверка полей запроса в процессе подписки.
 func (sf *tester) subGood1() {
 	sf.t.Log("subGood1")
 	req := &msg_sub.SubscribeReq{
@@ -369,7 +371,7 @@ func (sf *tester) subGood1() {
 	_ = Bus_.processSubscribe(req)
 }
 
-// Проверка кривых полей запроса в процессе подписки
+// Проверка кривых полей запроса в процессе подписки.
 func (sf *tester) subBad2() {
 	sf.t.Log("subBad2")
 	req := &msg_sub.SubscribeReq{
@@ -383,7 +385,7 @@ func (sf *tester) subBad2() {
 	_ = Bus_.processSubscribe(req)
 }
 
-// Кривой запрос
+// Кривой запрос.
 func (sf *tester) subBad1() {
 	sf.t.Log("subBad1")
 	req := "tra-ta-ta"
@@ -400,12 +402,13 @@ func (sf *tester) subBad1() {
 	if err != nil {
 		sf.t.Fatalf("subBad1(): after request, err=%v", err)
 	}
+	defer _resp.Body.Close()
 	if _resp.StatusCode != 400 {
 		sf.t.Fatalf("subBad1(): statusCode(%v)!=400", _resp.StatusCode)
 	}
 }
 
-// Входящий запрос
+// Входящий запрос.
 func (sf *tester) req() {
 	sf.t.Log("req")
 	sf.reqBad1()
@@ -415,7 +418,7 @@ func (sf *tester) req() {
 	sf.reqBad4()
 }
 
-// Что-то с обработчиком
+// Что-то с обработчиком.
 func (sf *tester) reqBad4() {
 	sf.t.Log("reqBad4")
 	sf.handServ.IsBad_.Set()
@@ -448,8 +451,8 @@ func (sf *tester) reqBad4() {
 	if err != nil {
 		sf.t.Fatalf("reqBad4(): err=%v", err)
 	}
-	if string(resp.Status_) == "ok" {
-		sf.t.Fatalf("reqBad4(): status(%v)=='ok'", string(resp.Status_))
+	if resp.Status_ == "ok" {
+		sf.t.Fatalf("reqBad4(): status(%v)=='ok'", resp.Status_)
 	}
 }
 
@@ -488,7 +491,7 @@ func (sf *tester) reqGood1() {
 	}
 }
 
-// Нет такого топика для запросов
+// Нет такого топика для запросов.
 func (sf *tester) reqBad3() {
 	sf.t.Log("reqBad3")
 	req := &msg_serve.ServeReq{
@@ -508,12 +511,13 @@ func (sf *tester) reqBad3() {
 	if err != nil {
 		sf.t.Fatalf("reqBad3(): after request, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 400 {
 		sf.t.Fatalf("reqBad3(): statusCode(%v)!=400", resp.StatusCode)
 	}
 }
 
-// Нет тела запроса
+// Нет тела запроса.
 func (sf *tester) reqBad2() {
 	sf.t.Log("reqBad1")
 	body := strings.NewReader("test_msg")
@@ -527,12 +531,13 @@ func (sf *tester) reqBad2() {
 	if err != nil {
 		sf.t.Fatalf("reqBad1(): after request, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 400 {
 		sf.t.Fatalf("reqBad1(): statusCode(%v)!=400", resp.StatusCode)
 	}
 }
 
-// Отсутствуют поля в запросе
+// Отсутствуют поля в запросе.
 func (sf *tester) reqBad1() {
 	sf.t.Log("reqBad1")
 	defer func() {
@@ -543,7 +548,7 @@ func (sf *tester) reqBad1() {
 	Bus_.processSendRequest(nil)
 }
 
-// Получает локальную шину
+// Получает локальную шину.
 func (sf *tester) get() {
 	sf.t.Log("get")
 	_ = MakeEnv()

+ 1 - 1
v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go

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

+ 3 - 3
v4/lev2/kbus_local/kbus_local.go

@@ -1,4 +1,4 @@
-// package kbus_local -- реализация локальной шины сообщений
+// package kbus_local -- реализация локальной шины сообщений.
 package kbus_local
 
 import (
@@ -9,7 +9,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
 )
 
-// Локальная шина данных
+// Локальная шина данных.
 type kernelBusLocal struct {
 	*kbus_base.KBusBase
 }
@@ -18,7 +18,7 @@ var (
 	bus *kernelBusLocal
 )
 
-// GetKernelBusLocal -- возвращает локальную шину сообщений
+// GetKernelBusLocal -- возвращает локальную шину сообщений.
 func GetKernelBusLocal() IResult[*kernelBusLocal] {
 	if bus != nil {
 		return NewRes(bus)

+ 1 - 1
v4/lev2/kbus_local/kbus_local_test.go

@@ -24,7 +24,7 @@ func TestKernelBusLocal(t *testing.T) {
 	sf.new()
 }
 
-// Создание локальной шины
+// Создание локальной шины.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newGood1()

+ 8 - 8
v4/lev2/kctx/kctx.go

@@ -1,4 +1,4 @@
-// package kctx -- контекст ядра
+// package kctx -- контекст ядра.
 package kctx
 
 import (
@@ -12,7 +12,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kwg"
 )
 
-// kCtx -- контекст ядра
+// kCtx -- контекст ядра.
 type kCtx struct {
 	ILocalCtx
 	log        ILogBuf
@@ -28,7 +28,7 @@ var (
 	block   sync.Mutex
 )
 
-// GetKernelCtx -- возвращает контекст ядра
+// GetKernelCtx -- возвращает контекст ядра.
 func GetKernelCtx() IResult[*kCtx] {
 	block.Lock()
 	defer block.Unlock()
@@ -60,28 +60,28 @@ func GetKernelCtx() IResult[*kCtx] {
 	return NewRes(kernCtx)
 }
 
-// Keeper -- возвращает сторож системных сигналов
+// Keeper -- возвращает сторож системных сигналов.
 func (sf *kCtx) Keeper() IKernelKeeper {
 	return sf.kernKeeper
 }
 
-// Wg -- возвращает ожидатель потоков
+// Wg -- возвращает ожидатель потоков.
 func (sf *kCtx) Wg() IKernelWg {
 	return sf.kernWg
 }
 
-// Done -- блокирующий вызов ожидания отмены контекста ядра
+// Done -- блокирующий вызов ожидания отмены контекста ядра.
 func (sf *kCtx) Done() {
 	<-sf.ctx.Done()
 	sf.log.Debug("kCtx.Done()")
 }
 
-// CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать)
+// CtxBg -- возвращает неотменяемый контекст ядра (лучше не использовать).
 func (sf *kCtx) CtxBg() context.Context {
 	return sf.ctxBg
 }
 
-// Cancel -- отменяет контекст ядра
+// Cancel -- отменяет контекст ядра.
 func (sf *kCtx) Cancel() {
 	sf.fnCancel()
 	sf.log.Debug("kCtx.Cancel()")

+ 1 - 1
v4/lev2/kctx/kctx_test.go

@@ -15,7 +15,7 @@ func TestKernelCtx(t *testing.T) {
 	sf.new()
 }
 
-// Создание контекста ядра
+// Создание контекста ядра.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	ctx := GetKernelCtx().Hassert("new()")

+ 5 - 5
v4/lev2/kernel_keeper/kernel_keeper.go

@@ -1,4 +1,4 @@
-// package kernel_keeper -- сторож системных сигналов
+// package kernel_keeper -- сторож системных сигналов.
 package kernel_keeper
 
 import (
@@ -13,7 +13,7 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 )
 
-// kernelKeeper -- сторож системных сигналов
+// kernelKeeper -- сторож системных сигналов.
 type kernelKeeper struct {
 	ctx      context.Context
 	fnCancel func()
@@ -27,7 +27,7 @@ var (
 	block    sync.Mutex
 )
 
-// GetKernelKeeper -- возвращает новый сторож системных сигналов
+// GetKernelKeeper -- возвращает новый сторож системных сигналов.
 func GetKernelKeeper(ctx context.Context, fnCancel func(),
 	wg IKernelWg) IResult[*kernelKeeper] {
 	block.Lock()
@@ -65,12 +65,12 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 	return NewRes(sf)
 }
 
-// Log -- возвращает лог сторожа системных сигналов
+// Log -- возвращает лог сторожа системных сигналов.
 func (sf *kernelKeeper) Log() ILogBuf {
 	return sf.log
 }
 
-// Работает в отдельном потоке и ждёт сигналов прерываний работы
+// Работает в отдельном потоке и ждёт сигналов прерываний работы.
 func (sf *kernelKeeper) run(chSys chan os.Signal) {
 	sf.log.Debug("run()")
 

+ 2 - 2
v4/lev2/kernel_keeper/kernel_keeper_test.go

@@ -33,7 +33,7 @@ func TestKernelKeeper(t *testing.T) {
 	sf.done()
 }
 
-// Отмена контекста приложения
+// Отмена контекста приложения.
 func (sf *tester) done() {
 	sf.t.Log("done")
 	sf.fnCancel()
@@ -61,7 +61,7 @@ func (sf *tester) get2() {
 	sf.wg.Wait()
 }
 
-// Получает сторож ядра
+// Получает сторож ядра.
 func (sf *tester) get() {
 	sf.t.Log("get")
 	keep := GetKernelKeeper(sf.ctx, sf.fnCancel, sf.wg).Hassert("get()")

+ 11 - 11
v4/lev2/kmodule/kmodule.go

@@ -1,4 +1,4 @@
-// package kmodule -- модуль на основе ядра
+// package kmodule -- модуль на основе ядра.
 package kmodule
 
 import (
@@ -17,7 +17,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
 )
 
-// kModule -- модуль на основе ядра
+// kModule -- модуль на основе ядра.
 type kModule struct {
 	kCtx      IKernelCtx
 	ctx       ILocalCtx
@@ -28,7 +28,7 @@ type kModule struct {
 	stat      IModuleStat
 }
 
-// NewKernelModule -- возвращает новый модуль на основе ядра
+// NewKernelModule -- возвращает новый модуль на основе ядра.
 func NewKernelModule(name AModuleName) IResult[IKernelModule] {
 	if name == "" {
 		err := fmt.Errorf("NewKernelModule(): name is empty")
@@ -63,43 +63,43 @@ func NewKernelModule(name AModuleName) IResult[IKernelModule] {
 	return NewRes(IKernelModule(sf))
 }
 
-// Stat -- возвращает статистику модуля
+// Stat -- возвращает статистику модуля.
 func (sf *kModule) Stat() IModuleStat {
 	return sf.stat
 }
 
-// Log -- возвращает буферный лог
+// Log -- возвращает буферный лог.
 func (sf *kModule) Log() ILogBuf {
 	return sf.ctx.Log()
 }
 
-// Ctx -- возвращает контекст модуля
+// Ctx -- возвращает контекст модуля.
 func (sf *kModule) Ctx() ILocalCtx {
 	return sf.ctx
 }
 
-// Run -- запускает модуль в работу
+// Run -- запускает модуль в работу.
 func (sf *kModule) Run() {
 	Hassert(false, "kModule.Run(): module='%v', parent not realized this method", sf.name)
 }
 
-// Name -- возвращает уникальное имя модуля
+// Name -- возвращает уникальное имя модуля.
 func (sf *kModule) Name() AModuleName {
 	return sf.name
 }
 
-// IsWork -- возвращает признак состояния работы
+// IsWork -- возвращает признак состояния работы.
 func (sf *kModule) IsWork() bool {
 	Hassert(false, "kModule.IsWork(): module='%v', parent not realized this method", sf.name)
 	return false
 }
 
-// Live -- возвращает индикатор жизни модуля
+// Live -- возвращает индикатор жизни модуля.
 func (sf *kModule) Live() string {
 	return sf.strLive.Get()
 }
 
-// Сигнал жизни, каждые 5 сек публикует в шину метку
+// Сигнал жизни, каждые 5 сек публикует в шину метку.
 func (sf *kModule) sigLive() {
 	var (
 		topic  = sf.name + "_live"

+ 5 - 5
v4/lev2/kmodule/kmodule_test.go

@@ -37,7 +37,7 @@ func TestKernelModule(t *testing.T) {
 	sf.done()
 }
 
-// Работа после остановки локальной шины
+// Работа после остановки локальной шины.
 func (sf *tester) done() {
 	sf.t.Log("done")
 	kCtx := kctx.GetKernelCtx().Hassert("done()")
@@ -48,7 +48,7 @@ func (sf *tester) done() {
 	time.Sleep(time.Millisecond * 250)
 }
 
-// Проверить признак работы
+// Проверить признак работы.
 func (sf *tester) isWork() {
 	sf.t.Log("isWork")
 	defer func() {
@@ -59,7 +59,7 @@ func (sf *tester) isWork() {
 	_ = sf.mod.IsWork()
 }
 
-// Запускает модуль в работу
+// Запускает модуль в работу.
 func (sf *tester) run() {
 	sf.t.Log("run")
 	defer func() {
@@ -72,7 +72,7 @@ func (sf *tester) run() {
 	sf.mod.Run()
 }
 
-// Создание нового модуля ядра
+// Создание нового модуля ядра.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newBad1()
@@ -95,7 +95,7 @@ func (sf *tester) newGood1() {
 	_ = sf.mod.Live()
 }
 
-// Нет имени модуля
+// Нет имени модуля.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
 	res := NewKernelModule("")

+ 7 - 7
v4/lev2/kmodule/mod_stat/mod_stat.go

@@ -19,7 +19,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_sec"
 )
 
-// ModStat -- статистика модуля
+// ModStat -- статистика модуля.
 type ModStat struct {
 	statSec    *mod_stat_sec.ModStatSec // Объект статистики 60 секунд
 	timeMinute ISafeInt                 // Интервал ожидания минутного таймера, мсек
@@ -28,7 +28,7 @@ type ModStat struct {
 	name       AModuleName
 }
 
-// NewModStat -- возвращает новую статистику модуля
+// NewModStat -- возвращает новую статистику модуля.
 func NewModStat(name AModuleName) *ModStat {
 	Hassert(name != "", "NewModuleStat(): name module is empty")
 	sf := &ModStat{
@@ -42,7 +42,7 @@ func NewModStat(name AModuleName) *ModStat {
 	return sf
 }
 
-// Срабатывает раз в минуту
+// Срабатывает раз в минуту.
 func (sf *ModStat) eventMinute() {
 	countPartHour := 20
 	for {
@@ -58,22 +58,22 @@ func (sf *ModStat) eventMinute() {
 	}
 }
 
-// Add -- добавляет значение в статистику
+// Add -- добавляет значение в статистику.
 func (sf *ModStat) Add(val int) {
 	sf.statSec.Add(val)
 }
 
-// SvgSec -- возвращает посекундную SVG за последнюю минуту
+// SvgSec -- возвращает посекундную SVG за последнюю минуту.
 func (sf *ModStat) SvgSec() string {
 	return sf.statSec.Svg()
 }
 
-// SvgMin -- возвращает поминутную SVG за последнюю минуту
+// SvgMin -- возвращает поминутную SVG за последнюю минуту.
 func (sf *ModStat) SvgMin() string {
 	return sf.statMin.Svg()
 }
 
-// SvgDay -- возвращает SVG за последние сутки по часам
+// SvgDay -- возвращает SVG за последние сутки по часам.
 func (sf *ModStat) SvgDay() string {
 	return sf.statDay.Svg()
 }

+ 72 - 68
v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day.go

@@ -1,4 +1,4 @@
-// package mod_stat_day -- статистика модуля за первые 24 часа
+// package mod_stat_day -- статистика модуля за первые 24 часа.
 package mod_stat_day
 
 import (
@@ -12,14 +12,14 @@ import (
 	svg "github.com/ajstarks/svgo"
 )
 
-// ModStatDay -- статистика модуля за первые 24 часа
+// ModStatDay -- статистика модуля за первые 24 часа.
 type ModStatDay struct {
 	sync.RWMutex
 	lst    []int // Список значений за первые 24 часа
 	bufSvg *bytes.Buffer
 }
 
-// NewModStatDay -- возвращает новую статистику модуля за первые 24 часа
+// NewModStatDay -- возвращает новую статистику модуля за первые 24 часа.
 func NewModStatDay() *ModStatDay {
 	sf := &ModStatDay{
 		lst:    []int{},
@@ -28,7 +28,7 @@ func NewModStatDay() *ModStatDay {
 	return sf
 }
 
-// Sum -- возвращает сумму элементов по требованию
+// Sum -- возвращает сумму элементов по требованию.
 func (sf *ModStatDay) Sum() int {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -39,7 +39,7 @@ func (sf *ModStatDay) Sum() int {
 	return sum
 }
 
-// Add -- добавляет значение в часовой срез
+// Add -- добавляет значение в часовой срез.
 func (sf *ModStatDay) Add(val int) {
 	sf.Lock()
 	defer sf.Unlock()
@@ -54,7 +54,7 @@ func (sf *ModStatDay) Add(val int) {
 	}
 }
 
-// Svg -- возвращает сгенерированный SVG по часовому срезу
+// Svg -- возвращает сгенерированный SVG по часовому срезу.
 func (sf *ModStatDay) Svg() string {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -64,76 +64,80 @@ func (sf *ModStatDay) Svg() string {
 	cnv.Title("Last 24 hours")
 	cnv.Desc("Graphic of last 24 hours")
 	cnv.Text(20, 20, "Last 24 hours", "")
-	var (
-		valMin = math.MaxInt64
-		valMax = math.MinInt64
-	)
-	fnGetMinMax := func() { // Вычисляет максимальное и минимальное значение в графике
-		for _, val := range sf.lst {
-			if val < valMin {
-				valMin = val
-			}
-			if val > valMax {
-				valMax = val
-			}
-		}
-	}
-	fnGetMinMax()
+	valMin, valMax := sf.getMinNax()
 	for i, val := range sf.lst {
 		x1 := int(float32(i)*5) + 42
 		y1 := int(240 * float32(valMax) / float32(val))
 		cnv.Rect(x1, 280-y1, 4, y1, "fill:true;stroke:red;")
 	}
-	fnDrawNet := func() {
-		// Метки величины
-		if valMin == math.MaxInt64 || valMin == math.MinInt64 {
-			valMin = 0
+	sf.drawNet(valMin, valMax, cnv)
+	cnv.End()
+	strOut := sf.bufSvg.String()
+	return strOut
+}
+
+func (sf *ModStatDay) drawNet(valMin, valMax int, cnv *svg.SVG) {
+	// Метки величины
+	if valMin == math.MaxInt64 || valMin == math.MinInt64 {
+		valMin = 0
+	}
+	cnv.Text(25, 285, fmt.Sprint(valMin), "")
+	if valMax == math.MinInt64 || valMax == math.MaxInt64 {
+		valMax = 1
+	}
+	cnv.Text(25, 45, fmt.Sprint(valMax), "")
+	// Метки времени
+	timeNow := time.Now().Local()
+	timeSub24 := timeNow.Add(-24 * time.Hour).Format("15")
+	cnv.Text(40, 295, timeSub24, "")
+
+	timeSub45 := timeNow.Add(-18 * time.Hour).Local().Format("15")
+	cnv.Text(128, 295, timeSub45, "")
+
+	timeSub30 := timeNow.Add(-12 * time.Hour).Local().Format("15")
+	cnv.Text(216, 295, timeSub30, "")
+
+	timeSub15 := timeNow.Add(-6 * time.Hour).Local().Format("15")
+	cnv.Text(304, 295, timeSub15, "")
+
+	timeSub0 := time.Now().Local().Format("15")
+	cnv.Text(392, 295, timeSub0, "")
+
+	cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
+	cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
+	count := 0
+
+	for x := 40; x < 460; x += 20 {
+		cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
 		}
-		cnv.Text(25, 285, fmt.Sprint(valMin), "")
-		if valMax == math.MinInt64 || valMax == math.MaxInt64 {
-			valMax = 1
+		count++
+	}
+	count = 0
+
+	for y := 40; y < 300; y += 20 {
+		cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
 		}
-		cnv.Text(25, 45, fmt.Sprint(valMax), "")
-		// Метки времени
-		timeNow := time.Now().Local()
-		timeSub24 := timeNow.Add(-24 * time.Hour).Format("15")
-		cnv.Text(40, 295, timeSub24, "")
-
-		timeSub45 := timeNow.Add(-18 * time.Hour).Local().Format("15")
-		cnv.Text(128, 295, timeSub45, "")
-
-		timeSub30 := timeNow.Add(-12 * time.Hour).Local().Format("15")
-		cnv.Text(216, 295, timeSub30, "")
-
-		timeSub15 := timeNow.Add(-6 * time.Hour).Local().Format("15")
-		cnv.Text(304, 295, timeSub15, "")
-
-		timeSub0 := time.Now().Local().Format("15")
-		cnv.Text(392, 295, timeSub0, "")
-
-		cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
-		cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
-		count := 0
-
-		for x := 40; x < 460; x += 20 {
-			cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
-			}
-			count++
+		count++
+	}
+}
+
+// Вычисляет максимальное и минимальное значение в графике
+func (sf *ModStatDay) getMinNax() (int, int) {
+	var (
+		valMin = math.MaxInt64
+		valMax = math.MinInt64
+	)
+	for _, val := range sf.lst {
+		if val < valMin {
+			valMin = val
 		}
-		count = 0
-
-		for y := 40; y < 300; y += 20 {
-			cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
-			}
-			count++
+		if val > valMax {
+			valMax = val
 		}
 	}
-	fnDrawNet()
-	cnv.End()
-	strOut := sf.bufSvg.String()
-	return strOut
+	return valMin, valMax
 }

+ 2 - 2
v4/lev2/kmodule/mod_stat/mod_stat_day/mod_stat_day_test.go

@@ -17,7 +17,7 @@ func TestModStatMinute(t *testing.T) {
 	sf.add()
 }
 
-// Добавляет событие в стату
+// Добавляет событие в стату.
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.stat.Add(12)
@@ -31,7 +31,7 @@ func (sf *tester) add() {
 	}
 }
 
-// Создаёт новую секундную статистику модуля
+// Создаёт новую секундную статистику модуля.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.stat = NewModStatDay()

+ 54 - 53
v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute.go

@@ -1,4 +1,4 @@
-// package mod_stat_minute -- статистика модуля за первые 60 мин
+// package mod_stat_minute -- статистика модуля за первые 60 мин.
 package mod_stat_minute
 
 import (
@@ -12,14 +12,14 @@ import (
 	svg "github.com/ajstarks/svgo"
 )
 
-// ModStatMinutes -- статистика модуля за первые 60 мин
+// ModStatMinutes -- статистика модуля за первые 60 мин.
 type ModStatMinutes struct {
 	sync.RWMutex
 	lst    []int // Список значений за последние 60 мин
 	bufSvg *bytes.Buffer
 }
 
-// NewModStatMinute -- возвращает новую статистику модуля за последние 60 мин
+// NewModStatMinute -- возвращает новую статистику модуля за последние 60 мин.
 func NewModStatMinute() *ModStatMinutes {
 	sf := &ModStatMinutes{
 		lst:    []int{},
@@ -28,7 +28,7 @@ func NewModStatMinute() *ModStatMinutes {
 	return sf
 }
 
-// Sum -- возвращает сумму элементов по требованию
+// Sum -- возвращает сумму элементов по требованию.
 func (sf *ModStatMinutes) Sum() int {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -39,7 +39,7 @@ func (sf *ModStatMinutes) Sum() int {
 	return sum
 }
 
-// Add -- добавляет значение в часовой срез
+// Add -- добавляет значение в часовой срез.
 func (sf *ModStatMinutes) Add(val int) {
 	sf.Lock()
 	defer sf.Unlock()
@@ -54,7 +54,7 @@ func (sf *ModStatMinutes) Add(val int) {
 	}
 }
 
-// Svg -- возвращает сгенерированный SVG по часовому срезу
+// Svg -- возвращает сгенерированный SVG по часовому срезу.
 func (sf *ModStatMinutes) Svg() string {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -84,54 +84,55 @@ func (sf *ModStatMinutes) Svg() string {
 		y1 := int(240 * float32(valMax) / float32(val))
 		cnv.Rect(x1, 280-y1, 5, y1, "fill:true;stroke:red;")
 	}
-	fnDrawNet := func() {
-		// Метки величины
-		if valMin == math.MaxInt64 || valMin == math.MinInt64 {
-			valMin = 0
-		}
-		cnv.Text(25, 285, fmt.Sprint(valMin), "")
-		if valMax == math.MinInt64 || valMax == math.MaxInt64 {
-			valMax = 1
-		}
-		cnv.Text(25, 45, fmt.Sprint(valMax), "")
-		// Метки времени
-		timeNow := time.Now().Local()
-		timeSub60 := timeNow.Add(-60 * time.Minute).Format("04")
-		cnv.Text(40, 295, timeSub60, "")
-
-		timeSub45 := timeNow.Add(-45 * time.Minute).Format("04")
-		cnv.Text(128, 295, timeSub45, "")
-
-		timeSub30 := timeNow.Add(-30 * time.Minute).Format("04")
-		cnv.Text(216, 295, timeSub30, "")
-
-		timeSub15 := timeNow.Add(-15 * time.Minute).Format("04")
-		cnv.Text(304, 295, timeSub15, "")
-
-		timeSub0 := time.Now().Format("04")
-		cnv.Text(392, 295, timeSub0, "")
-
-		cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
-		cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
-		count := 0
-		for x := 40; x < 460; x += 20 {
-			cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
-			}
-			count++
-		}
-		count = 0
-		for y := 40; y < 300; y += 20 {
-			cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
-			}
-			count++
-		}
-	}
-	fnDrawNet()
+	sf.drawNet(valMin, valMax, cnv)
 	cnv.End()
 	strOut := sf.bufSvg.String()
 	return strOut
 }
+
+func (sf *ModStatMinutes) drawNet(valMin, valMax int, cnv *svg.SVG) {
+	// Метки величины
+	if valMin == math.MaxInt64 || valMin == math.MinInt64 {
+		valMin = 0
+	}
+	cnv.Text(25, 285, fmt.Sprint(valMin), "")
+	if valMax == math.MinInt64 || valMax == math.MaxInt64 {
+		valMax = 1
+	}
+	cnv.Text(25, 45, fmt.Sprint(valMax), "")
+	// Метки времени
+	timeNow := time.Now().Local()
+	timeSub60 := timeNow.Add(-60 * time.Minute).Format("04")
+	cnv.Text(40, 295, timeSub60, "")
+
+	timeSub45 := timeNow.Add(-45 * time.Minute).Format("04")
+	cnv.Text(128, 295, timeSub45, "")
+
+	timeSub30 := timeNow.Add(-30 * time.Minute).Format("04")
+	cnv.Text(216, 295, timeSub30, "")
+
+	timeSub15 := timeNow.Add(-15 * time.Minute).Format("04")
+	cnv.Text(304, 295, timeSub15, "")
+
+	timeSub0 := time.Now().Format("04")
+	cnv.Text(392, 295, timeSub0, "")
+
+	cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
+	cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
+	count := 0
+	for x := 40; x < 460; x += 20 {
+		cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
+		}
+		count++
+	}
+	count = 0
+	for y := 40; y < 300; y += 20 {
+		cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
+		}
+		count++
+	}
+}

+ 2 - 2
v4/lev2/kmodule/mod_stat/mod_stat_minute/mod_stat_minute_test.go

@@ -17,7 +17,7 @@ func TestModStatMinute(t *testing.T) {
 	sf.add()
 }
 
-// Добавляет событие в стату
+// Добавляет событие в стату.
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.stat.Add(12)
@@ -31,7 +31,7 @@ func (sf *tester) add() {
 	}
 }
 
-// Создаёт новую секундную статистику модуля
+// Создаёт новую секундную статистику модуля.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.stat = NewModStatMinute()

+ 56 - 56
v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go

@@ -1,4 +1,4 @@
-// package mod_stat_sec -- статистика модуля за первые 60 сек
+// package mod_stat_sec -- статистика модуля за первые 60 сек.
 package mod_stat_sec
 
 import (
@@ -6,14 +6,13 @@ import (
 	"fmt"
 	"math"
 
-	// "strings"
 	"sync"
 	"time"
 
-	"github.com/ajstarks/svgo"
+	svg "github.com/ajstarks/svgo"
 )
 
-// ModStatSec -- статистика модуля за первые 60 сек
+// ModStatSec -- статистика модуля за первые 60 сек.
 type ModStatSec struct {
 	sync.RWMutex
 	lst      []int // Список значений за последние 60 сек
@@ -21,7 +20,7 @@ type ModStatSec struct {
 	bufSvg   *bytes.Buffer
 }
 
-// NewModStatSec -- возвращает новую статистику модуля за последние 60 сек
+// NewModStatSec -- возвращает новую статистику модуля за последние 60 сек.
 func NewModStatSec() *ModStatSec {
 	sf := &ModStatSec{
 		lst:      []int{},
@@ -31,7 +30,7 @@ func NewModStatSec() *ModStatSec {
 	return sf
 }
 
-// Sum -- возвращает сумму элементов по требованию
+// Sum -- возвращает сумму элементов по требованию.
 func (sf *ModStatSec) Sum() int {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -42,7 +41,7 @@ func (sf *ModStatSec) Sum() int {
 	return sum
 }
 
-// Add -- добавляет значение в минутный срез
+// Add -- добавляет значение в минутный срез.
 func (sf *ModStatSec) Add(val int) {
 	sf.Lock()
 	defer sf.Unlock()
@@ -72,7 +71,7 @@ func (sf *ModStatSec) Add(val int) {
 // <!-- Generated by SVGo -->`
 // )
 
-// Svg -- возвращает сгенерированный SVG по минутному срезу
+// Svg -- возвращает сгенерированный SVG по минутному срезу.
 func (sf *ModStatSec) Svg() string {
 	sf.Lock()
 	defer sf.Unlock()
@@ -104,56 +103,57 @@ func (sf *ModStatSec) Svg() string {
 		y1 := int(240 * float32(valMax) / float32(val))
 		cnv.Rect(x1, 280-y1, 5, y1, "fill:true;stroke:red;")
 	}
-	fnDrawNet := func() {
-		// Метки величины
-		if valMin == math.MaxInt64 {
-			valMin = 0
-		}
-
-		if valMax == math.MinInt64 {
-			valMax = 1
-		}
-		cnv.Text(25, 285, fmt.Sprint(valMin), "")
-		cnv.Text(25, 45, fmt.Sprint(valMax), "")
-
-		// Метки времени
-		timeNow := time.Now().Local()
-		timeSub60 := timeNow.Add(-60 * time.Second).Format("05")
-		cnv.Text(40, 295, timeSub60, "")
-
-		timeSub45 := timeNow.Add(-45 * time.Second).Format("05")
-		cnv.Text(128, 295, timeSub45, "")
-
-		timeSub30 := timeNow.Add(-30 * time.Second).Format("05")
-		cnv.Text(216, 295, timeSub30, "")
-
-		timeSub15 := timeNow.Add(-15 * time.Second).Format("05")
-		cnv.Text(304, 295, timeSub15, "")
-
-		timeSub0 := time.Now().Format("05")
-		cnv.Text(392, 295, timeSub0, "")
-		cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
-		cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
-		count := 0
-		for x := 40; x < 460; x += 20 {
-			cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
-			}
-			count++
-		}
-		count = 0
-		for y := 40; y < 300; y += 20 {
-			cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
-			if count%5 == 0 {
-				cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
-			}
-			count++
-		}
-	}
-	fnDrawNet()
+	sf.drawNet(valMin, valMax, cnv)
 	cnv.End()
 	strOut := sf.bufSvg.String()
 	// strOut = strings.ReplaceAll(strOut, strCut, "")
 	return strOut
 }
+
+func (sf *ModStatSec) drawNet(valMin, valMax int, cnv *svg.SVG) {
+	// Метки величины
+	if valMin == math.MaxInt64 {
+		valMin = 0
+	}
+
+	if valMax == math.MinInt64 {
+		valMax = 1
+	}
+	cnv.Text(25, 285, fmt.Sprint(valMin), "")
+	cnv.Text(25, 45, fmt.Sprint(valMax), "")
+
+	// Метки времени
+	timeNow := time.Now().Local()
+	timeSub60 := timeNow.Add(-60 * time.Second).Format("05")
+	cnv.Text(40, 295, timeSub60, "")
+
+	timeSub45 := timeNow.Add(-45 * time.Second).Format("05")
+	cnv.Text(128, 295, timeSub45, "")
+
+	timeSub30 := timeNow.Add(-30 * time.Second).Format("05")
+	cnv.Text(216, 295, timeSub30, "")
+
+	timeSub15 := timeNow.Add(-15 * time.Second).Format("05")
+	cnv.Text(304, 295, timeSub15, "")
+
+	timeSub0 := time.Now().Format("05")
+	cnv.Text(392, 295, timeSub0, "")
+	cnv.Line(40, 280, 40, 38, "fill:true;stroke:black;stroke-width:4")
+	cnv.Line(40, 280, 442, 280, "fill:true;stroke:black;stroke-width:4")
+	count := 0
+	for x := 40; x < 460; x += 20 {
+		cnv.Line(x, 40, x, 280, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(x+3, 278, fmt.Sprint(x), "fill:white;stroke:gray")
+		}
+		count++
+	}
+	count = 0
+	for y := 40; y < 300; y += 20 {
+		cnv.Line(40, y, 440, y, "fill:true;stroke:gray")
+		if count%5 == 0 {
+			cnv.Text(43, y+12, fmt.Sprint(y), "fill:white;stroke:gray")
+		}
+		count++
+	}
+}

+ 3 - 3
v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec_test.go

@@ -18,7 +18,7 @@ func TestModStatSec(t *testing.T) {
 	sf.sum()
 }
 
-// Возвращает сумму значений за минуту
+// Возвращает сумму значений за минуту.
 func (sf *tester) sum() {
 	sf.t.Log("sum")
 	if sum := sf.stat.Sum(); sum == 0 {
@@ -26,7 +26,7 @@ func (sf *tester) sum() {
 	}
 }
 
-// Добавляет событие в стату
+// Добавляет событие в стату.
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.stat.Add(12)
@@ -40,7 +40,7 @@ func (sf *tester) add() {
 	}
 }
 
-// Создаёт новую секундную статистику модуля
+// Создаёт новую секундную статистику модуля.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.stat = NewModStatSec()

+ 3 - 3
v4/lev2/kmodule/mod_stat/mod_stat_test.go

@@ -18,13 +18,13 @@ func TestModStat(t *testing.T) {
 	sf.event()
 }
 
-// Проверка генерации меток времени
+// Проверка генерации меток времени.
 func (sf *tester) event() {
 	sf.t.Log("event")
 	time.Sleep(time.Millisecond * 100)
 }
 
-// Создание статистики модуля
+// Создание статистики модуля.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newBad1()
@@ -48,7 +48,7 @@ func (sf *tester) newGood1() {
 	}
 }
 
-// Нет имени статистики
+// Нет имени статистики.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
 	defer func() {

+ 11 - 11
v4/lev2/kmonolit/kmonolit.go

@@ -1,4 +1,4 @@
-// package kmonolit -- модульный монолит на основе ядра
+// package kmonolit -- модульный монолит на основе ядра.
 package kmonolit
 
 import (
@@ -13,7 +13,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-// kMonolit -- объект модульного монолита
+// kMonolit -- объект модульного монолита.
 type kMonolit struct {
 	kCtx    IKernelCtx
 	lCtx    ILocalCtx
@@ -29,7 +29,7 @@ var (
 	mon *kMonolit
 )
 
-// GetMonolit -- возвращает монолит
+// GetMonolit -- возвращает монолит.
 func GetMonolit(name string) IResult[*kMonolit] {
 	if mon != nil {
 		return NewRes(mon)
@@ -79,22 +79,22 @@ func GetMonolit(name string) IResult[*kMonolit] {
 	return NewRes(sf)
 }
 
-// Ctx -- возвращает контекст монолита
+// Ctx -- возвращает контекст монолита.
 func (sf *kMonolit) Ctx() ILocalCtx {
 	return sf.lCtx
 }
 
-// Log -- возвращает лог монолита
+// Log -- возвращает лог монолита.
 func (sf *kMonolit) Log() ILogBuf {
 	return sf.lCtx.Log()
 }
 
-// Name -- возвращает имя монолита
+// Name -- возвращает имя монолита.
 func (sf *kMonolit) Name() string {
 	return sf.name
 }
 
-// Add -- добавляет модуль в монолит
+// Add -- добавляет модуль в монолит.
 func (sf *kMonolit) Add(module IKernelModule) IResult[bool] {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
@@ -122,7 +122,7 @@ func (sf *kMonolit) Add(module IKernelModule) IResult[bool] {
 	return NewRes(true)
 }
 
-// Run -- запускает монолит в работу
+// Run -- запускает монолит в работу.
 func (sf *kMonolit) Run() {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
@@ -139,17 +139,17 @@ func (sf *kMonolit) Run() {
 	sf.log.Debug("kMonolit.Run()")
 }
 
-// IsLocal -- возвращает признак локальной шины
+// IsLocal -- возвращает признак локальной шины.
 func (sf *kMonolit) IsLocal() bool {
 	return sf.isLocal
 }
 
-// IsWork -- возвращает признак работы монолита
+// IsWork -- возвращает признак работы монолита.
 func (sf *kMonolit) IsWork() bool {
 	return sf.isWork.Get()
 }
 
-// Ожидание завершения работы монолита
+// Ожидание завершения работы монолита.
 func (sf *kMonolit) Wait() {
 	sf.kCtx.Wait()
 	sf.kCtx.Wg().Wait()

+ 3 - 3
v4/lev2/kmonolit/kmonolit_test.go

@@ -53,7 +53,7 @@ func (sf *tester) done() {
 	sf.mon.Run()
 }
 
-// Добавление модуля в монолит
+// Добавление модуля в монолит.
 func (sf *tester) add() {
 	sf.t.Log("add")
 	sf.addGood1()
@@ -89,7 +89,7 @@ func (sf *tester) run() {
 	}
 }
 
-// Создаёт новый монолит
+// Создаёт новый монолит.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newBad1()
@@ -130,7 +130,7 @@ func (sf *tester) newGood1() {
 	sf.mon = resMon.Hassert("newGood1()")
 }
 
-// Нет признака локальности
+// Нет признака локальности.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
 	res := GetMonolit("test_32")

+ 29 - 25
v4/lev2/kserv_http/kserv_http.go

@@ -1,4 +1,4 @@
-// package kserv_http -- встроенный HTTP-сервер
+// package kserv_http -- встроенный HTTP-сервер.
 package kserv_http
 
 import (
@@ -28,7 +28,7 @@ const (
 	streamName = "kernel_server_http" // Контрольная строка для ожидателя потока
 )
 
-// kServHttp -- встроенный HTTP-сервер
+// kServHttp -- встроенный HTTP-сервер.
 type kServHttp struct {
 	kCtx     IKernelCtx
 	lCtx     ILocalCtx
@@ -46,9 +46,21 @@ var (
 	kernServHttp *kServHttp
 	block        sync.Mutex
 	assert       = helpers.Assert
+	hassert      = helpers.Hassert
 )
 
-// GetKernelServHttp -- возвращает  встроенный HTTP-сервер
+func getParams() (string, ILogBuf, IKernelCtx) {
+	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttp"))
+	log.Debug("GetKernelServHttp(): first run")
+	strLocalUrl := os.Getenv("LOCAL_HTTP_URL")
+	hassert(strLocalUrl != "", "getParams(): env LOCAL_HTTP_URL not set")
+	resKernCtx := kctx.GetKernelCtx()
+	resKernCtx.Hassert("getParams(): in get KernelCtx")
+	kCtx := resKernCtx.Val()
+	return strLocalUrl, log, kCtx
+}
+
+// GetKernelServHttp -- возвращает  встроенный HTTP-сервер.
 func GetKernelServHttp() IResult[IKernelServerHttp] {
 	block.Lock()
 	defer block.Unlock()
@@ -56,19 +68,8 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 		kernServHttp.log.Debug("GetKernelServHttp()")
 		return NewRes(IKernelServerHttp(kernServHttp))
 	}
-	log := log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("kServHttp"))
-	log.Debug("GetKernelServHttp(): first run")
-	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")
-	if strUrl == "" {
-		err := fmt.Errorf("GetKernelServHttp(): env LOCAL_HTTP_URL not set")
-		return NewErr[IKernelServerHttp](err)
-	}
+	strLocalUrl, log, kCtx := getParams()
+
 	optMonolit := kCtx.Get("monolitName")
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("GetKernelServHttp(): not have monolit name from kCtx")
@@ -93,7 +94,7 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 		kCtx:     kCtx,
 		log:      log,
 		lCtx:     resLocCtx.Val(),
-		strUrl:   strUrl,
+		strUrl:   strLocalUrl,
 		fiberApp: fiber.New(confFiber),
 		isWork:   safe_bool.NewSafeBool(),
 		isEnd:    safe_bool.NewSafeBool(),
@@ -124,22 +125,22 @@ func GetKernelServHttp() IResult[IKernelServerHttp] {
 	return NewRes(IKernelServerHttp(kernServHttp))
 }
 
-// IsWork -- возвращает признак работы
+// IsWork -- возвращает признак работы.
 func (sf *kServHttp) IsWork() bool {
 	return sf.isWork.Get()
 }
 
-// Log -- возвращает локальный лог
+// Log -- возвращает локальный лог.
 func (sf *kServHttp) Log() ILogBuf {
 	return sf.log
 }
 
-// Fiber -- возвращает объект веб-приложения fiber
+// Fiber -- возвращает объект веб-приложения fiber.
 func (sf *kServHttp) Fiber() *fiber.App {
 	return sf.fiberApp
 }
 
-// Run -- запускает сервер в работу (не блокирующий вызов)
+// Run -- запускает сервер в работу (не блокирующий вызов).
 func (sf *kServHttp) Run() {
 	block.Lock()
 	defer block.Unlock()
@@ -162,11 +163,14 @@ func (sf *kServHttp) Run() {
 	}
 	go fnListen()
 	go sf.fnChErr(chErr)
-	fnCheckServer := func() (err error) {
+	fnCheckServer := func() error {
 		client := &http.Client{Timeout: 5 * time.Millisecond}
 		url := sf.strUrl + "monitor"
 		sf.log.Debug("url=%v", url)
-		var resp *http.Response
+		var (
+			resp *http.Response
+			err  error
+		)
 		if resp, err = client.Get(url); err == nil {
 			if resp.StatusCode == http.StatusOK {
 				defer resp.Body.Close()
@@ -187,7 +191,7 @@ func (sf *kServHttp) Run() {
 	go sf.close()
 }
 
-// В отдельном потоке ждёт закрытия канала
+// В отдельном потоке ждёт закрытия канала.
 func (sf *kServHttp) fnChErr(chErr <-chan string) {
 	strErr := <-chErr
 	if strErr != "<nil>" {
@@ -197,7 +201,7 @@ func (sf *kServHttp) fnChErr(chErr <-chan string) {
 	}
 }
 
-// Ожидает окончания работы
+// Ожидает окончания работы.
 func (sf *kServHttp) close() {
 	sf.kCtx.Wait()
 	if !sf.isWork.Get() {

+ 5 - 5
v4/lev2/kserv_http/kserv_http_test.go

@@ -32,7 +32,7 @@ func TestKernelServHttp(t *testing.T) {
 	sf.close()
 }
 
-// Закрытие HTTP-сервера
+// Закрытие HTTP-сервера.
 func (sf *tester) close() {
 	sf.t.Log("close")
 	sf.ctx.Cancel()
@@ -48,7 +48,7 @@ func (sf *tester) close() {
 	kernServHttp.fnChErr(chErr)
 }
 
-// Создание сервера HTTP
+// Создание сервера HTTP.
 func (sf *tester) new() {
 	sf.t.Log("new()")
 	sf.newBad1()
@@ -57,7 +57,7 @@ func (sf *tester) new() {
 	sf.newBad3()
 }
 
-// Повторный запуск сервера на том же порту
+// Повторный запуск сервера на том же порту.
 func (sf *tester) newBad3() {
 	sf.t.Log("newBad3()")
 	serv := GetKernelServHttp().Hassert("newBad1")
@@ -99,7 +99,7 @@ func (sf *tester) newGood1() {
 	serv.Run()
 }
 
-// Не указана SERVER_HTTP_PORT
+// Не указана SERVER_HTTP_PORT.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2()")
 	res := GetKernelServHttp()
@@ -108,7 +108,7 @@ func (sf *tester) newBad2() {
 	}
 }
 
-// Нет контекста ядра
+// Нет контекста ядра.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1()")
 	res := GetKernelServHttp()

+ 4 - 4
v4/lev2/kserv_http_std/kserv_http_std.go

@@ -1,4 +1,4 @@
-// package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке
+// package kserv_http_std -- реализация HTTP-сервера на стандартной библиотеке.
 package kserv_http_std
 
 import (
@@ -12,7 +12,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-// kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке
+// kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке.
 type kServHttpStd struct {
 	kCtx   IKernelCtx
 	log    ILogBuf
@@ -25,7 +25,7 @@ var (
 	mu    sync.Mutex
 )
 
-// GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке
+// GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
 func GetKservHttpStd() IResult[*kServHttpStd] {
 	mu.Lock()
 	defer mu.Unlock()
@@ -51,7 +51,7 @@ func GetKservHttpStd() IResult[*kServHttpStd] {
 	return NewRes(sf)
 }
 
-// Run -- запускает сервер вы работу
+// Run -- запускает сервер вы работу.
 func (sf *kServHttpStd) Run() {
 	sf.server = &http.Server{
 		Addr:         fmt.Sprintf(":%v", sf.port),

+ 12 - 12
v4/lev2/kstore_kv/kstore_kv.go

@@ -1,4 +1,4 @@
-// package kstore_kv -- локальное быстрое key-value хранилище ядра
+// package kstore_kv -- локальное быстрое key-value хранилище ядра.
 package kstore_kv
 
 import (
@@ -22,7 +22,7 @@ const (
 	storeStreamName = "kstore_kv" // Имя потока для ожидателя потоков
 )
 
-// kStoreKv -- локальное хранилище ядра
+// kStoreKv -- локальное хранилище ядра.
 type kStoreKv struct {
 	sync.RWMutex
 	kCtx      IKernelCtx
@@ -39,7 +39,7 @@ var (
 	block     sync.Mutex
 )
 
-// GetKernelStore -- возвращает новое локальное хранилище ядра
+// GetKernelStore -- возвращает новое локальное хранилище ядра.
 func GetKernelStore() IResult[*kStoreKv] {
 	block.Lock()
 	defer block.Unlock()
@@ -76,12 +76,12 @@ func GetKernelStore() IResult[*kStoreKv] {
 	return NewRes(kernStore)
 }
 
-// Log -- возвращает локальный лог
+// Log -- возвращает локальный лог.
 func (sf *kStoreKv) Log() ILogBuf {
 	return sf.log
 }
 
-// Set -- устанавливает значение по ключу
+// Set -- устанавливает значение по ключу.
 func (sf *kStoreKv) Set(key string, val []byte) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
@@ -99,7 +99,7 @@ func (sf *kStoreKv) Set(key string, val []byte) IResult[bool] {
 	return NewRes(true)
 }
 
-// Get -- возвращает значение по ключу
+// Get -- возвращает значение по ключу.
 func (sf *kStoreKv) Get(key string) IResult[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
@@ -122,7 +122,7 @@ func (sf *kStoreKv) Get(key string) IResult[[]byte] {
 	return NewRes(binVal)
 }
 
-// ByPrefix -- фильтрует ключи по префиксу
+// ByPrefix -- фильтрует ключи по префиксу.
 func (sf *kStoreKv) ByPrefix(prefix string) IResult[[]string] {
 	var (
 		binKey []byte
@@ -155,7 +155,7 @@ func (sf *kStoreKv) ByPrefix(prefix string) IResult[[]string] {
 	return NewRes(lstKey)
 }
 
-// Delete -- удалить ключ из хранилища
+// Delete -- удалить ключ из хранилища.
 func (sf *kStoreKv) Delete(key string) IResult[bool] {
 	sf.Lock()
 	defer sf.Unlock()
@@ -173,7 +173,7 @@ func (sf *kStoreKv) Delete(key string) IResult[bool] {
 	return NewRes(true)
 }
 
-// Открывает базу при создании
+// Открывает базу при создании.
 func (sf *kStoreKv) open() {
 	sf.Lock()
 	defer sf.Unlock()
@@ -194,7 +194,7 @@ func (sf *kStoreKv) open() {
 	go sf.clean()
 }
 
-// Выполняет периодическую сборку мусора в файле
+// Выполняет периодическую сборку мусора в файле.
 func (sf *kStoreKv) clean() {
 	chRun := make(chan int, 2)
 	defer close(chRun)
@@ -215,7 +215,7 @@ func (sf *kStoreKv) clean() {
 	}
 }
 
-// Ожидает последнего потока под отдельной блокировкой
+// Ожидает последнего потока под отдельной блокировкой.
 func (sf *kStoreKv) wait(chWait chan int) {
 	for {
 		time.Sleep(time.Millisecond * 5)
@@ -226,7 +226,7 @@ func (sf *kStoreKv) wait(chWait chan int) {
 	close(chWait)
 }
 
-// Ожидает закрытия контекста ядра, закрывает хранилище
+// Ожидает закрытия контекста ядра, закрывает хранилище.
 func (sf *kStoreKv) close() {
 	sf.kCtx.Wait()
 	sf.Lock()

+ 7 - 7
v4/lev2/kstore_kv/kstore_kv_test.go

@@ -42,7 +42,7 @@ func TestKernelStore(t *testing.T) {
 	time.Sleep(time.Second * 2)
 }
 
-// Установка ключа после закрытия хранилища
+// Установка ключа после закрытия хранилища.
 func (sf *tester) workBad1() {
 	sf.t.Log("workBad1")
 	res := kernStore.Set("test_key", []byte("test_val"))
@@ -59,7 +59,7 @@ func (sf *tester) workBad1() {
 	}
 }
 
-// Удаляет значение
+// Удаляет значение.
 func (sf *tester) del() {
 	sf.t.Log("del")
 	res := kernStore.Delete("test_key")
@@ -72,7 +72,7 @@ func (sf *tester) del() {
 	}
 }
 
-// Поиск по префиксу
+// Поиск по префиксу.
 func (sf *tester) byPrefix() {
 	sf.t.Log("byPrefix")
 	res0 := kernStore.Set("test_key2", []byte("test_key2"))
@@ -87,7 +87,7 @@ func (sf *tester) byPrefix() {
 	}
 }
 
-// Получение значения по ключу
+// Получение значения по ключу.
 func (sf *tester) get() {
 	sf.t.Log("get")
 	opt := kernStore.Get("test_key")
@@ -98,7 +98,7 @@ func (sf *tester) get() {
 	}
 }
 
-// Добавление ключа в хранилище
+// Добавление ключа в хранилище.
 func (sf *tester) set() {
 	sf.t.Log("set")
 	res := kernStore.Set("test_key", []byte("test_val"))
@@ -107,7 +107,7 @@ func (sf *tester) set() {
 	}
 }
 
-// Закрытие хранилища
+// Закрытие хранилища.
 func (sf *tester) close() {
 	sf.t.Log("close")
 	res := sf.wg.Add("123")
@@ -125,7 +125,7 @@ func (sf *tester) close() {
 	}
 }
 
-// Создаёт новое хранилище ядра
+// Создаёт новое хранилище ядра.
 func (sf *tester) new() {
 	sf.t.Log("new")
 	sf.newGood1()

+ 7 - 7
v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go

@@ -1,4 +1,4 @@
-// package dict_rec -- потокобезопасный словарь KV-бакета
+// package dict_rec -- потокобезопасный словарь KV-бакета.
 package dict_rec
 
 import (
@@ -11,13 +11,13 @@ import (
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
-// DictRec -- потокобезопасный словарь KV-бакета
+// DictRec -- потокобезопасный словарь KV-бакета.
 type DictRec struct {
 	dict  map[kalias.AKey]IRecKv
 	block sync.RWMutex
 }
 
-// NewDictRec -- создание нового потокобезопасного словаря KV
+// NewDictRec -- создание нового потокобезопасного словаря KV.
 func NewDictRec() *DictRec {
 	sf := &DictRec{
 		dict: map[kalias.AKey]IRecKv{},
@@ -26,7 +26,7 @@ func NewDictRec() *DictRec {
 	return sf
 }
 
-// Get -- получение значения по ключу
+// Get -- получение значения по ключу.
 func (sf *DictRec) Get(key kalias.AKey) IOption[IRecKv] {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
@@ -37,7 +37,7 @@ func (sf *DictRec) Get(key kalias.AKey) IOption[IRecKv] {
 	return NewOpt(rec)
 }
 
-// Set -- установка значения по ключу
+// Set -- установка значения по ключу.
 func (sf *DictRec) Set(rec IRecKv) IResult[bool] {
 	if rec == nil {
 		return NewErr[bool](fmt.Errorf("DictRec.Set(): rec is nil"))
@@ -48,14 +48,14 @@ func (sf *DictRec) Set(rec IRecKv) IResult[bool] {
 	return NewRes(true)
 }
 
-// Del -- удаление значения по ключу
+// Del -- удаление значения по ключу.
 func (sf *DictRec) Del(key kalias.AKey) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	delete(sf.dict, key)
 }
 
-// Len -- количество элементов в словаре
+// Len -- количество элементов в словаре.
 func (sf *DictRec) Len() int {
 	sf.block.RLock()
 	defer sf.block.RUnlock()

+ 4 - 4
v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec_test.go

@@ -26,14 +26,14 @@ func TestDictRec(t *testing.T) {
 	sf.set()
 }
 
-// Установка значения
+// Установка значения.
 func (sf *tester) set() {
 	sf.t.Log("set")
 	sf.set_bad1()
 	sf.set_good1()
 }
 
-// Правильная установка записи
+// Правильная установка записи.
 func (sf *tester) set_good1() {
 	sf.t.Log("set_good1")
 	rec := sf.new_rec("test1")
@@ -51,7 +51,7 @@ func (sf *tester) set_good1() {
 	}
 }
 
-// Возвращает новую запись для тестов
+// Возвращает новую запись для тестов.
 func (sf *tester) new_rec(key kalias.AKey) IRecKv {
 	meta := rec_meta.NewRecMeta(key)
 	val := rec_val.NewRecVal(meta.Key(), []byte(key+"_val"))
@@ -59,7 +59,7 @@ func (sf *tester) new_rec(key kalias.AKey) IRecKv {
 	return rec
 }
 
-// Нет записи для установки
+// Нет записи для установки.
 func (sf *tester) set_bad1() {
 	sf.t.Log("set_bad1")
 	res := sf.dict.Set(nil)

+ 4 - 4
v4/lev2/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -1,4 +1,4 @@
-// package kv_bucket_base -- базовый бакет хранилища KV
+// package kv_bucket_base -- базовый бакет хранилища KV.
 package kv_bucket_base
 
 import (
@@ -11,7 +11,7 @@ var (
 	hassert = helpers.Hassert
 )
 
-// KvBucketBase -- базовый бакет хранилища KV
+// KvBucketBase -- базовый бакет хранилища KV.
 //
 // Бакет знает все свои свойства:
 //   - имя
@@ -21,7 +21,7 @@ var (
 // Количество записей бакета зависит от размера бакета.
 // Размер бакета в памяти (уровень 0) конфигурируется.
 // Он должен быть разумным значением (например, до 100 МБ).
-// Как только бакет заполнится, он будет вытеснен на диск
+// Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
 	Name_      string                        `json:"name"`       // Имя бакета
 	Level_     int                           `json:"level"`      // Уровень бакета
@@ -34,7 +34,7 @@ type KvBucketBase struct {
 	dictRec    map[kalias.AKey]ktypes.IRecKv // Словарь для хранения данных
 }
 
-// NewKvBucketBase -- создание нового базового бакета хранилища KV
+// NewKvBucketBase -- создание нового базового бакета хранилища KV.
 func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
 	hassert(name != "", "NewKvBucketBase: name is empty")
 	hassert(level >= 0, "NewKvBucketBase: level is negative")

+ 2 - 2
v4/lev2/kstore_kv_std/kv_bucket_ram/kv_bucket_ram.go

@@ -1,9 +1,9 @@
-// package kv_bucket_ram -- бакет хранилища KV в памяти
+// package kv_bucket_ram -- бакет хранилища KV в памяти.
 package kv_bucket_ram
 
 import "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv_std/kv_bucket_base"
 
-// KvBucketRam -- бакет хранилища KV в памяти
+// KvBucketRam -- бакет хранилища KV в памяти.
 type KvBucketRam struct {
 	*kv_bucket_base.KvBucketBase
 }

+ 5 - 5
v4/lev2/kstore_kv_std/rec_kv/rec_kv.go

@@ -1,4 +1,4 @@
-// package rec_kv -- запись KV-хранилища
+// package rec_kv -- запись KV-хранилища.
 package rec_kv
 
 import (
@@ -10,13 +10,13 @@ var (
 	hassert = helpers.Hassert
 )
 
-// RecKv -- запись KV-хранилища
+// RecKv -- запись KV-хранилища.
 type RecKv struct {
 	meta ktypes.IRecMeta // Метаданные записи
 	val  ktypes.IRecVal  // Значение записи
 }
 
-// NewRecKv -- создает новую запись
+// NewRecKv -- создает новую запись.
 func NewRecKv(meta ktypes.IRecMeta, val ktypes.IRecVal) *RecKv {
 	hassert(meta != nil, "NewRecKv(): meta==nil")
 	hassert(val != nil, "NewRecKv(): val==nil")
@@ -28,12 +28,12 @@ func NewRecKv(meta ktypes.IRecMeta, val ktypes.IRecVal) *RecKv {
 	return sf
 }
 
-// Meta -- метаданные записи
+// Meta -- метаданные записи.
 func (sf *RecKv) Meta() ktypes.IRecMeta {
 	return sf.meta
 }
 
-// Val -- значение записи
+// Val -- значение записи.
 func (sf *RecKv) Val() ktypes.IRecVal {
 	return sf.val
 }

+ 3 - 3
v4/lev2/kstore_kv_std/rec_kv/rec_kv_test.go

@@ -18,14 +18,14 @@ func TestRecKv(t *testing.T) {
 	sf.new()
 }
 
-// Создаёт новую запись
+// Создаёт новую запись.
 func (sf *tester) new() {
 	sf.t.Log("new()")
 	sf.new_bad1()
 	sf.new_good1()
 }
 
-// Правильное создание записи
+// Правильное создание записи.
 func (sf *tester) new_good1() {
 	sf.t.Log("new_good1()")
 	defer func() {
@@ -44,7 +44,7 @@ func (sf *tester) new_good1() {
 	}
 }
 
-// Нет метаинформации
+// Нет метаинформации.
 func (sf *tester) new_bad1() {
 	sf.t.Log("new_bad1()")
 	defer func() {

+ 12 - 10
v4/lev2/kstore_kv_std/rec_meta/rec_meta.go

@@ -1,4 +1,4 @@
-// package rec_meta -- мета-информация записи KV-хранилища
+// package rec_meta -- мета-информация записи KV-хранилища.
 package rec_meta
 
 import (
@@ -11,7 +11,7 @@ var (
 	hassert = helpers.Hassert
 )
 
-// RecMeta -- мета-информация записи KV-хранилища
+// RecMeta -- мета-информация записи KV-хранилища.
 //
 // Вся информация о записи хранится в JSON-строке, без форматирования
 // для того, что можно было файл индексов бакета писать построчно.
@@ -23,11 +23,13 @@ type RecMeta struct {
 	Operation_ string       `json:"operation"`  // Тип операции над записью
 	CreatedAt_ kalias.ATime `json:"created_at"` // Дата создания записи
 	UpdateAt_  kalias.ATime `json:"update_at"`  // Дата последнего обновления
-	Sha_       string       `json:"sha"`        // Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
-	Offset_    int64        `json:"-"`          // Смещение в файле, игнорируется при записи
+
+	// Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
+	Sha_    string `json:"sha"`
+	Offset_ int64  `json:"-"` // Смещение в файле, игнорируется при записи
 }
 
-// NewRecMeta -- создание новой мета-информации записи KV-хранилища
+// NewRecMeta -- создание новой мета-информации записи KV-хранилища.
 func NewRecMeta(key kalias.AKey) *RecMeta {
 	hassert(key != "", "NewRecMeta: key is empty")
 	sf := &RecMeta{
@@ -40,27 +42,27 @@ func NewRecMeta(key kalias.AKey) *RecMeta {
 	return sf
 }
 
-// Key -- ключ записи
+// Key -- ключ записи.
 func (sf *RecMeta) Key() kalias.AKey {
 	return sf.Key_
 }
 
-// Vers -- версия записи
+// Vers -- версия записи.
 func (sf *RecMeta) Vers() int64 {
 	return sf.Vers_
 }
 
-// Operation -- тип операции над записью
+// Operation -- тип операции над записью.
 func (sf *RecMeta) Operation() string {
 	return sf.Operation_
 }
 
-// CreatedAt -- дата создания записи
+// CreatedAt -- дата создания записи.
 func (sf *RecMeta) CreatedAt() kalias.ATime {
 	return sf.CreatedAt_
 }
 
-// UpdateAt -- дата последнего обновления
+// UpdateAt -- дата последнего обновления.
 func (sf *RecMeta) UpdateAt() kalias.ATime {
 	return sf.UpdateAt_
 }

+ 1 - 1
v4/lev2/kwg/kwg.go

@@ -73,7 +73,7 @@ func (sf *kernelWg) IsWork() bool {
 func (sf *kernelWg) List() []AStreamName {
 	sf.RLock()
 	defer sf.RUnlock()
-	lst := []AStreamName{}
+	lst := make([]AStreamName, 0, len(sf.dictStream))
 	for name := range sf.dictStream {
 		lst = append(lst, name)
 	}

+ 6 - 6
v4/lev2/mock_hand_serve/mock_hand_serve.go

@@ -1,4 +1,4 @@
-// package mock_hand_serve -- мок-обработчик входящих запросов
+// package mock_hand_serve -- мок-обработчик входящих запросов.
 package mock_hand_serve
 
 import (
@@ -12,7 +12,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 )
 
-// MockHandlerServe -- мок-обработчик входящих запросов
+// MockHandlerServe -- мок-обработчик входящих запросов.
 type MockHandlerServe struct {
 	IsBad_ ISafeBool    // Признак сбоя при вызове
 	Msg_   []byte       // Для обратного вызова
@@ -21,7 +21,7 @@ type MockHandlerServe struct {
 	block  sync.Mutex
 }
 
-// NewMockHandlerServe -- возвращает новый обработчик подписки
+// NewMockHandlerServe -- возвращает новый обработчик подписки.
 func NewMockHandlerServe(topic ATopic, name string) *MockHandlerServe {
 	Hassert(topic != "", "NewMockHandlerServe(): topic is empty")
 	Hassert(name != "", "NewMockHandlerServe(): name is empty")
@@ -34,7 +34,7 @@ func NewMockHandlerServe(topic ATopic, name string) *MockHandlerServe {
 	return sf
 }
 
-// Функция обратного вызова подписки
+// Функция обратного вызова подписки.
 func (sf *MockHandlerServe) FnBack(binMsg []byte) IResult[[]byte] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
@@ -46,12 +46,12 @@ func (sf *MockHandlerServe) FnBack(binMsg []byte) IResult[[]byte] {
 	return NewRes(binMsg)
 }
 
-// Возвращает уникальное имя обработчика подписки
+// Возвращает уникальное имя обработчика подписки.
 func (sf *MockHandlerServe) Topic() ATopic {
 	return sf.Topic_
 }
 
-// Возвращает топик для обработчика подписки
+// Возвращает топик для обработчика подписки.
 func (sf *MockHandlerServe) Name() AHandlerName {
 	return sf.Name_
 }

+ 6 - 6
v4/lev2/mock_hand_sub_local/mock_hand_sub.go

@@ -1,4 +1,4 @@
-// package mock_hand_sub -- мок-обработчик подписки
+// package mock_hand_sub -- мок-обработчик подписки.
 package mock_hand_sub_local
 
 import (
@@ -17,7 +17,7 @@ type MockHandlerSub struct {
 	block  sync.RWMutex
 }
 
-// NewMockHandlerSub -- возвращает новый обработчик подписки
+// NewMockHandlerSub -- возвращает новый обработчик подписки.
 func NewMockHandlerSub(topic ATopic, localHook string) *MockHandlerSub {
 	Hassert(topic != "", "NewMockHandlerSub(): topic is empty")
 	Hassert(localHook != "", "NewMockHandlerSub(): name is empty")
@@ -29,26 +29,26 @@ func NewMockHandlerSub(topic ATopic, localHook string) *MockHandlerSub {
 	return sf
 }
 
-// Возвращает хранимое значение
+// Возвращает хранимое значение.
 func (sf *MockHandlerSub) Msg() string {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	return string(sf.Msg_)
 }
 
-// Функция обратного вызова подписки
+// Функция обратного вызова подписки.
 func (sf *MockHandlerSub) FnBack(binMsg []byte) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	sf.Msg_ = binMsg
 }
 
-// Возвращает уникальное имя обработчика подписки
+// Возвращает уникальное имя обработчика подписки.
 func (sf *MockHandlerSub) Topic() ATopic {
 	return sf.Topic_
 }
 
-// Возвращает топик для обработчика подписки
+// Возвращает топик для обработчика подписки.
 func (sf *MockHandlerSub) Name() AHandlerName {
 	return sf.Name_
 }

+ 6 - 1
v4/lev2/wui/whx/whx_test.go

@@ -27,7 +27,12 @@ func (sf *tester) str() {
 	sf.hx.Oob().Set("true")
 	sf.hx.Vals().Set("test", 3)
 	str := sf.hx.String()
-	_str := `hx-put="/wui/click/123" hx-trigger="load" hx-target="#main" hx-swap="before" hx-swap-oob="true" hx-vals='{"test":3}'`
+	_str := `hx-put="/wui/click/123"
+			hx-trigger="load"
+			hx-target="#main" 
+			hx-swap="before" 
+			hx-swap-oob="true" 
+			hx-vals='{"test":3}'`
 	if str != _str {
 		sf.t.Fatalf("str(): \n\t%v\n\t%v", str, _str)
 	}

+ 1 - 0
v4/lev3/mod_serv_http/http_api/http_api_test.go

@@ -41,6 +41,7 @@ func (sf *tester) getTime() {
 	if err != nil {
 		sf.t.Fatalf("get(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("get(): status(%v)!=200", resp.StatusCode)
 	}

+ 55 - 70
v4/lev3/mod_serv_http/page_module/page_module_test.go

@@ -6,6 +6,7 @@ import (
 	"testing"
 	"time"
 
+	"github.com/gofiber/fiber/v2"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -47,15 +48,16 @@ func TestPageMonolit(t *testing.T) {
 // Получение SVG, модуля 20 не существует.
 func (sf *tester) postSvgDayBad1() {
 	sf.t.Log("postSvgDayBad1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgDayBad1()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgDayBad1()")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgDayBad1()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgDayBad1()")
-	fiberApp := sf.serv.Fiber()
+	// mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgDayBad1()")
+	// ctxMon := mon.Ctx()
+	// module := kmodule.NewKernelModule("kCtx").Hassert("postSvgDayBad1()")
+	// module.Log().Debug("test msg")
+	// ctxMod := module.Ctx()
+	// ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgDayBad1()")
+	// time.Sleep(time.Millisecond * 20)
+	// ctxMon.Set("module_1", module, "test_module").Hassert("postSvgDayBad1()")
+	// fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_svg_day/svg_day_20.svg", nil)
 	if err != nil {
 		sf.t.Fatalf("postSvgDayBad1(): in net request, err=%v", err)
@@ -64,6 +66,7 @@ func (sf *tester) postSvgDayBad1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgDayBad1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgDayBad1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -72,16 +75,17 @@ func (sf *tester) postSvgDayBad1() {
 // Получение SVG.
 func (sf *tester) postSvgDayGood1() {
 	sf.t.Log("postSvgDayGood1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgDayGood1()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgDayGood1()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgDayGood1()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgDayGood1()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
+	// mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgDayGood1()")
+	// ctxMon := mon.Ctx()
+	// module := kmodule.NewKernelModule("kCtx").Hassert("postSvgDayGood1()")
+	// module.Log().Debug("test msg")
+	// ctxMod := module.Ctx()
+	// ctxMod.Set("demo_key", "demo value", "for demo comment").
+	// Hassert("postSvgDayGood1()")
+	// time.Sleep(time.Millisecond * 20)
+	// ctxMon.Set("module_1", module, "test_module").Hassert("postSvgDayGood1()")
+	// fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest("POST", "/module_svg_day/svg_day_1.svg", nil)
 	if err != nil {
 		sf.t.Fatalf("postSvgDayGood1(): in net request, err=%v", err)
@@ -90,19 +94,35 @@ func (sf *tester) postSvgDayGood1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgDayGood1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgDayGood1(): status(%v)!=200", resp.StatusCode)
 	}
 }
 
+func (sf *tester) comSvgPost() *fiber.App {
+	sf.t.Log("comSvgPost")
+	mon := kmonolit.GetMonolit("test_monolit").Hassert("comSvgPost()")
+	ctxMon := mon.Ctx()
+	module := kmodule.NewKernelModule("kCtx").Hassert("comSvgPost()")
+	module.Log().Debug("test msg")
+	ctxMod := module.Ctx()
+	ctxMod.Set("demo_key", "demo value", "for demo comment").
+		Hassert("postSvgDayGood1()")
+	time.Sleep(time.Millisecond * 20)
+	ctxMon.Set("module_1", module, "test_module").Hassert("comSvgPost()")
+	fiberApp := sf.serv.Fiber()
+	return fiberApp
+}
+
 // Получение SVG, модуля 20 не существует.
 func (sf *tester) postSvgMinBad1() {
 	sf.t.Log("postSvgMinBad1")
+	sf.comSvgPost()
 	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgMinBad1()")
 	ctxMon := mon.Ctx()
 	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgMinBad1()")
 	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
 	ctxMod := module.Ctx()
 	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgMinBad1()")
 	time.Sleep(time.Millisecond * 20)
@@ -116,6 +136,7 @@ func (sf *tester) postSvgMinBad1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgMinBad1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgMinBad1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -124,16 +145,7 @@ func (sf *tester) postSvgMinBad1() {
 // Получение SVG.
 func (sf *tester) postSvgMinGood1() {
 	sf.t.Log("postSvgMinGood1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgMinGood1()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgMinGood1()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgMinGood1()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgMinGood1()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_svg_min/svg_min_1.svg", nil)
 	if err != nil {
 		sf.t.Fatalf("postSvgMinGood1(): in net request, err=%v", err)
@@ -142,6 +154,7 @@ func (sf *tester) postSvgMinGood1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgMinGood1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgMinGood1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -150,16 +163,7 @@ func (sf *tester) postSvgMinGood1() {
 // Получение SVG, модуля 20 не существует.
 func (sf *tester) postSvgSecBad1() {
 	sf.t.Log("postSvgSecBad1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgSecBad1()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgSecBad1()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgSecBad1()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgSecBad1()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_svg_sec/svg_sec_20.svg", nil)
 	if err != nil {
 		sf.t.Fatalf("postSvgSecBad1(): in net request, err=%v", err)
@@ -168,6 +172,7 @@ func (sf *tester) postSvgSecBad1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgSecBad1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgSecBad1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -176,16 +181,7 @@ func (sf *tester) postSvgSecBad1() {
 // Получение SVG.
 func (sf *tester) postSvgSecGood1() {
 	sf.t.Log("postSvgSecGood1")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postSvgSecGood1()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postSvgSecGood1()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postSvgSecGood1()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postSvgSecGood1()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_svg_sec/svg_sec_1.svg", nil)
 	if err != nil {
 		sf.t.Fatalf("postSvgSecGood1(): in net request, err=%v", err)
@@ -194,6 +190,7 @@ func (sf *tester) postSvgSecGood1() {
 	if err != nil {
 		sf.t.Fatalf("postSvgSecGood1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postSvgSecGood1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -202,16 +199,7 @@ func (sf *tester) postSvgSecGood1() {
 // Модуля 20 не существует.
 func (sf *tester) postModuleStateBad() {
 	sf.t.Log("postModuleStateBad")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postModuleStateBad()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postModuleStateBad()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postModuleStateBad()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postModuleStateBad()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_state/20", nil)
 	if err != nil {
 		sf.t.Fatalf("postModuleStateBad(): in net request, err=%v", err)
@@ -220,6 +208,7 @@ func (sf *tester) postModuleStateBad() {
 	if err != nil {
 		sf.t.Fatalf("postModuleStateBad(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postModuleStateBad(): status(%v)!=200", resp.StatusCode)
 	}
@@ -228,16 +217,7 @@ func (sf *tester) postModuleStateBad() {
 // Возвращает состояние модуля 1 (теперь добавлен).
 func (sf *tester) postModuleState() {
 	sf.t.Log("postModuleState")
-	mon := kmonolit.GetMonolit("test_monolit").Hassert("postModuleState()")
-	ctxMon := mon.Ctx()
-	module := kmodule.NewKernelModule("kCtx").Hassert("postModuleState()")
-	module.Log().Debug("test msg")
-	module.Log().Debug("test msg")
-	ctxMod := module.Ctx()
-	ctxMod.Set("demo_key", "demo value", "for demo comment").Hassert("postModuleState()")
-	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set("module_1", module, "test_module").Hassert("postModuleState()")
-	fiberApp := sf.serv.Fiber()
+	fiberApp := sf.comSvgPost()
 	req, err := http.NewRequest("POST", "/module_state/1", nil)
 	if err != nil {
 		sf.t.Fatalf("postModuleState(): in net request, err=%v", err)
@@ -246,6 +226,7 @@ func (sf *tester) postModuleState() {
 	if err != nil {
 		sf.t.Fatalf("postModuleState(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postModuleState(): status(%v)!=200", resp.StatusCode)
 	}
@@ -272,6 +253,7 @@ func (sf *tester) postModule1() {
 	if err != nil {
 		sf.t.Fatalf("postModule1(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postModule1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -293,6 +275,7 @@ func (sf *tester) postModuleLog() {
 	if err != nil {
 		sf.t.Fatalf("postModuleLog(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postModuleLog(): status(%v)!=200", resp.StatusCode)
 	}
@@ -310,6 +293,7 @@ func (sf *tester) postMonolitCtx() {
 	if err != nil {
 		sf.t.Fatalf("postMonolitCtx(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postMonolitCtx(): status(%v)!=200", resp.StatusCode)
 	}
@@ -327,6 +311,7 @@ func (sf *tester) postModule() {
 	if err != nil {
 		sf.t.Fatalf("postModule(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postModule(): status(%v)!=200", resp.StatusCode)
 	}

+ 4 - 0
v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

@@ -50,6 +50,7 @@ func (sf *tester) postMonolitLog() {
 	if err != nil {
 		sf.t.Fatalf("postMonolitLog(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postMonolitLog(): status(%v)!=200", resp.StatusCode)
 	}
@@ -67,6 +68,7 @@ func (sf *tester) postMonolitCtx() {
 	if err != nil {
 		sf.t.Fatalf("postMonolitCtx(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postMonolitCtx(): status(%v)!=200", resp.StatusCode)
 	}
@@ -84,6 +86,7 @@ func (sf *tester) postMonolitState() {
 	if err != nil {
 		sf.t.Fatalf("postMonolitState(): in make POST, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("postMonolitState(): status(%v)!=200", resp.StatusCode)
 	}
@@ -101,6 +104,7 @@ func (sf *tester) getMonolit() {
 	if err != nil {
 		sf.t.Fatalf("getMonolit(): in make GET, err=%v", err)
 	}
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("getMonolit(): status(%v)!=200", resp.StatusCode)
 	}

+ 1 - 1
v4/lev3/mod_wui/mod_wui.go

@@ -135,7 +135,7 @@ func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
 	err := req.ParseForm()
 	Hassert(err == nil, "ModuleWui.wuiClick(): in parse form, err=\n\t%v", err)
 	// Получаем все form-значения
-	//values := req.ParseForm()
+	// values := req.ParseForm()
 	for key, lstVal := range req.Form {
 		if len(lstVal) >= 1 {
 			dict[key] = lstVal[0]

+ 5 - 5
v4/lev3/mod_wui/mod_wui_test.go

@@ -86,7 +86,7 @@ func (sf *tester) clickBad3() {
 	if err != nil {
 		sf.t.Fatalf("clickBad3(): in make POST, err=%v", err)
 	}
-
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("clickBad3(): status(%v)!=200", resp.StatusCode)
 	}
@@ -118,7 +118,7 @@ func (sf *tester) clickGood2() {
 	if err != nil {
 		sf.t.Fatalf("clickGood2(): in make POST, err=%v", err)
 	}
-
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("clickGood2(): status(%v)!=200", resp.StatusCode)
 	}
@@ -138,7 +138,7 @@ func (sf *tester) clickGood1() {
 	if err != nil {
 		sf.t.Fatalf("clickGood1(): in make POST, err=%v", err)
 	}
-
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("clickGood1(): status(%v)!=200", resp.StatusCode)
 	}
@@ -164,7 +164,7 @@ func (sf *tester) clickBad2() {
 	if err != nil {
 		sf.t.Fatalf("clickBad2(): in make POST, err=%v", err)
 	}
-
+	defer resp.Body.Close()
 	if resp.StatusCode != 200 {
 		sf.t.Fatalf("clickBad2(): status(%v)!=200", resp.StatusCode)
 	}
@@ -179,7 +179,7 @@ func (sf *tester) clickBad1() {
 		sf.t.Fatalf("clickBad1(): in net request, err=%v", err)
 	}
 	resp, err := sf.fiberApp.Test(req)
-
+	defer resp.Body.Close()
 	if err != nil {
 		sf.t.Fatalf("clickBad1(): in make POST, err=%v", err)
 	}