ソースを参照

SVI Рабочее сохранение

SVI 4 ヶ月 前
親
コミット
8ca6484f20
43 ファイル変更、201 行追加、126 行削除
  1. 2 0
      v4/Taskfile.yml
  2. 33 9
      v4/kern.go
  3. 4 2
      v4/kern_test.go
  4. 4 0
      v4/lev0/helpers/helpers.go
  5. 2 1
      v4/lev0/helpers/helpers_test.go
  6. 9 1
      v4/lev0/lev0.go
  7. 12 1
      v4/lev1/lev1.go
  8. 2 2
      v4/lev1/local_ctx/ctx_value/ctx_value.go
  9. 2 1
      v4/lev1/local_ctx/local_ctx.go
  10. 2 2
      v4/lev1/log_buf/log_msg/log_msg.go
  11. 4 4
      v4/lev1/lst_sort/lst_sort.go
  12. 13 13
      v4/lev1/mock_env/mock_env.go
  13. 4 4
      v4/lev2/kernel_keeper/kernel_keeper.go
  14. 6 4
      v4/lev2/kmodule/kmodule.go
  15. 2 3
      v4/lev2/kmonolit/kmonolit.go
  16. 3 2
      v4/lev2/kmonolit/kmonolit_test.go
  17. 2 2
      v4/lev2/kserv_http/kserv_http_test.go
  18. 4 4
      v4/lev2/kwg/kwg.go
  19. 2 1
      v4/lev2/log_topic/log_topic.go
  20. 2 4
      v4/lev2/log_topic/log_topic_test.go
  21. 4 4
      v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  22. 1 1
      v4/lev2/lti/bus_ent/handler_name/handler_name_test.go
  23. 2 1
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  24. 2 1
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve_test.go
  25. 2 1
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  26. 4 2
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go
  27. 2 1
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  28. 2 1
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go
  29. 2 2
      v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook.go
  30. 3 2
      v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook_test.go
  31. 3 2
      v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve_test.go
  32. 3 3
      v4/lev2/lti/kbus/dict_topic_sub/dict_topic_sub.go
  33. 9 8
      v4/lev2/lti/kbus/dict_topic_sub/dict_topic_sub_test.go
  34. 2 1
      v4/lev2/lti/kbus_base/kbus_base.go
  35. 5 4
      v4/lev2/lti/kbus_base/kbus_base_test.go
  36. 12 10
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  37. 7 6
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go
  38. 4 3
      v4/lev2/lti/kbus_http/kbus_http.go
  39. 9 7
      v4/lev2/lti/kbus_http/kbus_http_test.go
  40. 2 1
      v4/lev2/lti/kbus_local/client_bus_local/client_bus_local_test.go
  41. 3 2
      v4/lev2/lti/kbus_local/kbus_local_test.go
  42. 2 1
      v4/lev2/wui/wui_button/wui_button.go
  43. 2 2
      v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

+ 2 - 0
v4/Taskfile.yml

@@ -31,6 +31,7 @@ tasks:
     desc: "Запуск тестов"
     cmds:
       - clear
+      - go fix ./...
       - go fmt ./...
       - semgrep scan --config .semgrep.yml
       - go test -race -shuffle=on -timeout=30s -coverprofile=./cover.out ./...
@@ -39,6 +40,7 @@ tasks:
     desc: "Запуск всех линтеров"
     cmds:
       - clear
+      - go fix ./...
       - go fmt ./...
       - go vet ./...
       # - go install honnef.co/go/tools/cmd/staticcheck@latest

+ 33 - 9
v4/kern.go

@@ -3,10 +3,12 @@ package kern
 
 import (
 	"context"
+	"time"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -27,6 +29,8 @@ import (
 )
 
 // GetKernelCtx -- возвращает контекст ядра.
+//
+//go:fix inline
 func GetKernelCtx() kspec.IKernelCtx {
 	ctx := kctx.GetKernelCtx()
 	return ctx
@@ -48,12 +52,16 @@ func WrapErr[T any](res mL0.IResult[T], err error) mL0.IResult[T] {
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
+//
+//go:fix inline
 func GetKernelStoreKv() kspec.IKernelStoreKv {
 	store := kstore_kv.GetKernelStore()
 	return store
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра.
+//
+//go:fix inline
 func GetKernelServerHttp() kspec.IKernelServerHttp {
 	kernServHttp := kserv_http.GetKernelServHttp()
 	return kernServHttp
@@ -62,6 +70,8 @@ func GetKernelServerHttp() kspec.IKernelServerHttp {
 type ISafeBool = core_spec.ISafeBool
 
 // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
+//
+//go:fix inline
 func NewSafeBool(val bool) ISafeBool {
 	sb := mL1.NewSafeBool(val)
 	return sb
@@ -76,14 +86,18 @@ func GetKernelBusLocal() bus_spec.IKernelBus {
 }
 
 // GetKernelBusHttp -- возвращает HTTP шину данных.
+//
+//go:fix inline
 func GetKernelBusHttp() bus_spec.IKernelBus {
 	bus := kbus_http.GetKernelBusHttp()
 	return bus
 }
 
 // SleepMs -- спит миллисекунду.
+//
+//go:fix inline
 func SleepMs() {
-	mL1.SleepMs()
+	time.Sleep(time.Millisecond * 1)
 }
 
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
@@ -91,7 +105,7 @@ func GetMonolitLocal(name string) kspec.IKernelMonolit {
 	kCtx := kctx.GetKernelCtx()
 	kCtx.Set("isLocal", true, "bus type")
 	for {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		optIsLocal := kCtx.Get("isLocal")
 		if optIsLocal.IsSome() {
 			break
@@ -108,7 +122,7 @@ func GetMonolitHttp(name string) kspec.IKernelMonolit {
 	_ = kbus_http.GetKernelBusHttp()
 	kCtx.Set("isLocal", false, "bus type")
 	for {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		optIsLocal := kCtx.Get("isLocal")
 		if optIsLocal.IsSome() {
 			break
@@ -119,42 +133,56 @@ func GetMonolitHttp(name string) kspec.IKernelMonolit {
 }
 
 // NewKernelModule -- возвращает новый модуль на ядре.
+//
+//go:fix inline
 func NewKernelModule(name *module_name.AModuleName) kspec.IKernelModule {
 	resMod := kmodule.NewKernelModule(name)
 	return resMod
 }
 
 // NewClientBusLocal -- возвращает клиент для работы с локальной шиной.
+//
+//go:fix inline
 func NewClientBusLocal() bus_spec.IBusClient {
 	lClient := client_bus_local.NewClientBusLocal()
 	return lClient
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
+//
+//go:fix inline
 func NewClientBusHttp(url string) bus_spec.IBusClient {
 	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
 
 // GetModuleServHttp -- возвращает модуль для IKernelServHttp.
+//
+//go:fix inline
 func GetModuleServHttp() kspec.IKernelModule {
 	modServHttp := mod_serv_http.GetModuleServHttp()
 	return modServHttp
 }
 
 // GetModuleKernelCtx -- возвращает модуль для IKernelCtx.
+//
+//go:fix inline
 func GetModuleKernelCtx() kspec.IKernelModule {
 	kModCtx := mod_kctx.GetModuleKernelCtx()
 	return kModCtx
 }
 
 // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper.
+//
+//go:fix inline
 func GetModuleKernelKeeper() kspec.IKernelModule {
 	modKernelKeeper := mod_keeper.GetModuleKeeper()
 	return modKernelKeeper
 }
 
 // GetModuleWui -- возвращает модуль для WUI.
+//
+//go:fix inline
 func GetModuleWui() kspec.IKernelModule {
 	modWui := mod_wui.GetModuleWui()
 	return modWui
@@ -215,15 +243,11 @@ func NewSafeString() core_spec.ISafeString {
 }
 
 // NewSome -- возвращает новый не пустой результат операции.
-//
-//go:fix inline
 func NewSome[T any](some T) mL0.IOption[T] {
 	return mL0.NewSome(some)
 }
 
 // NewNone -- возвращает новый пустой результат операции.
-//
-//go:fix inline
 func NewNone[T any]() mL0.IOption[T] {
 	return mL0.NewNone[T]()
 }
@@ -235,7 +259,7 @@ type FnHassert = mL1.FnHassert
 //
 //go:fix inline
 func Hassert() FnHassert {
-	return mL1.Hassert()
+	return mL1.FnHassert(helpers.Hassert)
 }
 
 // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
@@ -245,5 +269,5 @@ type FnAssert = mL1.FnAssert
 //
 //go:fix inline
 func Assert() FnAssert {
-	return mL1.Assert()
+	return mL1.FnAssert(helpers.Assert)
 }

+ 4 - 2
v4/kern_test.go

@@ -7,6 +7,8 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
@@ -75,12 +77,12 @@ func (sf *tester) new3() {
 		sf.t.Fatalf("new(): ISafeStr==nil")
 	}
 
-	fnHassert := Hassert()
+	fnHassert := mL1.FnHassert(helpers.Hassert)
 	if fnHassert == nil {
 		sf.t.Fatalf("new(): Hassert==nil")
 	}
 
-	fnAssert := Assert()
+	fnAssert := mL1.FnAssert(helpers.Assert)
 	if fnAssert == nil {
 		sf.t.Fatalf("new(): Assert==nil")
 	}

+ 4 - 0
v4/lev0/helpers/helpers.go

@@ -47,12 +47,16 @@ func Hassert(isCond bool, msgFormat string, args ...any) {
 }
 
 // TimeNow -- возвращает локальное Unix сейчас-время (мсек, не зависит от положения).
+//
+//go:fix inline
 func TimeNow() int64 {
 	timeNow := time.Now().Local().UnixMilli()
 	return timeNow
 }
 
 // SleepMs -- спит миллисекунду (иногда бывает полезно).
+//
+//go:fix inline
 func SleepMs() {
 	time.Sleep(time.Millisecond * 1)
 }

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

@@ -3,6 +3,7 @@ package helpers
 import (
 	"os"
 	"testing"
+	"time"
 )
 
 const (
@@ -83,7 +84,7 @@ func (sf *tester) hassert() {
 	if unixTime := TimeNow(); unixTime == 0 {
 		sf.t.Fatalf("hassert(): unixTime==0")
 	}
-	SleepMs()
+	time.Sleep(time.Millisecond * 1)
 }
 
 // Мягкая ТВЁРДАЯ проверка на ок.

+ 9 - 1
v4/lev0/lev0.go

@@ -2,6 +2,8 @@
 package lev0
 
 import (
+	"time"
+
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	mEt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
@@ -83,16 +85,22 @@ func NewNone[T any]() IOption[T] {
 }
 
 // Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
+//
+//go:fix inline
 func Hassert(isCond bool, msgFormat string, args ...any) {
 	helpers.Hassert(isCond, msgFormat, args)
 }
 
 // Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
+//
+//go:fix inline
 func Assert(isCond bool, msgFormat string, args ...any) {
 	helpers.Assert(isCond, msgFormat, args)
 }
 
 // SleepMs -- задержка в миллисекундах.
+//
+//go:fix inline
 func SleepMs() {
-	helpers.SleepMs()
+	time.Sleep(time.Millisecond * 1)
 }

+ 12 - 1
v4/lev1/lev1.go

@@ -3,6 +3,7 @@ package lev1
 
 import (
 	"context"
+	"time"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
@@ -74,6 +75,8 @@ func NewSafeBool(val bool) mKs.ISafeBool {
 type FnHassert = helpers.FnHassert
 
 // Hassert -- возвращает ссылку на функцию Hassert.
+//
+//go:fix inline
 func Hassert() FnHassert {
 	return helpers.Hassert
 }
@@ -82,22 +85,30 @@ func Hassert() FnHassert {
 type FnAssert = helpers.FnAssert
 
 // Assert -- возвращает ссылку на функцию Assert.
+//
+//go:fix inline
 func Assert() FnAssert {
 	return helpers.Assert
 }
 
 // SleepMs -- спит миллисекунду.
+//
+//go:fix inline
 func SleepMs() {
-	helpers.SleepMs()
+	time.Sleep(time.Millisecond * 1)
 }
 
 // NewInt -- возвращает новую целочисленную переменную.
+//
+//go:fix inline
 func NewInt(val int) mKs.Int {
 	val_ := kint.NewInt(val)
 	return val_
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
+//
+//go:fix inline
 func NewLocalCtx(ctx context.Context) comp_spec.ILocalCtx {
 	lCtx := local_ctx.NewLocalCtx(ctx)
 	return lCtx

+ 2 - 2
v4/lev1/local_ctx/ctx_value/ctx_value.go

@@ -4,8 +4,8 @@ package ctx_value
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 )
 
@@ -36,7 +36,7 @@ type CtxValue struct {
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
 func NewCtxValue(key string, val any, comment string) ICtxValue {
-	mL0.Hassert(key != "", "NewCtxValue(): key is empty")
+	helpers.Hassert(key != "", "NewCtxValue(): key is empty", []any{})
 	sf := &CtxValue{
 		key:       key,
 		createAt:  etime.NewETimeAuto(),

+ 2 - 1
v4/lev1/local_ctx/local_ctx.go

@@ -8,6 +8,7 @@ import (
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx/ctx_value"
@@ -52,7 +53,7 @@ type LocalCtx struct {
 
 // NewLocalCtx -- возвращает новый локальный контекст.
 func NewLocalCtx(ctx context.Context) ILocalCtx {
-	mL0.Hassert(ctx != nil, "NewLocalCtx(): ctx==nil")
+	helpers.Hassert(ctx != nil, "NewLocalCtx(): ctx==nil", []any{})
 	_ctx, fnCancel := context.WithCancel(ctx)
 	paramLogBuf := &log_buf.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),

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

@@ -4,8 +4,8 @@ package log_msg
 import (
 	"fmt"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
@@ -80,6 +80,6 @@ func (sf *logMsg) check(level int) {
 	case ERROR:
 		quark_val.Set(sf.level.Val(), "ERRO")
 	default:
-		mL0.Hassert(false, "logMsg.check(): unknown level(%v)", level)
+		helpers.Hassert(false, "logMsg.check(): unknown level(%v)", []any{level})
 	}
 }

+ 4 - 4
v4/lev1/lst_sort/lst_sort.go

@@ -5,7 +5,7 @@ import (
 	"sort"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 )
 
@@ -27,7 +27,7 @@ func NewLstSort() *LstSort {
 func (sf *LstSort) Add(val comp_spec.ICtxValue) {
 	sf.Lock()
 	defer sf.Unlock()
-	mL0.Hassert(val != nil, "LstSort.Add(): ICtxValue==nil")
+	helpers.Hassert(val != nil, "LstSort.Add(): ICtxValue==nil", []any{})
 	sf.lstVal = append(sf.lstVal, val)
 	sf.sort()
 }
@@ -60,8 +60,8 @@ func (sf *LstSort) Size() int {
 func (sf *LstSort) Get(ind int) comp_spec.ICtxValue {
 	sf.RLock()
 	defer sf.RUnlock()
-	mL0.Hassert(ind >= 0, "LstSort.Get(): ind(%v)<0", ind)
-	mL0.Hassert(ind < len(sf.lstVal), "LstSort.Get(): ind(%v)>=len(%v)", ind, len(sf.lstVal))
+	helpers.Hassert(ind >= 0, "LstSort.Get(): ind(%v)<0", []any{ind})
+	helpers.Hassert(ind < len(sf.lstVal), "LstSort.Get(): ind(%v)>=len(%v)", []any{ind, len(sf.lstVal)})
 	return sf.lstVal[ind]
 }
 

+ 13 - 13
v4/lev1/mock_env/mock_env.go

@@ -5,7 +5,7 @@ import (
 	"os"
 	"strings"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
 type IMockEnv interface {
@@ -30,7 +30,7 @@ func MakeEnv() *MockEnv {
 	sf.readEnv()
 	sf.parseEnv()
 	err := sf.SetAll()
-	mL0.Hassert(err == nil, "MakeEnv(): SetAll, err=\n\t%v", err)
+	helpers.Hassert(err == nil, "MakeEnv(): SetAll, err=\n\t%v", []any{err})
 	return sf
 }
 
@@ -52,9 +52,9 @@ func (sf *MockEnv) parseEnv() {
 // Парсит строку окружения.
 func (sf *MockEnv) parseEnvStr(pair string) {
 	lstPair := strings.Split(pair, "=")
-	mL0.Hassert(len(lstPair) >= 2, "MockEnv.parseEnvStr(): pair(%v) not have =", pair)
+	helpers.Hassert(len(lstPair) >= 2, "MockEnv.parseEnvStr(): pair(%v) not have =", []any{pair})
 	key := lstPair[0]
-	mL0.Hassert(key != "", "MockEnv.parseEnvStr(): in pair(%v) key is empty", pair)
+	helpers.Hassert(key != "", "MockEnv.parseEnvStr(): in pair(%v) key is empty", []any{pair})
 	lstVal := lstPair[1:]
 
 	val := ""
@@ -63,21 +63,21 @@ func (sf *MockEnv) parseEnvStr(pair string) {
 	}
 	val = strings.TrimSuffix(val, "=")
 
-	mL0.Hassert(val != "", "MockEnv.parseEnvStr(): in pair(%v) val is empty", pair)
+	helpers.Hassert(val != "", "MockEnv.parseEnvStr(): in pair(%v) val is empty", []any{pair})
 	sf.dictEnv[key] = val
 }
 
 // Читает файл переменных окружения.
 func (sf *MockEnv) readEnv() {
 	binEnv, err := os.ReadFile(sf.fileName)
-	mL0.Hassert(err == nil, "MockEnv.readEnv(): in read %v, err=\n\t%v", sf.fileName, err)
+	helpers.Hassert(err == nil, "MockEnv.readEnv(): in read %v, err=\n\t%v", []any{sf.fileName, err})
 	sf.strEnv = string(binEnv)
 }
 
 // Устанавливает текущий путь относительно проекта в dev.
 func (sf *MockEnv) setPath() {
 	dir, err := os.Getwd()
-	mL0.Hassert(err == nil, "MockEnv.setPath(): in get PWD, err=\n\t%v", err)
+	helpers.Hassert(err == nil, "MockEnv.setPath(): in get PWD, err=\n\t%v", []any{err})
 	lstDir := strings.Split(dir, "/")
 	var pwd strings.Builder
 	fileName := ""
@@ -91,12 +91,12 @@ func (sf *MockEnv) setPath() {
 			break
 		}
 	}
-	mL0.Hassert(isFind, "MockEnv.setPath(): not find file .env")
+	helpers.Hassert(isFind, "MockEnv.setPath(): not find file .env", []any{})
 	sf.pwd = pwd.String() + "/bin_dev"
 	err = os.MkdirAll(sf.pwd, 0750)
-	mL0.Hassert(err == nil, "MockEnv.setPath(): in create PWD, err=\n\t%v", err)
+	helpers.Hassert(err == nil, "MockEnv.setPath(): in create PWD, err=\n\t%v", []any{err})
 	err = os.Chdir(sf.pwd)
-	mL0.Hassert(err == nil, "MockEnv.setPath(): in set cwd(%v), err=\n\t%v", sf.pwd, err)
+	helpers.Hassert(err == nil, "MockEnv.setPath(): in set cwd(%v), err=\n\t%v", []any{sf.pwd, err})
 	sf.fileName = fileName
 }
 
@@ -111,7 +111,7 @@ func (sf *MockEnv) SetAll() error {
 	for key, val := range sf.dictEnv {
 		sf.Reset("key")
 		err := os.Setenv(key, val)
-		mL0.Hassert(err == nil, "MockEnv.SetAll(): in set env %v on key %v, err=\n\t%v", key, val, err)
+		helpers.Hassert(err == nil, "MockEnv.SetAll(): in set env %v on key %v, err=\n\t%v", []any{key, val, err})
 	}
 	return nil
 }
@@ -125,7 +125,7 @@ func (sf *MockEnv) ResetAll() {
 
 // Reset -- сбрасывает конкретный ключ.
 func (sf *MockEnv) Reset(key string) {
-	mL0.Hassert(key != "", "MockEnv.Reset(): key is empty")
+	helpers.Hassert(key != "", "MockEnv.Reset(): key is empty", []any{})
 	err := os.Unsetenv(key)
-	mL0.Hassert(err == nil, "MockEnv.Reset(): in reset env %v, err=\n\t%v", key, err)
+	helpers.Hassert(err == nil, "MockEnv.Reset(): in reset env %v, err=\n\t%v", []any{key, err})
 }

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

@@ -8,8 +8,8 @@ import (
 	"sync"
 	"syscall"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
@@ -40,9 +40,9 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 		kernKeep.log.Debug("GetKernelKeeper()")
 		return kernKeep
 	}
-	mL0.Hassert(ctx != nil, "NewKernelCtx(): ctx==nil")
-	mL0.Hassert(wg != nil, "NewKernelCtx(): IKernelWg==nil")
-	mL0.Hassert(fnCancel != nil, "NewKernelCtx(): fnCancel==nil")
+	helpers.Hassert(ctx != nil, "NewKernelCtx(): ctx==nil", []any{})
+	helpers.Hassert(wg != nil, "NewKernelCtx(): IKernelWg==nil", []any{})
+	helpers.Hassert(fnCancel != nil, "NewKernelCtx(): fnCancel==nil", []any{})
 
 	paramLogBuf := &mL1.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),

+ 6 - 4
v4/lev2/kmodule/kmodule.go

@@ -8,12 +8,14 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/module_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local"
 )
@@ -31,7 +33,7 @@ type kModule struct {
 
 // NewKernelModule -- возвращает новый модуль на основе ядра.
 func NewKernelModule(name *module_name.AModuleName) kspec.IKernelModule {
-	mL0.Hassert(name != nil, "NewKernelModule(): name==nil")
+	helpers.Hassert(name != nil, "NewKernelModule(): name==nil", []any{})
 	kCtx := kctx.GetKernelCtx()
 	sf := &kModule{
 		kCtx:      kCtx,
@@ -63,7 +65,7 @@ func (sf *kModule) Ctx() comp_spec.ILocalCtx {
 
 // Run -- запускает модуль в работу.
 func (sf *kModule) Run() {
-	mL0.Hassert(false, "kModule.Run(): module='%v', parent not realized this method", sf.name)
+	helpers.Hassert(false, "kModule.Run(): module='%v', parent not realized this method", []any{sf.name})
 }
 
 // Name -- возвращает уникальное имя модуля.
@@ -73,7 +75,7 @@ func (sf *kModule) Name() *module_name.AModuleName {
 
 // IsWork -- возвращает признак состояния работы.
 func (sf *kModule) IsWork() core_spec.EBool {
-	mL0.Hassert(false, "kModule.IsWork(): module='%v', parent not realized this method", sf.name)
+	helpers.Hassert(false, "kModule.IsWork(): module='%v', parent not realized this method", []any{sf.name})
 	return ebool.NewEBool(false)
 }
 
@@ -85,7 +87,7 @@ func (sf *kModule) Live() string {
 // Сигнал жизни, каждые 5 сек публикует в шину метку.
 func (sf *kModule) sigLive() {
 	var (
-		topic  = bus_ent.NewTopicFix(bus_ent.ATopic(sf.name.Get()) + "_live")
+		topic  = bus_ent.ITopicFix(topic.NewTopic(bus_ent.ATopic(sf.name.Get()) + "_live"))
 		iPhase = 0
 		res    mL0.IResult[core_spec.EBool]
 	)

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

@@ -5,7 +5,6 @@ import (
 	"fmt"
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/module_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
@@ -83,9 +82,9 @@ func (sf *kMonolit) Name() string {
 func (sf *kMonolit) Add(module kspec.IKernelModule) {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
-	mL0.Hassert(module != nil, "kMonolit.Add(): module==nil")
+	mKh.Hassert(module != nil, "kMonolit.Add(): module==nil", []any{})
 	_, isOk := sf.dict[module.Name()]
-	mL0.Hassert(!isOk, "kMonolit.Add(): module(%v) already exists", module.Name())
+	mKh.Hassert(!isOk, "kMonolit.Add(): module(%v) already exists", []any{module.Name()})
 	sf.dict[module.Name()] = module
 	sf.log.Debug("kMonolit.Add(): module='%v'", module.Name())
 	if sf.isWork.Get() {

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

@@ -3,10 +3,11 @@ package kmonolit
 import (
 	"os"
 	"testing"
+	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKd "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/module_name"
+
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
@@ -109,7 +110,7 @@ func (sf *tester) newGood1() {
 	kCtx := kctx.GetKernelCtx()
 	kCtx.Set("isLocal", true, "type bus")
 	for {
-		mL0.SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		if kCtx.Get("isLocal") != nil {
 			break
 		}

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

@@ -3,8 +3,8 @@ package kserv_http
 import (
 	"os"
 	"testing"
+	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
@@ -64,7 +64,7 @@ func (sf *tester) newBad3() {
 	go serv.Run()
 	count := 0
 	for count < 20 {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		count++
 	}
 }

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

@@ -6,8 +6,8 @@ package kwg
 import (
 	"context"
 	"sync"
+	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
@@ -99,7 +99,7 @@ func (sf *kernelWg) Done(name *stream_name.AStreamName) {
 // Wait -- блокирующий вызов; возвращает управление, только когда все потоки завершили работу.
 func (sf *kernelWg) Wait() {
 	for {
-		mKh.SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		if !sf.isWork.Get() {
 			break
 		}
@@ -112,7 +112,7 @@ func (sf *kernelWg) Add(name *stream_name.AStreamName) {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Add(): stream='%v'", name)
-	mL0.Hassert(sf.isWork.Get(), "Add(): stream=%v, work end", name)
+	mKh.Hassert(sf.isWork.Get(), "Add(): stream=%v, work end", []any{name})
 	mKh.Hassert(name.Get() != "", "Add(): name stream is empty")
 	_, isOk := sf.dictStream[name]
 	mKh.Hassert(!isOk, "Add(): stream '%v' already exists", name)
@@ -128,7 +128,7 @@ func (sf *kernelWg) close() {
 		return len(sf.dictStream) == 0
 	}
 	for {
-		mKh.SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		if fnDone() {
 			break
 		}

+ 2 - 1
v4/lev2/log_topic/log_topic.go

@@ -6,6 +6,7 @@ import (
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
@@ -18,7 +19,7 @@ type LogTopic struct {
 
 // NewLogTopic -- возвращает новый элемент лога.
 func NewLogTopic(topic topic.ITopicFix, client bus_spec.IBusClient) mL0.IResult[*LogTopic] {
-	mL0.Hassert(topic != nil, "NewLogTopic(): topic==nil")
+	helpers.Hassert(topic != nil, "NewLogTopic(): topic==nil", []any{})
 	if client == nil {
 		err := fmt.Errorf("NewLogTopic(): IBusClient==nil")
 		return mL0.NewErr[*LogTopic](err)

+ 2 - 4
v4/lev2/log_topic/log_topic_test.go

@@ -5,6 +5,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_local/client_bus_local"
 )
 
@@ -25,14 +26,11 @@ func (sf *tester) new() {
 	sf.newGood1()
 }
 
-var (
-	qTopicTest = bus_ent.NewTopicFix("test_topic")
-)
-
 // Правильное создание топика.
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
 	busClient := client_bus_local.NewClientBusLocal()
+	qTopicTest := bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 	client := NewLogTopic(qTopicTest, busClient).Hassert("newGood1()")
 	res := client.Pub([]byte("test_msg"))
 	if res.IsErr() {

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

@@ -2,9 +2,9 @@
 package kv_bucket_base
 
 import (
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/store_key"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 )
 
@@ -33,9 +33,9 @@ type KvBucketBase struct {
 
 // NewKvBucketBase -- создание нового базового бакета хранилища KV.
 func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
-	mL0.Hassert(name != "", "NewKvBucketBase: name is empty")
-	mL0.Hassert(level >= 0, "NewKvBucketBase: level is negative")
-	mL0.Hassert(number >= 0, "NewKvBucketBase: number is negative")
+	helpers.Hassert(name != "", "NewKvBucketBase: name is empty", []any{})
+	helpers.Hassert(level >= 0, "NewKvBucketBase: level is negative", []any{})
+	helpers.Hassert(number >= 0, "NewKvBucketBase: number is negative", []any{})
 	sf := &KvBucketBase{
 		Name_:      name,
 		Level_:     level,

+ 1 - 1
v4/lev2/lti/bus_ent/handler_name/handler_name_test.go

@@ -21,7 +21,7 @@ func TestNewAHandlerName_ok(t *testing.T) {
 			if hn == nil {
 				t.Fatalf("NewAHandlerName(): nil")
 			}
-			if hn.String() != tc {
+			if string(hn.val) != tc {
 				t.Fatalf("Get(): got=%q want=%q", hn.Get(), tc)
 			}
 			if got := hn.Get(); string(got) != tc {

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go

@@ -10,6 +10,7 @@ import (
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
 
@@ -28,7 +29,7 @@ func NewMockHandlerServe(topic bus_ent.ITopicFix, name string) *MockHandlerServe
 	mKh.Hassert(name != "", "NewMockHandlerServe(): name is empty")
 	sf := &MockHandlerServe{
 		Topic_: topic,
-		Name_:  bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(name)),
+		Name_:  bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(name))),
 		IsBad_: safe_bool.NewSafeBool(false),
 	}
 	_ = bus_spec.IBusHandlerServe(sf)

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve_test.go

@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 )
 
 type tester struct {
@@ -55,7 +56,7 @@ func (sf *tester) new() {
 }
 
 var (
-	qTopicTest = bus_ent.NewTopicFix("test_topic")
+	qTopicTest = bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 )
 
 func (sf *tester) newGood1() {

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -8,6 +8,7 @@ import (
 
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
 
@@ -26,7 +27,7 @@ func NewMockHandSubHttp(topic bus_ent.ITopicFix, webHook string) bus_spec.IBusHa
 	mKh.Hassert(webHook != "", "NewHandlerHttpSub(): webHook is empty")
 	sf := &MockHandSubHttp{
 		Topic_:   topic,
-		Name_:    bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(webHook + "_" + rand.Text())),
+		Name_:    bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(webHook + "_" + rand.Text()))),
 		WebHook_: webHook,
 	}
 	return sf

+ 4 - 2
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go

@@ -12,6 +12,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/handler_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 )
 
 const (
@@ -96,7 +98,7 @@ func (sf *tester) new() {
 }
 
 var (
-	qTopicTest = bus_ent.NewTopicFix("test_topic")
+	qTopicTest = bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 )
 
 func (sf *tester) newGood1() {
@@ -113,7 +115,7 @@ func (sf *tester) newGood1() {
 	if name := sf.hand.Name(); !strings.Contains(name.String(), "/test/local_") {
 		sf.t.Fatalf("newGood1(): name(%v)!='/test/local_'", name)
 	}
-	sf.hand.SetName(bus_ent.NewHandlerNameFix("test_name"))
+	sf.hand.SetName(bus_ent.IHandlerNameFix(handler_name.NewHandlerName("test_name")))
 	if name := sf.hand.Name(); name.Get() != "test_name" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_name'", name)
 	}

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -7,6 +7,7 @@ import (
 
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
 
@@ -23,7 +24,7 @@ func NewMockHandlerSub(topic bus_ent.ITopicFix, localHook string) *MockHandlerSu
 	mKh.Hassert(localHook != "", "NewMockHandlerSub(): name is empty")
 	sf := &MockHandlerSub{
 		Topic_: topic,
-		Name_:  bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook + "_" + rand.Text())),
+		Name_:  bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(localHook + "_" + rand.Text()))),
 	}
 	_ = bus_spec.IBusHandlerSubscribe(sf)
 	return sf

+ 2 - 1
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 )
 
 type tester struct {
@@ -41,7 +42,7 @@ func (sf *tester) new() {
 }
 
 var (
-	qTopicTest = bus_ent.NewTopicFix("test_topic")
+	qTopicTest = bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 )
 
 func (sf *tester) newGood1() {

+ 2 - 2
v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook.go

@@ -4,7 +4,7 @@ package dict_sub_hook
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
@@ -44,7 +44,7 @@ func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 func (sf *dictSubHook) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	mL0.Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil")
+	helpers.Hassert(handler != nil, "dictSubHook.Subscribe(): handler==nil", []any{})
 	handlerName := handler.Name()
 	sf.dict[handlerName.Get()] = struct{}{}
 	sf.kCtx.Set(handlerName.String(), handler, "subscribe handler")

+ 3 - 2
v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_local"
 )
 
@@ -15,8 +16,8 @@ type tester struct {
 }
 
 var (
-	qTopicHand1 = bus_ent.NewTopicFix("hand_topic1")
-	qTopicHand2 = bus_ent.NewTopicFix("hand_topic2")
+	qTopicHand1 = bus_ent.ITopicFix(topic.NewTopic("hand_topic1"))
+	qTopicHand2 = bus_ent.ITopicFix(topic.NewTopic("hand_topic2"))
 )
 
 func TestDictSubWebHook(t *testing.T) {

+ 3 - 2
v4/lev2/lti/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -5,6 +5,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_serve"
 )
 
@@ -15,8 +16,7 @@ type tester struct {
 }
 
 var (
-	qTopicBad  = bus_ent.NewTopicFix("test_bad_topic")
-	qTopicServ = bus_ent.NewTopicFix("topic_hand_serv")
+	qTopicServ = bus_ent.ITopicFix(topic.NewTopic("topic_hand_serv"))
 )
 
 func TestDictSub(t *testing.T) {
@@ -116,6 +116,7 @@ func (sf *tester) addBad1() {
 // Вызов несуществующего топика.
 func (sf *tester) sendBad1() {
 	sf.t.Log("sendBad1")
+	qTopicBad := bus_ent.ITopicFix(topic.NewTopic("test_bad_topic"))
 	res := sf.dict.SendRequest(qTopicBad, []byte("test"))
 	if res.IsOk() {
 		sf.t.Fatalf("sendBad1(): err==nil")

+ 3 - 3
v4/lev2/lti/kbus/dict_topic_sub/dict_topic_sub.go

@@ -4,7 +4,7 @@ package dict_topic_sub
 import (
 	"sync"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
@@ -52,7 +52,7 @@ func (sf *dictTopicSub) Read(topic bus_ent.ITopicFix, binMsg []byte) {
 func (sf *dictTopicSub) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
 	sf.Lock()
 	defer sf.Unlock()
-	mL0.Hassert(handler != nil, "dictTopicSub.Subscribe(): handler==nil")
+	helpers.Hassert(handler != nil, "dictTopicSub.Subscribe(): handler==nil", []any{})
 	topic := handler.Topic()
 	dictSubHook := sf.dictTopicHook[topic.Get()]
 	if dictSubHook == nil {
@@ -66,7 +66,7 @@ func (sf *dictTopicSub) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
 func (sf *dictTopicSub) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	sf.Lock()
 	defer sf.Unlock()
-	mL0.Hassert(handler != nil, "dictTopicSub.Unsubscribe(): handler==nil")
+	helpers.Hassert(handler != nil, "dictTopicSub.Unsubscribe(): handler==nil", []any{})
 	topic := handler.Topic()
 	dictSubHook := sf.dictTopicHook[topic.Get()]
 	if dictSubHook == nil {

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

@@ -2,9 +2,10 @@ package dict_topic_sub
 
 import (
 	"testing"
+	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_local"
 )
 
@@ -15,11 +16,11 @@ type tester struct {
 }
 
 var (
-	qTopicDictSub  = bus_ent.NewTopicFix("topic_dict_sub")
-	qTopicDictSub1 = bus_ent.NewTopicFix("topic_dict_sub1")
-	qTopicTest     = bus_ent.NewTopicFix("test_test")
-	qTopicTestBad  = bus_ent.NewTopicFix("test_bad_topic")
-	qTopicEmpty    = bus_ent.NewTopicFix("")
+	qTopicDictSub  = bus_ent.ITopicFix(topic.NewTopic("topic_dict_sub"))
+	qTopicDictSub1 = bus_ent.ITopicFix(topic.NewTopic("topic_dict_sub1"))
+	qTopicTest     = bus_ent.ITopicFix(topic.NewTopic("test_test"))
+	qTopicTestBad  = bus_ent.ITopicFix(topic.NewTopic("test_bad_topic"))
+	qTopicEmpty    = bus_ent.ITopicFix(topic.NewTopic(""))
 )
 
 func TestDictSub(t *testing.T) {
@@ -48,13 +49,13 @@ func (sf *tester) unsub1() {
 	sf.dict.Unsubscribe(hand)
 	count := 0
 	for count < 100 {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		count++
 	}
 	sf.dict.Read(qTopicDictSub, []byte("test test"))
 	count = 0
 	for count < 200 {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		count++
 	}
 }

+ 2 - 1
v4/lev2/lti/kbus_base/kbus_base.go

@@ -9,6 +9,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -85,7 +86,7 @@ func (sf *KBusBase) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 // Subscribe -- подписывает обработчик на топик.
 func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) core_spec.IResult[core_spec.EBool] {
 	sf.log.Debug("KBusBase.Subscribe(): handler='%v'", handler.Name())
-	mL0.Hassert(!sf.IsWork_.Get(), "KBusBase.Subscribe():  handler='%v', bus already closed", handler.Name())
+	helpers.Hassert(!sf.IsWork_.Get(), "KBusBase.Subscribe():  handler='%v', bus already closed", []any{handler.Name()})
 	sf.dictSub.Subscribe(handler)
 	return mL0.NewOk(ebool.NewEBool(true))
 }

+ 5 - 4
v4/lev2/lti/kbus_base/kbus_base_test.go

@@ -5,6 +5,7 @@ import (
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_serve"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_local"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
@@ -19,8 +20,8 @@ type tester struct {
 
 var (
 	//go:fix inline
-	qNameSub   = bus_ent.NewTopicFix("topic_hand_sub")
-	qNameServe = bus_ent.NewTopicFix("topic_hand_serv")
+	qNameSub   = bus_ent.ITopicFix(topic.NewTopic("topic_hand_sub"))
+	qNameServe = bus_ent.ITopicFix(topic.NewTopic("topic_hand_serv"))
 )
 
 func TestKernelBusLocal(t *testing.T) {
@@ -90,7 +91,7 @@ func (sf *tester) servBad1() {
 }
 
 var (
-	qName1 = bus_ent.NewTopicFix("test_topic1")
+	qName1 = bus_ent.ITopicFix(topic.NewTopic("test_topic1"))
 )
 
 // Нет такого топика.
@@ -141,7 +142,7 @@ func (sf *tester) new() {
 }
 
 var (
-	qNameA = bus_ent.NewTopicFix("test_topic")
+	qNameA = bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 )
 
 // Закрытие шины.

+ 12 - 10
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -13,6 +13,7 @@ import (
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/etypes/ebool"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/comp_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
@@ -43,7 +44,7 @@ func NewClientBusHttp(urlRemote string) bus_spec.IBusClient {
 	}
 	log := mL1.NewLogBuf(param)
 	log.Debug("NewClientBusHttp()")
-	mL0.Hassert(urlRemote != "", "NewClientBusHttp(): urlRemote is empty")
+	helpers.Hassert(urlRemote != "", "NewClientBusHttp(): urlRemote is empty", []any{})
 	kCtx := kctx.GetKernelCtx()
 	resLocal := safe_string.NewSafeStringGetenv("LOCAL_HTTP_URL")
 	resLocal.Hassert("NewClientBusHttp(): in get env LOCAL_HTTP_URL)")
@@ -63,7 +64,7 @@ func NewClientBusHttp(urlRemote string) bus_spec.IBusClient {
 // Unsubscribe -- отписывается от топика в дистанционной шине.
 func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	_uuid, err := uuid.NewV6()
-	mL1.Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in generate UUID v6, err=\n\t%v", err)
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Unsubscribe(): in generate UUID v6, err=\n\t%v", err)
 
 	req := &dot.UnsubReq{
 		HandlerName_: handler.Name().Get(),
@@ -71,11 +72,12 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	}
 	req.SelfCheck()
 	binReq, err := json.MarshalIndent(req, "", "  ")
-	mL1.Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in marshal to JSON unsubscribe request, err=\n\t%v", err)
+	mL1.FnHassert(helpers.Hassert)(err == nil,
+		"ClientBusHttp.Unsubscribe(): in marshal to JSON unsubscribe request, err=\n\t%v", err)
 	reader := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/unsub", reader)
-	mL1.Hassert()(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v", err)
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v", err)
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
@@ -98,7 +100,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 // Subscribe -- подписывается на топик в дистанционной шине.
 func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IResult[mKs.EBool] {
 	_uuid, err := uuid.NewV6()
-	mL0.Hassert(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
+	helpers.Hassert(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", []any{err})
 	req := &dot.SubscribeReq{
 		Topic_:   handler.Topic().Get(),
 		Uuid_:    _uuid.String(),
@@ -109,7 +111,7 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IR
 	body := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/sub", body)
-	mL0.Hassert(err != nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v")
+	helpers.Hassert(err != nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v", []any{})
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
@@ -137,7 +139,7 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IR
 // SendRequest -- отправляет в дистанционную шину запрос.
 func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0.IResult[[]byte] {
 	_uuid, err := uuid.NewV6()
-	mL1.Hassert()(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
 	req := &dot.ServeReq{
 		Topic_:  topic.Get(),
 		Uuid_:   _uuid.String(),
@@ -148,7 +150,7 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 	body := strings.NewReader(string(_binReq))
 
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/request", body)
-	mL1.Hassert()(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
@@ -188,7 +190,7 @@ func (sf *ClientBusHttp) RegisterServe(handler bus_spec.IBusHandlerServe) mL0.IR
 // Publish -- публикует сообщение в дистанционной шину.
 func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IResult[mKs.EBool] {
 	_uuid, err := uuid.NewV6()
-	mL1.Hassert()(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
 	req := &dot.PublishReq{
 		Topic_:  topic.Get(),
 		Uuid_:   _uuid.String(),
@@ -199,7 +201,7 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 	body := strings.NewReader(string(binReq))
 
 	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/pub", body)
-	mL1.Hassert()(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
+	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {

+ 7 - 6
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go

@@ -5,13 +5,14 @@ import (
 	"os"
 	"strings"
 	"testing"
+	"time"
 
-	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_serve"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_base"
@@ -35,9 +36,9 @@ type tester struct {
 
 var (
 	//go:fix inline
-	qNameSub = bus_ent.NewTopicFix("test_topic_sub")
+	qNameSub = bus_ent.ITopicFix(topic.NewTopic("test_topic_sub"))
 	//go:fix inline
-	qNameServ = bus_ent.NewTopicFix("test_topic_serv")
+	qNameServ = bus_ent.ITopicFix(topic.NewTopic("test_topic_serv"))
 )
 
 func TestClientBusHttp(t *testing.T) {
@@ -114,7 +115,7 @@ func (sf *tester) sendBad2() {
 }
 
 var (
-	qNameBad = bus_ent.NewTopicFix("test_bad_topic")
+	qNameBad = bus_ent.ITopicFix(topic.NewTopic("test_bad_topic"))
 )
 
 // Нет такого топика.
@@ -203,7 +204,7 @@ func (sf *tester) pubGood1() {
 		sf.t.Fatalf("pubGood1(): err=%v", res.Err())
 	}
 	for {
-		mL0.SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		if sf.handSub.Msg() != "" {
 			break
 		}
@@ -214,7 +215,7 @@ func (sf *tester) pubGood1() {
 }
 
 var (
-	qNameTest = bus_ent.NewTopicFix("test_topic")
+	qNameTest = bus_ent.ITopicFix(topic.NewTopic("test_topic"))
 )
 
 // Левый адрес.

+ 4 - 3
v4/lev2/lti/kbus_http/kbus_http.go

@@ -14,6 +14,7 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/dot"
@@ -88,7 +89,7 @@ func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 // Процесс подписки веб-хука.
 func (sf *kBusHttp) processSubscribe(req *dot.SubscribeReq) *dot.SubscribeResp {
 	req.SelfCheck()
-	topic := bus_ent.NewTopicFix(req.Topic_)
+	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	handler := mock_hand_sub_http.NewMockHandSubHttp(topic, req.WebHook_)
 	resp := &dot.SubscribeResp{
 		Status_: "ok",
@@ -129,7 +130,7 @@ func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 // Выполняет процесс публикации.
 func (sf *kBusHttp) processPublish(req *dot.PublishReq) *dot.PublishResp {
 	req.SelfCheck()
-	topic := bus_ent.NewTopicFix(req.Topic_)
+	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	res := sf.Publish(topic, req.BinMsg_)
 	resp := &dot.PublishResp{
 		Status_: "ok",
@@ -168,7 +169,7 @@ func (sf *kBusHttp) postSendRequest(ctx fiber.Ctx) error {
 // Обрабатывает входящий запрос.
 func (sf *kBusHttp) processSendRequest(req *dot.ServeReq) *dot.ServeResp {
 	req.SelfCheck()
-	topic := bus_ent.NewTopicFix(req.Topic_)
+	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	res := sf.SendRequest(topic, req.BinReq_)
 	resp := &dot.ServeResp{
 		Status_: "ok",

+ 9 - 7
v4/lev2/lti/kbus_http/kbus_http_test.go

@@ -7,11 +7,13 @@ import (
 	"os"
 	"strings"
 	"testing"
+	"time"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_serve"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_local"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/dot"
@@ -28,8 +30,8 @@ const (
 )
 
 var (
-	qNameSub  = bus_ent.NewTopicFix("topic_sub")
-	qNameServ = bus_ent.NewTopicFix("topic_serv")
+	qNameSub  = bus_ent.ITopicFix(topic.NewTopic("topic_sub"))
+	qNameServ = bus_ent.ITopicFix(topic.NewTopic("topic_serv"))
 )
 
 func TestKernelBusHttp(t *testing.T) {
@@ -131,7 +133,7 @@ func (sf *tester) unsubGood1() {
 	}
 	count := 0
 	for count < 100 {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		count++
 	}
 	req := &dot.UnsubReq{
@@ -150,7 +152,7 @@ func (sf *tester) unsubBad2() {
 	Bus_.Unsubscribe(sf.handSub)
 	count := 0
 	for count < 100 {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		count++
 	}
 	req := &dot.UnsubReq{
@@ -278,7 +280,7 @@ func (sf *tester) pubGood1() {
 	}
 	_ = Bus_.processPublish(req)
 	for {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		msg := sf.handSub.Msg()
 		if msg != "" {
 			break
@@ -389,7 +391,7 @@ func (sf *tester) subGood1() {
 }
 
 var (
-	qNameEmpty = bus_ent.NewTopicFix("")
+	qNameEmpty = bus_ent.ITopicFix(topic.NewTopic(""))
 )
 
 // Проверка кривых полей запроса в процессе подписки.
@@ -519,7 +521,7 @@ func (sf *tester) reqGood1() {
 }
 
 var (
-	qNameBad = bus_ent.NewTopicFix("bad_topic")
+	qNameBad = bus_ent.ITopicFix(topic.NewTopic("bad_topic"))
 )
 
 // Нет такого топика для запросов.

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

@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
 )
 
@@ -23,7 +24,7 @@ func TestClientBusLocal(t *testing.T) {
 func (sf *tester) new() {
 	sf.t.Log("new")
 	//go:fix inline
-	qTopicLocal := bus_ent.NewTopicFix("local_topic")
+	qTopicLocal := bus_ent.ITopicFix(topic.NewTopic("local_topic"))
 	sf.lClient = NewClientBusLocal()
 	if sf.lClient == nil {
 		sf.t.Fatalf("new(): client==nil")

+ 3 - 2
v4/lev2/lti/kbus_local/kbus_local_test.go

@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_serve"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_mock/mock_hand_sub_local"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_spec"
@@ -17,8 +18,8 @@ type tester struct {
 }
 
 func TestKernelBusLocal(t *testing.T) {
-	qTopicSub := bus_ent.NewTopicFix("topic_hand_sub")
-	qTopicServ := bus_ent.NewTopicFix("topic_hand_serv")
+	qTopicSub := bus_ent.ITopicFix(topic.NewTopic("topic_hand_sub"))
+	qTopicServ := bus_ent.ITopicFix(topic.NewTopic("topic_hand_serv"))
 	sf := &tester{
 		t:        t,
 		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicSub, "mock_hand_sub"),

+ 2 - 1
v4/lev2/wui/wui_button/wui_button.go

@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_hx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_text"
@@ -25,7 +26,7 @@ type FnBtnBack func(map[string]string) mL0.IResult[string]
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
 func NewWuiButton(text string, fnBack FnBtnBack) *WuiButton {
-	mL0.Hassert(fnBack != nil, "NewWuiButton(): text=%q, fnBack==nil", text)
+	helpers.Hassert(fnBack != nil, "NewWuiButton(): text=%q, fnBack==nil", []any{text})
 	sf := &WuiButton{
 		IWuiWidget: wui_widget.NewWuiWidget(),
 		text:       wui_text.NewWuiText(text),

+ 2 - 2
v4/lev3/mod_serv_http/page_monolit/page_monolit_test.go

@@ -4,8 +4,8 @@ import (
 	"net/http"
 	"os"
 	"testing"
+	"time"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit"
@@ -134,7 +134,7 @@ func (sf *tester) new() {
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18310/")
 	sf.ctx.Set("isLocal", true, "testing")
 	for {
-		SleepMs()
+		time.Sleep(time.Millisecond * 1)
 		if sf.ctx.Get("isLocal") != nil {
 			break
 		}