소스 검색

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

SVI 4 달 전
부모
커밋
e375efefb9
38개의 변경된 파일과 176개의 추가작업 그리고 145개의 파일을 삭제
  1. 1 1
      v4/kern.go
  2. 19 2
      v4/lev0/defs/defs.go
  3. 2 2
      v4/lev0/option/option_test.go
  4. 1 1
      v4/lev0/result/result_test.go
  5. 3 3
      v4/lev1/mock_env/mock_env.go
  6. 1 1
      v4/lev2/kmodule/mod_stat/mod_stat_sec/mod_stat_sec.go
  7. 3 3
      v4/lev2/kserv_http/kserv_http.go
  8. 4 4
      v4/lev2/lsi/kstore_kv/kstore_kv.go
  9. 6 5
      v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go
  10. 7 6
      v4/lev2/lsi/store_ent/rec_meta/rec_meta.go
  11. 2 2
      v4/lev2/lsi/store_ent/rec_meta/rec_meta_test.go
  12. 2 2
      v4/lev2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  13. 7 6
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  14. 3 3
      v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go
  15. 6 5
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  16. 5 4
      v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go
  17. 6 5
      v4/lev2/lti/dot/msg_pub/msg_pub.go
  18. 3 2
      v4/lev2/lti/dot/msg_pub/msg_pub_test.go
  19. 8 7
      v4/lev2/lti/dot/msg_sub/msg_sub.go
  20. 4 3
      v4/lev2/lti/dot/msg_sub/msg_sub_test.go
  21. 3 2
      v4/lev2/lti/kbus/dict_sub_hook/dict_sub_hook_test.go
  22. 3 2
      v4/lev2/lti/kbus/dict_topic_sub/dict_topic_sub_test.go
  23. 1 1
      v4/lev2/lti/kbus_base/kbus_base_test.go
  24. 18 18
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go
  25. 13 13
      v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go
  26. 6 7
      v4/lev2/lti/kbus_http/kbus_http.go
  27. 16 16
      v4/lev2/lti/kbus_http/kbus_http_test.go
  28. 2 1
      v4/lev2/lti/kbus_local/kbus_local_test.go
  29. 1 1
      v4/lev2/wui/wui.go
  30. 3 3
      v4/lev2/wui/wui_button/wui_button.go
  31. 2 2
      v4/lev2/wui/wui_button/wui_button_test.go
  32. 2 2
      v4/lev2/wui/wui_test.go
  33. 2 1
      v4/lev2/wui/wui_types/iwui_button.go
  34. 4 3
      v4/lev3/mod_serv_http/btn_modules/btn_modules.go
  35. 1 1
      v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go
  36. 3 2
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go
  37. 1 1
      v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go
  38. 2 2
      v4/lev3/mod_wui/mod_wui_test.go

+ 1 - 1
v4/kern.go

@@ -156,7 +156,7 @@ func NewClientBusLocal() bus_spec.IBusClient {
 //
 
 func NewClientBusHttp(url defs.ITxtFix) bus_spec.IBusClient {
-	client := client_bus_http.NewClientBusHttp(url.String())
+	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
 

+ 19 - 2
v4/lev0/defs/defs.go

@@ -3,6 +3,7 @@ package defs
 
 import (
 	"fmt"
+	"strings"
 )
 
 // "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
@@ -27,6 +28,8 @@ type ITxtFix interface {
 	Byte() []byte
 	// Rune -- возвращает внутреннюю строку в виде рун.
 	Rune() []rune
+	// TrimSuffix -- обрезает суффикс строки
+	TrimSuffix(any) ITxtFix
 }
 
 // ITxtMut -- интерфейс к изменяемой внутренней строке.
@@ -59,13 +62,13 @@ func Txt[T TxtConstraint](msg T, arg ...any) *KTxt {
 }
 
 // TxtFix -- создать новую строку.
-func TxtFix(msg ATxt, arg ...any) ITxtFix {
+func TxtFix[T TxtConstraint](msg T, arg ...any) ITxtFix {
 	sf := Txt(msg, arg...)
 	return sf
 }
 
 // TxtMut -- создать новую мутабельную строку.
-func TxtMut(msg ATxt, arg ...any) ITxtMut {
+func TxtMut[T TxtConstraint](msg T, arg ...any) ITxtMut {
 	_msg := fmt.Sprintf(string(msg), arg...)
 	sf := &KTxt{
 		val: ATxt(_msg),
@@ -78,6 +81,13 @@ func (sf KTxt) Get() ATxt {
 	return sf.val
 }
 
+// TrimSuffix -- обрезает суффикс строки
+func (sf *KTxt) TrimSuffix(suffix any) ITxtFix {
+	suf := fmt.Sprintf("%v", suffix)
+	txt := strings.TrimSuffix(string(sf.val), suf)
+	return Txt(txt)
+}
+
 // Set -- изменение внутренней строки
 func (sf *KTxt) Set(msg ATxt) {
 	sf.val = msg
@@ -127,6 +137,13 @@ func WrapErr(err error) IErr {
 	return &KErr{err}
 }
 
+// TrimSuffix -- обрезает суффикс строки.
+func (e *KErr) TrimSuffix(suffix any) ITxtFix {
+	suf := fmt.Sprintf("%v", suffix)
+	txt := strings.TrimSuffix(e.err.Error(), suf)
+	return Txt(txt)
+}
+
 // Rune -- возвращает внутреннюю строку в виде рун.
 func (e *KErr) Rune() []rune {
 	return []rune(e.err.Error())

+ 2 - 2
v4/lev0/option/option_test.go

@@ -40,10 +40,10 @@ func (sf *testerOption) createNoneGood1() {
 	if !opt.IsNone() {
 		sf.t.Fatalf("createNoneGood1(): not err")
 	}
-	if val := opt.SomeOr(defs.Txt("test2")); val.Get() != "test2" {
+	if val := opt.SomeOr(defs.TxtFix("test2")); val.Get() != "test2" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
-	if val := opt.SomeOr(defs.Txt("test1")); val.Get() != "test1" {
+	if val := opt.SomeOr(defs.TxtFix("test1")); val.Get() != "test1" {
 		sf.t.Fatalf("createNoneGood1(): val bad")
 	}
 	if val := opt.SomeOrFn(sf.fnWrap2); val.Get() != "test5" {

+ 1 - 1
v4/lev0/result/result_test.go

@@ -189,7 +189,7 @@ func (sf *tester) createOkGood2() {
 	if val := res.Ok(); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}
-	txt1:=defs.Txt("test1")
+	txt1 := defs.Txt("test1")
 	if val := res.OkOr(txt1); val != str {
 		sf.t.Fatalf("createOkGood1(): val bad")
 	}

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

@@ -17,9 +17,9 @@ type IMockEnv interface {
 // MockEnv -- объект мок-окружения.
 type MockEnv struct {
 	dictEnv  map[defs.ATxt]defs.ITxtFix // Словарь переменных окружения
-	pwd      defs.ITxtFix                // Текущий путь процесса
-	fileName defs.ITxtFix                // Полный путь к .env файлу
-	strEnv   defs.ITxtFix                // Фактическое содержимое .env файла
+	pwd      defs.ITxtFix               // Текущий путь процесса
+	fileName defs.ITxtFix               // Полный путь к .env файлу
+	strEnv   defs.ITxtFix               // Фактическое содержимое .env файла
 }
 
 // MakeEnv -- возвращает новое мок-окружение.

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

@@ -17,7 +17,7 @@ import (
 type ModStatSec struct {
 	sync.RWMutex
 	lst      []defs.Int // Список значений за последние 60 сек
-	momentAt int64 // Метка времени для учёта текущей секунды
+	momentAt int64      // Метка времени для учёта текущей секунды
 	bufSvg   *bytes.Buffer
 }
 

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

@@ -81,13 +81,13 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 
 	optMonolit := kCtx.Get(defs.Txt("monolitName"))
 	optMonolit.Hassert(msg1)
-	strMonolit := optMonolit.Some().Val().(string)
+	strMonolit := optMonolit.Some().Val().(defs.ITimeFix)
 	confFiber := fiber.Config{
-		ServerHeader: strMonolit,
+		ServerHeader: strMonolit.String(),
 		UnescapePath: true,
 		ReadTimeout:  time.Second * 15,
 		WriteTimeout: time.Second * 15,
-		AppName:      strMonolit,
+		AppName:      strMonolit.String(),
 	}
 	sf := &kServHttp{
 		kCtx:     kCtx,

+ 4 - 4
v4/lev2/lsi/kstore_kv/kstore_kv.go

@@ -36,7 +36,7 @@ type kStoreKv struct {
 	lCtx      comp_spec.ILocalCtx
 	log       comp_spec.ILogBuf
 	wg        kspec.IKernelWg
-	storePath string
+	storePath defs.ITxtFix
 	db        *badger.DB
 	isWork    core_spec.ISafeBool
 }
@@ -180,10 +180,10 @@ func (sf *kStoreKv) open() {
 	mKh.Hassert(strPath != "", "open(): env LOCAL_STORE_PATH not set")
 	pwd, err := os.Getwd()
 	mKh.Hassert(err == nil, "open(): in get PWD, err=\n\t%v", err)
-	sf.storePath = pwd + strPath + "/db_local"
-	err = os.MkdirAll(sf.storePath, 0750)
+	sf.storePath = defs.Txt(pwd + strPath + "/db_local")
+	err = os.MkdirAll(sf.storePath.String(), 0750)
 	mKh.Hassert(err == nil, "open(): in make dir %v, err=\n\t%v", sf.storePath, err)
-	sf.db, err = badger.Open(badger.DefaultOptions(sf.storePath))
+	sf.db, err = badger.Open(badger.DefaultOptions(sf.storePath.String()))
 	mKh.Hassert(err == nil, "open(): in open DB %v, err=\n\t%v", sf.storePath, err)
 	sf.wg.Add(storeStreamName)
 	sf.isWork.Set()

+ 6 - 5
v4/lev2/lsi/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

@@ -3,6 +3,7 @@ package kv_bucket_base
 
 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"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_key"
@@ -21,9 +22,9 @@ import (
 // Он должен быть разумным значением (например, до 100 МБ).
 // Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
-	Name_      string                               `json:"name"`       // Имя бакета
-	Level_     int                                  `json:"level"`      // Уровень бакета
-	Number_    int                                  `json:"num"`        // Номер бакета
+	Name_      defs.ITxtFix                         `json:"name"`       // Имя бакета
+	Level_     defs.Int                             `json:"level"`      // Уровень бакета
+	Number_    defs.Int                             `json:"num"`        // Номер бакета
 	Size_      int64                                `json:"size"`       // Размер бакета
 	SizeLimit_ int64                                `json:"size_limit"` // Лимит размера бакета
 	CreatedAt_ core_spec.ITime                      `json:"created_at"` // Время создания бакета
@@ -33,8 +34,8 @@ type KvBucketBase struct {
 }
 
 // NewKvBucketBase -- создание нового базового бакета хранилища KV.
-func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
-	helpers.Hassert(name != "", "NewKvBucketBase: name is empty", []any{})
+func NewKvBucketBase(name defs.ITxtFix, level, number defs.Int) *KvBucketBase {
+	helpers.Hassert(name.Get() != "", "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{

+ 7 - 6
v4/lev2/lsi/store_ent/rec_meta/rec_meta.go

@@ -3,6 +3,7 @@ package rec_meta
 
 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"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_key"
@@ -17,7 +18,7 @@ type IRecMeta interface {
 	// Vers -- версия записи
 	Vers() int64
 	// Operation -- тип операции над записью
-	Operation() string
+	Operation() defs.ITxtFix
 	// CreatedAt -- дата создания записи
 	CreatedAt() core_spec.ITime
 	// UpdateAt -- дата последнего обновления
@@ -33,13 +34,13 @@ type IRecMeta interface {
 type RecMeta struct {
 	Key_       rec_key.ARecKey    `json:"key"`       // Ключ
 	Vers_      int64              `json:"vers"`      // Версия записи
-	Operation_ string             `json:"operation"` // Тип операции над записью
+	Operation_ defs.ITxtFix       `json:"operation"` // Тип операции над записью
 	createdAt_ core_spec.ITime    `voc:"created_at"` // Дата создания записи
 	updateAt_  core_spec.ITimeMut `voc:"update_at"`  // Дата последнего обновления
 
 	// Хеш мета-информации записи (вместе с значением, но без этого поля разумеется)
-	Sha_    string `json:"sha"`
-	Offset_ int64  `json:"-"` // Смещение в файле, игнорируется при записи
+	Sha_    defs.ITxtFix `json:"sha"`
+	Offset_ int64        `json:"-"` // Смещение в файле, игнорируется при записи
 }
 
 // NewRecMeta -- создание новой мета-информации записи KV-хранилища.
@@ -48,7 +49,7 @@ func NewRecMeta(key rec_key.IRecKeyFix) *RecMeta {
 	sf := &RecMeta{
 		Key_:       key.Get(),
 		Vers_:      1,
-		Operation_: "create",
+		Operation_: defs.Txt("create"),
 		createdAt_: etime.NewETimeAuto(),
 		updateAt_:  etime.NewETimeAutoMut(),
 	}
@@ -73,7 +74,7 @@ func (sf *RecMeta) Vers() int64 {
 // Operation -- тип операции над записью.
 //
 
-func (sf *RecMeta) Operation() string {
+func (sf *RecMeta) Operation() defs.ITxtFix {
 	return sf.Operation_
 }
 

+ 2 - 2
v4/lev2/lsi/store_ent/rec_meta/rec_meta_test.go

@@ -34,13 +34,13 @@ func (sf *tester) gets() {
 	if updatedAt := sf.meta.updateAt_; updatedAt.Time().Get() != "" {
 		sf.t.Fatalf("gets(): updatedAt is not empty")
 	}
-	if operation := sf.meta.Operation_; operation != "create" {
+	if operation := sf.meta.Operation_; operation.Get() != "create" {
 		sf.t.Fatalf("gets(): operation(%v)!='create'", operation)
 	}
 	if sf.meta.Offset_ != 0 {
 		sf.t.Fatalf("gets(): offset_!=0")
 	}
-	if sf.meta.Sha_ != "" {
+	if sf.meta.Sha_.Get() != "" {
 		sf.t.Fatalf("gets(): Sha_!=''")
 	}
 }

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

@@ -23,12 +23,12 @@ type MockHandlerServe struct {
 }
 
 // NewMockHandlerServe -- возвращает новый обработчик подписки.
-func NewMockHandlerServe(topic bus_ent.ITopicFix, name string) *MockHandlerServe {
+func NewMockHandlerServe(topic bus_ent.ITopicFix, name bus_ent.AHandlerName) *MockHandlerServe {
 	mKh.Hassert(topic.Get() != "", "NewMockHandlerServe(): topic is empty")
 	mKh.Hassert(name != "", "NewMockHandlerServe(): name is empty")
 	sf := &MockHandlerServe{
 		Topic_: topic,
-		Name_:  bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(name)),
+		Name_:  bus_ent.NewHandlerNameFix(name),
 		IsBad_: safe_bool.NewSafeBool(false),
 	}
 	_ = bus_spec.IBusHandlerServe(sf)

+ 7 - 6
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -6,6 +6,7 @@ import (
 	"log"
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	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"
@@ -16,18 +17,18 @@ import (
 type MockHandSubHttp struct {
 	Name_    bus_ent.IHandlerNameFix // Уникальное имя обработчика
 	Topic_   bus_ent.ITopicFix       // Имя топика, на который подписан обработчик
-	WebHook_ string                  // Куда обращаться при запросах
+	WebHook_ defs.ITxtFix            // Куда обращаться при запросах
 	BinMsg_  []byte                  // Последнее бинарное сообщение
 	block    sync.RWMutex
 }
 
 // NewMockHandSubHttp -- возвращает новый обработчик подписки по HTTP.
-func NewMockHandSubHttp(topic bus_ent.ITopicFix, webHook string) bus_spec.IBusHandlerSubscribe {
+func NewMockHandSubHttp(topic bus_ent.ITopicFix, webHook defs.ITxtFix) bus_spec.IBusHandlerSubscribe {
 	mKh.Hassert(topic != nil, "NewHandlerHttpSub(): topic is empty")
-	mKh.Hassert(webHook != "", "NewHandlerHttpSub(): webHook is empty")
+	mKh.Hassert(webHook.Get() != "", "NewHandlerHttpSub(): webHook is empty")
 	sf := &MockHandSubHttp{
 		Topic_:   topic,
-		Name_:    bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(webHook + "_" + rand.Text()))),
+		Name_:    bus_ent.IHandlerNameFix(handler_name.NewHandlerName(bus_ent.AHandlerName(webHook.String() + "_" + rand.Text()))),
 		WebHook_: webHook,
 	}
 	return sf
@@ -62,8 +63,8 @@ func (sf *MockHandSubHttp) FnBack(binMsg []byte) {
 }
 
 // Msg -- возвращает строковое представление хранимого сообщения.
-func (sf *MockHandSubHttp) Msg() string {
+func (sf *MockHandSubHttp) Msg() defs.ITxtFix {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	return string(sf.BinMsg_)
+	return defs.Txt(string(sf.BinMsg_))
 }

+ 3 - 3
v4/lev2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go

@@ -70,7 +70,7 @@ func (sf *tester) backBad2() {
 	sf.t.Log("backBad2")
 	kernServ := kserv_http.GetKernelServHttp()
 	fiberApp := kernServ.Fiber()
-	sf.hand.WebHook_ = baseUrl + "test/local"
+	sf.hand.WebHook_ = defs.Txt(baseUrl + "test/local")
 	fiberApp.Post("/test/local", sf.testLocal)
 	kernServ.Run()
 	sf.isBad = true
@@ -109,7 +109,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.hand = NewMockHandSubHttp(qTopicTest, "/test/local").(*MockHandSubHttp)
+	sf.hand = NewMockHandSubHttp(qTopicTest, defs.Txt("/test/local")).(*MockHandSubHttp)
 	if sf.hand == nil {
 		sf.t.Fatalf("newGood1(): handler==nil")
 	}
@@ -123,7 +123,7 @@ func (sf *tester) newGood1() {
 	if topic := sf.hand.Topic(); topic.Get() != "test_topic" {
 		sf.t.Fatalf("newGood1(): bad topic(%v) 'test_topic'", topic)
 	}
-	if msg := sf.hand.Msg(); msg != "" {
+	if msg := sf.hand.Msg(); msg.Get() != "" {
 		sf.t.Fatalf("newGood1(): msg(%v) not empty", msg)
 	}
 }

+ 6 - 5
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -5,6 +5,7 @@ import (
 	"crypto/rand"
 	"sync"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	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_spec"
@@ -18,10 +19,10 @@ type MockHandlerSub struct {
 }
 
 // NewMockHandlerSub -- возвращает новый обработчик подписки.
-func NewMockHandlerSub(topic bus_ent.ITopicFix, localHook string) *MockHandlerSub {
+func NewMockHandlerSub(topic bus_ent.ITopicFix, localHook defs.ITxtFix) *MockHandlerSub {
 	mKh.Hassert(topic != nil, "NewMockHandlerSub(): topic is nil")
-	mKh.Hassert(localHook != "", "NewMockHandlerSub(): name is empty")
-	handlerName := bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook + "_" + rand.Text()))
+	mKh.Hassert(localHook != nil, "NewMockHandlerSub(): name is empty")
+	handlerName := bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook.String() + "_" + rand.Text()))
 	sf := &MockHandlerSub{
 		Topic_: topic,
 		Name_:  handlerName,
@@ -31,10 +32,10 @@ func NewMockHandlerSub(topic bus_ent.ITopicFix, localHook string) *MockHandlerSu
 }
 
 // Возвращает хранимое значение.
-func (sf *MockHandlerSub) Msg() string {
+func (sf *MockHandlerSub) Msg() defs.ITxtFix {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return string(sf.Msg_)
+	return defs.Txt(string(sf.Msg_))
 }
 
 // Функция обратного вызова подписки.

+ 5 - 4
v4/lev2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go

@@ -4,6 +4,7 @@ import (
 	"strings"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent/topic"
 )
@@ -30,8 +31,8 @@ func (sf *tester) back() {
 func (sf *tester) backGood1() {
 	sf.t.Log("backGood1")
 	sf.hand.FnBack([]byte("test_msg"))
-	if sf.hand.Msg() != "test_msg" {
-		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", string(sf.hand.Msg_))
+	if sf.hand.Msg().Get() != "test_msg" {
+		sf.t.Fatalf("backGood1(): binMsg(%v)!='test_msg'", defs.ATxt(sf.hand.Msg_))
 	}
 }
 
@@ -47,7 +48,7 @@ var (
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	sf.hand = NewMockHandlerSub(qTopicTest, "test_name")
+	sf.hand = NewMockHandlerSub(qTopicTest, defs.Txt("test_name"))
 	if sf.hand == nil {
 		sf.t.Fatalf("newGood1(): handler==nil")
 	}
@@ -57,7 +58,7 @@ func (sf *tester) newGood1() {
 	if topic := sf.hand.Topic(); topic.Get() != "test_topic" {
 		sf.t.Fatalf("newGood1(): topic(%v)!='test_topic'", topic)
 	}
-	if msg := sf.hand.Msg(); msg != "" {
+	if msg := sf.hand.Msg(); msg.Get() != "" {
 		sf.t.Fatalf("newGood1(): msg not empty")
 	}
 }

+ 6 - 5
v4/lev2/lti/dot/msg_pub/msg_pub.go

@@ -2,6 +2,7 @@
 package msg_pub
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -9,23 +10,23 @@ import (
 // PublishReq -- запрос на публикацию.
 type PublishReq struct {
 	Topic_  bus_ent.ATopic `json:"topic"`
-	Uuid_   string         `json:"uuid"`
+	Uuid_   defs.ITxtFix   `json:"uuid"`
 	BinMsg_ []byte         `json:"msg"`
 }
 
 // SelfCheck -- проверяет правильность своих полей.
 func (sf *PublishReq) SelfCheck() {
 	mKh.Hassert(sf.Topic_ != "", "PublishReq.SelfCheck(): topic is empty")
-	mKh.Hassert(sf.Uuid_ != "", "PublishReq.SelfCheck(): uuid is empty")
+	mKh.Hassert(sf.Uuid_ != nil, "PublishReq.SelfCheck(): uuid is empty")
 }
 
 // PublishResp -- ответ на запрос публикации.
 type PublishResp struct {
-	Status_ string `json:"status"`
-	Uuid_   string `json:"uuid"`
+	Status_ defs.ITxtFix `json:"status"`
+	Uuid_   defs.ITxtFix `json:"uuid"`
 }
 
 // SelfCheck -- проверяет правильность своих полей.
 func (sf *PublishResp) SelfCheck() {
-	mKh.Hassert(sf.Status_ != "", "PublishResp.SelfCheck(): status is empty")
+	mKh.Hassert(sf.Status_ != nil, "PublishResp.SelfCheck(): status is empty")
 }

+ 3 - 2
v4/lev2/lti/dot/msg_pub/msg_pub_test.go

@@ -3,6 +3,7 @@ package msg_pub
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
 
@@ -23,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &PublishResp{
-		Status_: "test_ok",
+		Status_: defs.Txt("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -50,7 +51,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &PublishReq{
 		Topic_:  qName,
-		Uuid_:   "test_uuid",
+		Uuid_:   defs.Txt("test_uuid"),
 		BinMsg_: []byte("test msg"),
 	}
 	req.SelfCheck()

+ 8 - 7
v4/lev2/lti/dot/msg_sub/msg_sub.go

@@ -2,6 +2,7 @@
 package msg_sub
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
@@ -9,26 +10,26 @@ import (
 // SubscribeReq -- входящий запрос на подписку.
 type SubscribeReq struct {
 	Topic_   bus_ent.ATopic `json:"topic"` // Топик, на который надо подписаться
-	Uuid_    string         `json:"uuid"`
-	WebHook_ string         `json:"web_hook"` // Веб-хук для обратного вызова
+	Uuid_    defs.ITxtFix   `json:"uuid"`
+	WebHook_ defs.ITxtFix   `json:"web_hook"` // Веб-хук для обратного вызова
 }
 
 // SelfCheck -- проверяет поля на правильность.
 func (sf *SubscribeReq) SelfCheck() {
 	mKh.Hassert(sf.Topic_ != "", "SubscribeReq.SelfCheck(): topic is empty")
-	mKh.Hassert(sf.Uuid_ != "", "SubscribeReq.SelfCheck(): uuid is empty")
-	mKh.Hassert(sf.WebHook_ != "", "SubscribeReq.SelfCheck(): WebHook_ is empty")
+	mKh.Hassert(sf.Uuid_ != nil, "SubscribeReq.SelfCheck(): uuid is empty")
+	mKh.Hassert(sf.WebHook_ != nil, "SubscribeReq.SelfCheck(): WebHook_ is empty")
 }
 
 // SubscribeResp -- ответ на запрос подписки.
 type SubscribeResp struct {
-	Status_ string               `json:"status"`
-	Uuid_   string               `json:"uuid"`
+	Status_ defs.ITxtFix         `json:"status"`
+	Uuid_   defs.ITxtFix         `json:"uuid"`
 	Name_   bus_ent.AHandlerName `json:"name"` // Уникальное имя подписки
 }
 
 // SelfCheck -- проверяет правильность своих полей.
 func (sf *SubscribeResp) SelfCheck() {
-	mKh.Hassert(sf.Status_ != "", "SubscribeResp.SelfCheck(): status is empty")
+	mKh.Hassert(sf.Status_.Get() != "", "SubscribeResp.SelfCheck(): status is empty")
 	mKh.Hassert(sf.Name_ != "", "SubscribeResp.SelfCheck(): name is empty")
 }

+ 4 - 3
v4/lev2/lti/dot/msg_sub/msg_sub_test.go

@@ -3,6 +3,7 @@ package msg_sub
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/bus_ent"
 )
 
@@ -23,7 +24,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &SubscribeResp{
-		Status_: "test_ok",
+		Status_: defs.Txt("test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -50,8 +51,8 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &SubscribeReq{
 		Topic_:   qName,
-		Uuid_:    "test_uuid",
-		WebHook_: "test msg",
+		Uuid_:    defs.Txt("test_uuid"),
+		WebHook_: defs.Txt("test msg"),
 	}
 	req.SelfCheck()
 }

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

@@ -3,6 +3,7 @@ package dict_sub_hook
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"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"
@@ -23,8 +24,8 @@ var (
 func TestDictSubWebHook(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicHand1, "hand_name1"),
-		handSub2: mock_hand_sub_local.NewMockHandlerSub(qTopicHand2, "hand_name2"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicHand1, defs.Txt("hand_name1")),
+		handSub2: mock_hand_sub_local.NewMockHandlerSub(qTopicHand2, defs.Txt("hand_name2")),
 	}
 	sf.new()
 	sf.add()

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

@@ -4,6 +4,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"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"
@@ -26,7 +27,7 @@ var (
 func TestDictSub(t *testing.T) {
 	sf := &tester{
 		t:    t,
-		hand: mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub, "name_dict_sub"),
+		hand: mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub, defs.Txt("name_dict_sub")),
 	}
 	sf.new()
 	sf.addBad1()
@@ -45,7 +46,7 @@ func (sf *tester) unsub1() {
 	sf.t.Log("unsub1")
 	sf.dict.Unsubscribe(sf.hand)
 	sf.dict.Read(qTopicTest, []byte("test test"))
-	hand := mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub1, "name_dict_sub")
+	hand := mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub1, defs.Txt("name_dict_sub"))
 	sf.dict.Unsubscribe(hand)
 	count := 0
 	for count < 100 {

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

@@ -27,7 +27,7 @@ var (
 func TestKernelBusLocal(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, "mock_hand_sub"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, defs.Txt("mock_hand_sub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServe, "mock_hand_serv"),
 	}
 	sf.new()

+ 18 - 18
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -32,19 +32,19 @@ type ClientBusHttp struct {
 	lCtx      comp_spec.ILocalCtx
 	log       comp_spec.ILogBuf
 	isWork    mKs.ISafeBool
-	urlRemote string // URL дистанционной шины
-	urlLocal  string // URL локальной шины для веб-хуков
+	urlRemote defs.ITxtFix // URL дистанционной шины
+	urlLocal  defs.ITxtFix // URL локальной шины для веб-хуков
 }
 
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины.
-func NewClientBusHttp(urlRemote string) bus_spec.IBusClient {
+func NewClientBusHttp(urlRemote defs.ITxtFix) bus_spec.IBusClient {
 	param := &log_buf.LogBufParam{
 		IsTerm_: safe_bool.NewSafeBool(true),
 		Prefix_: defs.Txt("ClientBusHttp"),
 	}
 	log := mL1.NewLogBuf(param)
 	log.Debug(defs.Txt("NewClientBusHttp()"))
-	helpers.Hassert(urlRemote != "", "NewClientBusHttp(): urlRemote is empty", []any{})
+	helpers.Hassert(urlRemote != nil, "NewClientBusHttp(): urlRemote is empty", []any{})
 	kCtx := kctx.GetKernelCtx()
 	resLocal := safe_string.NewSafeStringGetenv(defs.Txt("LOCAL_HTTP_URL"))
 	resLocal.Hassert(defs.Txt("NewClientBusHttp(): in get env LOCAL_HTTP_URL)"))
@@ -55,8 +55,8 @@ func NewClientBusHttp(urlRemote string) bus_spec.IBusClient {
 		log:       log,
 		bus:       kBusHttp,
 		isWork:    mL1.NewSafeBool(true),
-		urlRemote: strings.TrimSuffix(urlRemote, "/"),
-		urlLocal:  strings.TrimSuffix(urlLocal.Get().String(), "/"),
+		urlRemote: urlRemote.TrimSuffix("/"),
+		urlLocal:  urlLocal.Get().TrimSuffix("/"),
 	}
 	return sf
 }
@@ -76,7 +76,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 		"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)
+	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote.String()+"/bus/unsub", reader)
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Unsubscribe(): in new request, err=\n\t%v", err)
 
 	resBody := sf.makePost(hReq)
@@ -106,14 +106,14 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IR
 	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(),
-		WebHook_: sf.urlLocal + "/bus/pub", // Веб-хук всегда на своей стороне
+		Uuid_:    defs.Txt(_uuid.String()),
+		WebHook_: defs.Txt("%v%v", sf.urlLocal.String()+"/bus/pub"), // Веб-хук всегда на своей стороне
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-
-	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/sub", body)
+	endPoint := defs.Txt("%v%v", sf.urlLocal.String()+"/bus/sub")
+	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	helpers.Hassert(err != nil, "ClientBusHttp.Subscribe(): in new request, err=\n\t%v", []any{})
 
 	resBody := sf.makePost(hReq)
@@ -127,7 +127,7 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) mKs.IR
 		err := defs.Err("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
-	if resp.Status_ != "ok" {
+	if resp.Status_.Get() != "ok" {
 		err := defs.Err("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 		return mL0.NewErr[mKs.EBool](err)
 	}
@@ -151,8 +151,8 @@ func (sf *ClientBusHttp) SendRequest(topic bus_ent.ITopicFix, binReq []byte) mL0
 	req.SelfCheck()
 	_binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(_binReq))
-
-	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/request", body)
+	endPont := defs.Txt("%v%v", sf.urlRemote.String(), "/bus/request")
+	hReq, err := http.NewRequest(http.MethodPost, endPont.String(), body)
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.SendRequest(): in new request, err=\n\t%v")
 
 	resBody := sf.makePost(hReq)
@@ -197,14 +197,14 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 	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(),
+		Uuid_:   defs.Txt(_uuid.String()),
 		BinMsg_: binMsg,
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-
-	hReq, err := http.NewRequest(http.MethodPost, sf.urlRemote+"/bus/pub", body)
+	endPoint := defs.Txt("%v%v", sf.urlRemote.Get(), "/bus/pub")
+	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	mL1.FnHassert(helpers.Hassert)(err == nil, "ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
 	resBody := sf.makePost(hReq)
@@ -218,7 +218,7 @@ func (sf *ClientBusHttp) Publish(topic bus_ent.ITopicFix, binMsg []byte) mL0.IRe
 		err := defs.Err("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
 		return mL0.NewErr[mKs.EBool](err)
 	}
-	if resp.Status_ != "ok" {
+	if resp.Status_.Get() != "ok" {
 		err := defs.Err("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
 		return mL0.NewErr[mKs.EBool](err)
 	}

+ 13 - 13
v4/lev2/lti/kbus_http/client_bus_http/client_bus_http_test.go

@@ -20,9 +20,9 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/lti/kbus_http"
 )
 
-const (
-	baseUrl   = "http://127.0.0.1:18350/"
-	pathStore = "/store/store_client_bus_http"
+var (
+	baseUrl   = defs.Txt("http://127.0.0.1:18350/")
+	pathStore = defs.Txt("/store/store_client_bus_http")
 )
 
 type tester struct {
@@ -53,11 +53,11 @@ func TestClientBusHttp(t *testing.T) {
 		kBus:     kbus_base.GetKernelBusBase(),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
-	_ = os.Setenv("LOCAL_STORE_PATH", pathStore)
+	_ = os.Setenv("LOCAL_STORE_PATH", pathStore.String())
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
-	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl)
+	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl.String())
 	fnClear := func() {
-		pwd := sf.me.Pwd().String() + pathStore
+		pwd := sf.me.Pwd().String() + pathStore.String()
 		_ = os.RemoveAll(pwd)
 	}
 	fnClear()
@@ -96,8 +96,8 @@ func (sf *tester) sendGood1() {
 	}
 }
 
-const (
-	strTraTaTa = "tra-ta-ta"
+var (
+	strTraTaTa = defs.Txt("tra-ta-ta")
 )
 
 // Левый адрес.
@@ -205,11 +205,11 @@ func (sf *tester) pubGood1() {
 	}
 	for {
 		time.Sleep(time.Millisecond * 1)
-		if sf.handSub.Msg() != "" {
+		if sf.handSub.Msg().Get() != "" {
 			break
 		}
 	}
-	if msg := sf.handSub.Msg(); msg != "test_msg_456" {
+	if msg := sf.handSub.Msg(); msg.Get() != "test_msg_456" {
 		sf.t.Fatalf("bad msg(%v)", msg)
 	}
 }
@@ -287,7 +287,7 @@ func (sf *tester) subGood1() {
 func (sf *tester) subBad4() {
 	sf.t.Log("subBad4")
 	reader := strings.NewReader("")
-	hReq, err := http.NewRequest(http.MethodPost, sf.cl.urlRemote+"/bus/pub", reader)
+	hReq, err := http.NewRequest(http.MethodPost, sf.cl.urlRemote.String()+"/bus/pub", reader)
 	if err != nil {
 		sf.t.Fatalf("subBad4(): err=%v", err)
 	}
@@ -407,11 +407,11 @@ func (sf *tester) newGood1() {
 // Пустой URL.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
-	_ = NewClientBusHttp("")
+	_ = NewClientBusHttp(defs.Txt(""))
 }
 
 // Нет ничего для HTTP-шины.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	_ = NewClientBusHttp("url")
+	_ = NewClientBusHttp(defs.Txt("url"))
 }

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

@@ -2,7 +2,6 @@
 package kbus_http
 
 import (
-	"fmt"
 	"net/http"
 	"sync"
 
@@ -74,7 +73,7 @@ func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.SubscribeResp{
-			Status_: fmt.Sprintf("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
+			Status_: defs.Txt("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
@@ -94,13 +93,13 @@ func (sf *kBusHttp) processSubscribe(req *dot.SubscribeReq) *dot.SubscribeResp {
 	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	handler := mock_hand_sub_http.NewMockHandSubHttp(topic, req.WebHook_)
 	resp := &dot.SubscribeResp{
-		Status_: "ok",
+		Status_: defs.Txt("ok"),
 		Uuid_:   req.Uuid_,
 		Name_:   handler.Name().Get(),
 	}
 	res := sf.Subscribe(handler)
 	if res.IsErr() {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processSubscribe(): err=\n\t%v", res.Err())
+		resp.Status_ = defs.Txt("kernelBusHttp.processSubscribe(): err=\n\t%v", res.Err())
 		return resp
 	}
 	return resp
@@ -116,7 +115,7 @@ func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.PublishResp{
-			Status_: fmt.Sprintf("kernelBusHttp.postPublish(): in parse request, err=\n\t%v\n", err),
+			Status_: defs.Txt("kernelBusHttp.postPublish(): in parse request, err=\n\t%v\n", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
@@ -136,11 +135,11 @@ func (sf *kBusHttp) processPublish(req *dot.PublishReq) *dot.PublishResp {
 	topic := bus_ent.ITopicFix(topic.NewTopic(req.Topic_))
 	res := sf.Publish(topic, req.BinMsg_)
 	resp := &dot.PublishResp{
-		Status_: "ok",
+		Status_: defs.Txt("ok"),
 		Uuid_:   req.Uuid_,
 	}
 	if res.IsErr() {
-		resp.Status_ = fmt.Sprintf("kernelBusHttp.processPublish(): err=\n\t%v", res.Err())
+		resp.Status_ = defs.Txt("kernelBusHttp.processPublish(): err=\n\t%v", res.Err())
 		return resp
 	}
 	return resp

+ 16 - 16
v4/lev2/lti/kbus_http/kbus_http_test.go

@@ -38,7 +38,7 @@ var (
 func TestKernelBusHttp(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, "http://localhost:18200/bus/pub"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, defs.Txt("http://localhost:18200/bus/pub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServ, "name_serv"),
 	}
 	ctx := kctx.GetKernelCtx()
@@ -192,7 +192,7 @@ func (sf *tester) pubGood2() {
 	sf.t.Log("pubGood2")
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   test_uuid,
+		Uuid_:   defs.Txt(test_uuid),
 		BinMsg_: []byte("http_pub"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
@@ -220,7 +220,7 @@ func (sf *tester) pubGood2() {
 	if err != nil {
 		sf.t.Fatalf("pubGood2(): err=%v", err)
 	}
-	if resp.Status_ != "ok" {
+	if resp.Status_.Get() != "ok" {
 		sf.t.Fatalf("pubGood2(): resp(%v)!='ok'", resp.Status_)
 	}
 }
@@ -258,11 +258,11 @@ func (sf *tester) pubBad2() {
 
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   test_uuid,
+		Uuid_:   defs.Txt(test_uuid),
 		BinMsg_: []byte("test_pub"),
 	}
 	resp := Bus_.processPublish(req)
-	if resp.Status_ == "ok" {
+	if resp.Status_.Get() == "ok" {
 		sf.t.Fatalf("pubBad2(): status(%v)=='ok'", resp.Status_)
 	}
 }
@@ -276,19 +276,19 @@ func (sf *tester) pubGood1() {
 	}
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   test_uuid,
+		Uuid_:   defs.Txt(test_uuid),
 		BinMsg_: []byte("test_pub"),
 	}
 	_ = Bus_.processPublish(req)
 	for {
 		time.Sleep(time.Millisecond * 1)
 		msg := sf.handSub.Msg()
-		if msg != "" {
+		if msg.Get() != "" {
 			break
 		}
 	}
 	msg := sf.handSub.Msg()
-	if msg != "test_pub" {
+	if msg.Get() != "test_pub" {
 		sf.t.Fatalf("pubGood1(): msg(%v)!='test_pub'", msg)
 	}
 }
@@ -320,8 +320,8 @@ func (sf *tester) subGood2() {
 	sf.t.Log("subGood2")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    test_uuid,
-		WebHook_: "http://localhost:18200/bus/pub/",
+		Uuid_:    defs.Txt(test_uuid),
+		WebHook_: defs.Txt("http://localhost:18200/bus/pub/"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
@@ -348,7 +348,7 @@ func (sf *tester) subGood2() {
 	if err != nil {
 		sf.t.Fatalf("subBad1(): err=%v", err)
 	}
-	if resp.Status_ != "ok" {
+	if resp.Status_.Get() != "ok" {
 		sf.t.Fatalf("subBad1(): resp(%v)!='ok'", resp.Status_)
 	}
 }
@@ -358,8 +358,8 @@ func (sf *tester) subBad3() {
 	sf.t.Log("subBad3")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    test_uuid,
-		WebHook_: "http://localhost:18200/bus/pub/",
+		Uuid_:    defs.Txt(test_uuid),
+		WebHook_: defs.Txt("http://localhost:18200/bus/pub/"),
 	}
 	defer func() {
 		if _panic := recover(); _panic != nil {
@@ -370,7 +370,7 @@ func (sf *tester) subBad3() {
 	Bus_.IsWork_.Reset()
 	defer Bus_.IsWork_.Set()
 	resp := Bus_.processSubscribe(req)
-	if resp.Status_ == "ok" {
+	if resp.Status_.Get() == "ok" {
 		sf.t.Fatalf("subBad3(): resp==ok")
 	}
 }
@@ -380,8 +380,8 @@ func (sf *tester) subGood1() {
 	sf.t.Log("subGood1")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    test_uuid,
-		WebHook_: "http://localhost:18200/bus/",
+		Uuid_:    defs.Txt(test_uuid),
+		WebHook_: defs.Txt("http://localhost:18200/bus/"),
 	}
 	defer func() {
 		if _panic := recover(); _panic != nil {

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

@@ -3,6 +3,7 @@ package kbus_local
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 	"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"
@@ -22,7 +23,7 @@ func TestKernelBusLocal(t *testing.T) {
 	qTopicServ := bus_ent.ITopicFix(topic.NewTopic("topic_hand_serv"))
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicSub, "mock_hand_sub"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicSub, defs.Txt("mock_hand_sub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qTopicServ, "mock_hand_serv"),
 	}
 	sf.new()

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

@@ -10,7 +10,7 @@ import (
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text defs.ITxtFix, fnClick func(map[string]string) mL0.IResult[string]) mWt.IWuiButton {
+func NewWuiButton(text defs.ITxtFix, fnClick func(map[string]string) mL0.IResult[defs.ITxtFix]) mWt.IWuiButton {
 	wBtn := wui_button.NewWuiButton(text, fnClick)
 	return wBtn
 }

+ 3 - 3
v4/lev2/wui/wui_button/wui_button.go

@@ -18,12 +18,12 @@ import (
 type WuiButton struct {
 	mWt.IWuiWidget
 	text   mWt.IWuiText
-	fnBack func(map[string]string) mL0.IResult[string]
+	fnBack func(map[string]string) mL0.IResult[defs.ITxtFix]
 	hx     mWt.IWuiHx
 }
 
 // FnBtnBack -- функция обратного вызова для кнопки.
-type FnBtnBack func(map[string]string) mL0.IResult[string]
+type FnBtnBack func(map[string]string) mL0.IResult[defs.ITxtFix]
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
 func NewWuiButton(text defs.ITxtFix, fnBack FnBtnBack) *WuiButton {
@@ -51,7 +51,7 @@ func (sf *WuiButton) Text() mWt.IWuiText {
 }
 
 // Click -- событие нажатия.
-func (sf *WuiButton) Click(dict map[string]string) mL0.IResult[string] {
+func (sf *WuiButton) Click(dict map[string]string) mL0.IResult[defs.ITxtFix] {
 	return sf.fnBack(dict)
 }
 

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

@@ -43,7 +43,7 @@ func (sf *tester) new() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnBack(dict map[string]string) mL0.IResult[string] {
+func (sf *tester) fnBack(dict map[string]string) mL0.IResult[defs.ITxtFix] {
 	sf.chCall <- "test"
-	return mL0.NewOk("test_click")
+	return mL0.NewOk(defs.TxtFix("test_click"))
 }

+ 2 - 2
v4/lev2/wui/wui_test.go

@@ -32,7 +32,7 @@ func (sf *tester) get() {
 }
 
 // Функция обратного вызова.
-func (sf *tester) fnClick(dict map[string]string) mL0.IResult[string] {
+func (sf *tester) fnClick(dict map[string]string) mL0.IResult[defs.ITxtFix] {
 	sf.t.Log("fnClick")
-	return mL0.NewOk("test_click")
+	return mL0.NewOk(defs.ITxtFix(defs.Txt("test_click")))
 }

+ 2 - 1
v4/lev2/wui/wui_types/iwui_button.go

@@ -2,6 +2,7 @@ package wui_types
 
 import (
 	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
 )
 
 // IWuiButton -- WUI-кнопка.
@@ -10,7 +11,7 @@ type IWuiButton interface {
 	// Text -- возвращает текст кнопки
 	Text() IWuiText
 	// Click -- нажатие кнопки
-	Click(map[string]string) mL0.IResult[string]
+	Click(map[string]string) mL0.IResult[defs.ITxtFix]
 	// Hx -- атрибуты HTMX
 	Hx() IWuiHx
 }

+ 4 - 3
v4/lev3/mod_serv_http/btn_modules/btn_modules.go

@@ -42,11 +42,11 @@ var strBlockModules string
 var strBlockRow string
 
 // Событие клика по кнопке.
-func (sf *BtnModules) clickMonolit(dict map[string]string) mL0.IResult[string] {
+func (sf *BtnModules) clickMonolit(dict map[string]string) mL0.IResult[defs.ITxtFix] {
 	optMonolit := sf.kCtx.Get(defs.Txt("monolit"))
 	if optMonolit.IsNone() {
 		err := defs.Err("clickMonolit(): monolit module not found")
-		return mL0.NewErr[string](err)
+		return mL0.NewErr[defs.ITxtFix](err)
 	}
 	mon := optMonolit.Some().Val().(mod_spec.IKernelMonolit)
 	chLst := mon.Ctx().SortedList()
@@ -71,5 +71,6 @@ func (sf *BtnModules) clickMonolit(dict map[string]string) mL0.IResult[string] {
 		strOut += strRow
 	}
 	strOut = strings.ReplaceAll(strBlockModules, "{.mod_block}", strOut)
-	return mL0.NewOk(strOut)
+	txtOut := defs.TxtFix(strOut)
+	return mL0.NewOk(txtOut)
 }

+ 1 - 1
v4/lev3/mod_serv_http/btn_modules/btn_modules_test.go

@@ -22,7 +22,7 @@ func TestBtnModules(t *testing.T) {
 	mod := kmodule.NewKernelModule(modName)
 	kMon.Add(mod)
 	if str := btn.clickMonolit(map[string]string{}).
-		Hassert(defs.Txt("TestBtnModules()")); str == "" {
+		Hassert(defs.Txt("TestBtnModules()")); str.Get() == "" {
 		t.Fatalf("strOut is empty")
 	}
 }

+ 3 - 2
v4/lev3/mod_serv_http/btn_monolit/btn_monolit.go

@@ -31,6 +31,7 @@ func (sf *BtnMonolit) Html() defs.ITxtFix {
 var strBlockMonolit string
 
 // Событие клика по кнопке.
-func (sf *BtnMonolit) clickMonolit(dict map[string]string) mL0.IResult[string] {
-	return mL0.NewOk(strBlockMonolit)
+func (sf *BtnMonolit) clickMonolit(dict map[string]string) mL0.IResult[defs.ITxtFix] {
+	txtBlockMonolit := defs.TxtFix(strBlockMonolit)
+	return mL0.NewOk(txtBlockMonolit)
 }

+ 1 - 1
v4/lev3/mod_serv_http/btn_monolit/btn_monolit_test.go

@@ -22,7 +22,7 @@ func TestBtnModules(t *testing.T) {
 	mod := kmodule.NewKernelModule(modName)
 	kMon.Add(mod)
 	if str := btn.clickMonolit(map[string]string{}).
-		Hassert(defs.Txt("TestBtnModules()")); str == "" {
+		Hassert(defs.Txt("TestBtnModules()")); str.Get() == "" {
 		t.Fatalf("strOut is empty")
 	}
 }

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

@@ -154,9 +154,9 @@ func (sf *tester) clickGood1() {
 }
 
 // Обратный вызов клика.
-func (sf *tester) fnClick(dict map[string]string) mL0.IResult[string] {
+func (sf *tester) fnClick(dict map[string]string) mL0.IResult[defs.ITxtFix] {
 	sf.t.Log("fnClick")
-	return mL0.NewOk("test_click")
+	return mL0.NewOk(defs.TxtFix("test_click"))
 }
 
 // Неправильный тип объекта.