Browse Source

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

SVI 11 hours ago
parent
commit
d7fbe48294
88 changed files with 608 additions and 477 deletions
  1. 4 0
      .gitignore
  2. 2 1
      v4/d0/defs/def_err/def_err_let.go
  3. 2 1
      v4/d0/defs/table/owner/owner.go
  4. 2 2
      v4/d1/depth1.go
  5. 2 1
      v4/d1/local_ctx/local_ctx.go
  6. 15 13
      v4/d1/log_buf/log_buf.go
  7. 2 1
      v4/d1/log_buf/log_buf_test.go
  8. 2 1
      v4/d2/kernel_keeper/kernel_keeper.go
  9. 11 5
      v4/d2/kmonolit/kmonolit.go
  10. 31 30
      v4/d2/kserv_http/kserv_http.go
  11. 2 2
      v4/d2/kserv_http/kserv_http_test.go
  12. 7 5
      v4/d2/kserv_http_std/kserv_http_std.go
  13. 2 1
      v4/d2/kwg/kwg.go
  14. 10 8
      v4/d2/kwg/kwg_test.go
  15. 5 3
      v4/d2/log_topic/log_topic.go
  16. 4 1
      v4/d2/log_topic/log_topic_test.go
  17. 20 21
      v4/d2/lsi/kstore_kv/kstore_kv.go
  18. 7 9
      v4/d2/lsi/kstore_kv/kstore_kv_test.go
  19. 4 2
      v4/d2/lsi/store_ent/dict_rec/dict_rec.go
  20. 9 5
      v4/d2/lsi/store_ent/dict_rec/dict_rec_test.go
  21. 10 8
      v4/d2/lsi/store_ent/rec_kv/rec_kv.go
  22. 6 3
      v4/d2/lsi/store_ent/rec_kv/rec_kv_test.go
  23. 4 2
      v4/d2/lsi/store_ent/rec_meta/rec_meta.go
  24. 7 4
      v4/d2/lsi/store_ent/rec_meta/rec_meta_test.go
  25. 5 4
      v4/d2/lsi/store_ent/store_ent.go
  26. 3 2
      v4/d2/lti/bus_ent/bus_ent.go
  27. 4 2
      v4/d2/lti/bus_ent/handler_name/handler_name.go
  28. 6 4
      v4/d2/lti/bus_ent/handler_name/handler_name_test.go
  29. 2 2
      v4/d2/lti/bus_mock/mock_hand_serve/mock_hand_serve.go
  30. 6 4
      v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go
  31. 4 4
      v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go
  32. 5 3
      v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go
  33. 3 1
      v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go
  34. 4 2
      v4/d2/lti/dot/msg_pub/msg_pub_test.go
  35. 6 4
      v4/d2/lti/dot/msg_serve/msg_serve_test.go
  36. 7 5
      v4/d2/lti/dot/msg_sub/msg_sub_test.go
  37. 4 2
      v4/d2/lti/dot/msg_unsub/msg_unsub_test.go
  38. 6 4
      v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook.go
  39. 6 3
      v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook_test.go
  40. 10 6
      v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve.go
  41. 10 6
      v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve_test.go
  42. 4 2
      v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub.go
  43. 6 3
      v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub_test.go
  44. 33 30
      v4/d2/lti/kbus_base/kbus_base.go
  45. 6 3
      v4/d2/lti/kbus_base/kbus_base_test.go
  46. 34 33
      v4/d2/lti/kbus_http/client_bus_http/client_bus_http.go
  47. 32 37
      v4/d2/lti/kbus_http/client_bus_http/client_bus_http_test.go
  48. 22 21
      v4/d2/lti/kbus_http/kbus_http.go
  49. 18 18
      v4/d2/lti/kbus_http/kbus_http_test.go
  50. 4 1
      v4/d2/lti/kbus_local/kbus_local_test.go
  51. 4 2
      v4/d2/wui/hx_url/hx_url.go
  52. 2 1
      v4/d2/wui/hx_url/hx_url_test.go
  53. 4 2
      v4/d2/wui/hx_url_method/hx_url_method.go
  54. 3 2
      v4/d2/wui/hx_url_method/hx_url_method_test.go
  55. 3 2
      v4/d2/wui/hx_url_patch/hx_url_patch_test.go
  56. 2 2
      v4/d2/wui/wui.go
  57. 7 5
      v4/d2/wui/wui_button/wui_button.go
  58. 4 2
      v4/d2/wui/wui_button/wui_button_test.go
  59. 4 2
      v4/d2/wui/wui_hx/wui_hx.go
  60. 4 2
      v4/d2/wui/wui_hx/wui_hx_test.go
  61. 7 5
      v4/d2/wui/wui_label/wui_label.go
  62. 3 1
      v4/d2/wui/wui_label/wui_label_test.go
  63. 6 4
      v4/d2/wui/wui_test.go
  64. 7 5
      v4/d2/wui/wui_text/wui_text.go
  65. 4 2
      v4/d2/wui/wui_text/wui_text_test.go
  66. 5 3
      v4/d2/wui/wui_widget/wui_widget.go
  67. 4 1
      v4/d2/wui/wui_widget/wui_widget_test.go
  68. 2 2
      v4/d3/mod_ent/mod_ent.go
  69. 12 7
      v4/d3/mod_ent/mod_num/mod_num.go
  70. 3 3
      v4/d3/mod_kctx/mod_kctx.go
  71. 1 1
      v4/d3/mod_kctx/mod_kctx_test.go
  72. 5 4
      v4/d3/mod_keeper/mod_keeper.go
  73. 6 5
      v4/d3/mod_serv_http/btn_modules/btn_modules.go
  74. 3 3
      v4/d3/mod_serv_http/btn_modules/btn_modules_test.go
  75. 4 3
      v4/d3/mod_serv_http/btn_monolit/btn_monolit.go
  76. 3 3
      v4/d3/mod_serv_http/btn_monolit/btn_monolit_test.go
  77. 3 3
      v4/d3/mod_serv_http/http_api/http_api.go
  78. 2 2
      v4/d3/mod_serv_http/http_api/http_api_test.go
  79. 4 4
      v4/d3/mod_serv_http/mod_serv_http.go
  80. 1 1
      v4/d3/mod_serv_http/mod_serv_http_test.go
  81. 13 11
      v4/d3/mod_serv_http/page_module/page_module.go
  82. 10 10
      v4/d3/mod_serv_http/page_module/page_module_test.go
  83. 9 7
      v4/d3/mod_serv_http/page_monolit/page_monolit.go
  84. 5 5
      v4/d3/mod_serv_http/page_monolit/page_monolit_test.go
  85. 11 9
      v4/d3/mod_wui/mod_wui.go
  86. 7 7
      v4/d3/mod_wui/mod_wui_test.go
  87. 9 7
      v4/kern.go
  88. 2 2
      v4/kern_test.go

+ 4 - 0
.gitignore

@@ -23,3 +23,7 @@ bin_dev
 /v4/test
 /v4/test.mod
 /v4/test.o
+/agent_knowledge.db
+/ai
+/chat_history_architect.json
+/chat_history_infra.json

+ 2 - 1
v4/d0/defs/def_err/def_err_let.go

@@ -15,7 +15,8 @@ type LErr struct {
 }
 
 // LetErr -- создать новую обёрнутую ошибку.
-func LetErr[T def_spec_fn.TxtConstraint](owner *owner.LOwner, msg T, arg ...any) *LErr {
+func LetErr[T def_spec_fn.TxtConstraint](owner *owner.LOwner,
+	msg T, arg ...any) *LErr {
 	helpers.If(msg == "").Hassert("LetErr(): msg is empty")
 	sf := &LErr{
 		LTxt: def_txt.LetTxt(owner, msg, arg...),

+ 2 - 1
v4/d0/defs/table/owner/owner.go

@@ -18,7 +18,8 @@ type LOwner struct {
 }
 
 // LetOwner -- получить нового неизменяемого владельца.
-func LetOwner[T def_spec_base.NumConstraint, U def_spec_base.TxtConstraint](id T, name U) *LOwner {
+func LetOwner[T def_spec_base.NumConstraint,
+	U def_spec_base.TxtConstraint](id T, name U) *LOwner {
 	helpers.If(id == 0).Hassert("LetOwner(): id==0")
 	helpers.If(name == "").Hassert("LetOwner(): id=%v, name is empty", id)
 	sf := &LOwner{

+ 2 - 2
v4/d1/depth1.go

@@ -27,8 +27,8 @@ type LogBufParam = log_buf.LogBufParam
 type LogBuf = log_buf.LogBuf
 
 // NewLogBuf -- возвращает новый буферизованный лог.
-func NewLogBuf(owner *d0.LOwner, param *LogBufParam) *LogBuf {
-	log := log_buf.NewLogBuf(owner, param)
+func NewLogBuf(param *LogBufParam) *LogBuf {
+	log := log_buf.NewLogBuf(param)
 	return log
 }
 

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

@@ -28,6 +28,7 @@ func NewLocalCtx(owner *d0.LOwner, ctx context.Context) *LocalCtx {
 	d0.If(owner == nil).Hassert("NewLocalCtx(): LOwner==nil")
 	lCtx, fnCancel := context.WithCancel(ctx)
 	paramLogBuf := &log_buf.LogBufParam{
+		Owner_:  owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
 		Prefix_: d0.LetTxt(owner, "LocalCtx"),
 	}
@@ -38,7 +39,7 @@ func NewLocalCtx(owner *d0.LOwner, ctx context.Context) *LocalCtx {
 		fnCancel:   fnCancel,
 		dictVal:    map[d0.Txt]*ctx_value.CtxValue{},
 		lstSort:    lst_sort.NewLstSort(),
-		log:        log_buf.NewLogBuf(owner, paramLogBuf),
+		log:        log_buf.NewLogBuf(paramLogBuf),
 	}
 	return sf
 }

+ 15 - 13
v4/d1/log_buf/log_buf.go

@@ -37,6 +37,7 @@ type ILogBuf interface {
 
 // LogBufParam -- параметры логирующего буфера.
 type LogBufParam struct {
+	Owner_  *d0.LOwner    // Владелец буфера
 	Prefix_ *d0.LTxt      // Префикс для сообщений
 	IsTerm_ *d0.MSafeBool // Признак вывода в терминал
 }
@@ -44,6 +45,7 @@ type LogBufParam struct {
 // SelfCheck -- проверяет корректность параметров.
 func (sf *LogBufParam) SelfCheck() {
 	d0.If(sf.IsTerm_ == nil).Hassert("LogBufParam.SelfCheck(): IsTerm_==nil")
+	d0.If(sf.Owner_ == nil).Hassert("LogBufParam.SelfCheck(): Owner_==nil")
 }
 
 // LogBuf -- потокобезопасный буфер лога.
@@ -70,24 +72,24 @@ const (
 )
 
 // NewLogBuf -- возвращает новый потокобезопасный буфер лога.
-func NewLogBuf(owner *owner.LOwner, param *LogBufParam) *LogBuf {
+func NewLogBuf(param *LogBufParam) *LogBuf {
 	d0.If(param == nil).Hassert("NewLogBuf(): param==nil")
 	param.SelfCheck()
 	sf := &LogBuf{
-		owner:       owner,
+		owner:       param.Owner_,
 		MSafeMutex:  d0.MutSafeMutex(),
 		LogBufParam: param,
 		lst:         []log_msg.ILogMsg{},
 		lstErr:      []log_msg.ILogMsg{},
-		level:       d0.LetTxt(owner, d0.Txt("DEBU")),
-		levDebug:    d0.LetTxt(owner, d0.Txt("DEBU")),
-		levInfo:     d0.LetTxt(owner, d0.Txt("INFO")),
-		levWarn:     d0.LetTxt(owner, d0.Txt("WARN")),
-		levError:    d0.LetTxt(owner, d0.Txt("ERRO")),
-		levEmpty:    d0.LetTxt(owner, d0.Txt("EMPT")),
+		level:       d0.LetTxt(param.Owner_, "DEBU"),
+		levDebug:    d0.LetTxt(param.Owner_, "DEBU"),
+		levInfo:     d0.LetTxt(param.Owner_, "INFO"),
+		levWarn:     d0.LetTxt(param.Owner_, "WARN"),
+		levError:    d0.LetTxt(param.Owner_, "ERRO"),
+		levEmpty:    d0.LetTxt(param.Owner_, "EMPT"),
 	}
 	pref := sf.Prefix_.Get() + d0.Txt(".")
-	sf.Prefix_ = d0.LetTxt(owner, pref)
+	sf.Prefix_ = d0.LetTxt(sf.owner, pref)
 	return sf
 }
 
@@ -218,8 +220,8 @@ func (sf *LogBuf) printTerm(msg log_msg.ILogMsg) {
 	log.Printf("%v\n", msg.String())
 }
 
-// Проверяет правильность своего состава.
-func (sf *LogBuf) check(level d0.Num) {
+// SetLevel -- проверяет правильность своего состава.
+func (sf *LogBuf) SetLevel(level d0.Num) {
 	switch level {
 	case EMPTY:
 		sf.level = sf.levEmpty
@@ -228,9 +230,9 @@ func (sf *LogBuf) check(level d0.Num) {
 	case DEBUG:
 		sf.level = sf.levDebug
 	case WARN:
-		sf.level=sf.levWarn
+		sf.level = sf.levWarn
 	case ERROR:
-		sf.level=sf.levError
+		sf.level = sf.levError
 	default:
 		d0.If(true).Hassert("logMsg.LogBuf(): NOT SET level(%v)", level)
 	}

+ 2 - 1
v4/d1/log_buf/log_buf_test.go

@@ -25,10 +25,11 @@ func TestLogBuf(t *testing.T) {
 func (sf *tester) new() {
 	sf.t.Log("new")
 	param := &LogBufParam{
+		Owner_: sf.owner,
 		IsTerm_: d0.MutSafeBool(sf.owner, true),
 		Prefix_: d0.LetTxt(sf.owner, "tester"),
 	}
-	sf.log = NewLogBuf(sf.owner, param)
+	sf.log = NewLogBuf(param)
 	if sf.log == nil {
 		sf.t.Fatalf("new(): log==nil")
 	}

+ 2 - 1
v4/d2/kernel_keeper/kernel_keeper.go

@@ -45,6 +45,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 	owner := d0.LetOwner(1, "kern_keeper")
 	qName    = stream_name.NewAStreamName(owner, "kernel_keeper")
 	paramLogBuf := &d1.LogBufParam{
+		Owner_:owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
 		Prefix_: d0.LetTxt(owner, "kernelKeeper"),
 	}
@@ -53,7 +54,7 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 		ctx:      ctx,
 		fnCancel: fnCancel,
 		wg:       wg,
-		log:      d1.NewLogBuf(owner, paramLogBuf),
+		log:      d1.NewLogBuf(paramLogBuf),
 		chSys_:   make(chan os.Signal, 2),
 	}
 	sf.log.Debug("GetKernelKeeper(): first run")

+ 11 - 5
v4/d2/kmonolit/kmonolit.go

@@ -28,7 +28,8 @@ var (
 )
 
 var (
-	txtIsLocal = d0.LetTxt("isLocal")
+	owner      = d0.LetOwner(0, "owner_test")
+	txtIsLocal = d0.LetTxt(owner, "isLocal")
 )
 
 // LetModMonolit -- возвращает синглтон модуля-монолита.
@@ -57,13 +58,18 @@ func LetModMonolit(name mod_ent.AModuleName) *LModMonolit {
 		isLocal: d0.LetBool(owner, isLocal),
 	}
 	sf.log = sf.lCtx.Log()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), name, "name of monolit")
-	sf.kCtx.Set(d0.LetTxt("monolit"), sf, "monolit-app")
+	sf.kCtx.Set(d0.LetTxt(owner, "monolitName"), name, "name of monolit")
+	sf.kCtx.Set(d0.LetTxt(owner, "monolit"), sf, "monolit-app")
 	mon = sf
 	_ = mod_spec.IKernelMonolit(sf)
 	return sf
 }
 
+// Owner -- возвращает владельца монолита
+func (sf *LModMonolit) Owner() *d0.LOwner {
+	return sf.owner
+}
+
 // Ctx -- возвращает контекст монолита.
 func (sf *LModMonolit) Ctx() *d1.LocalCtx {
 	return sf.lCtx
@@ -92,9 +98,9 @@ func (sf *LModMonolit) Add(module mod_spec.IKernelModule) {
 		go module.Run()
 		sf.log.Debug("kMonolit.Add(): module='%v' is run", module.Name())
 	}
-	key := d0.LetTxt("module_%v", len(sf.dict))
+	key := d0.LetTxt(owner, "module_%v", len(sf.dict))
 	moduleName := module.Name()
-	comment := d0.LetTxt("kMonolit.Add(): module=" + moduleName.Txt())
+	comment := d0.LetTxt(owner, "kMonolit.Add(): module="+moduleName.Txt())
 	sf.lCtx.Set(key, module, comment.Get())
 }
 

+ 31 - 30
v4/d2/kserv_http/kserv_http.go

@@ -22,21 +22,17 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec"
 )
 
-var (
-	msg0       = d0.Txt("kernel_server_http")
-	streamName = stream_name.NewAStreamName(msg0) // Контрольная строка для ожидателя потока
-)
-
 // kServHttp -- встроенный HTTP-сервер.
 type kServHttp struct {
-	owner    *d0.LOwner
-	kCtx     *kern_ctx.KernCtx
-	lCtx     *d1.LocalCtx
-	log      *d1.LogBuf
-	strUrl   *d0.LTxt // URL, на котором слушает HTTP-сервер
-	fiberApp *fiber.App
-	isWork   *d0.MSafeBool
-	isEnd    *d0.MSafeBool
+	owner      *d0.LOwner
+	kCtx       *kern_ctx.KernCtx
+	lCtx       *d1.LocalCtx
+	log        *d1.LogBuf
+	strUrl     *d0.LTxt // URL, на котором слушает HTTP-сервер
+	fiberApp   *fiber.App
+	isWork     *d0.MSafeBool
+	isEnd      *d0.MSafeBool
+	streamName *stream_name.AStreamName
 }
 
 //go:embed static/*
@@ -49,15 +45,16 @@ var (
 
 func getParams(owner *d0.LOwner) (*d0.LTxt, *d1.LogBuf, *kern_ctx.KernCtx) {
 	param := &d1.LogBufParam{
+		Owner_:owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
-		Prefix_: d0.LetTxt("kServHttp"),
+		Prefix_: d0.LetTxt(owner, "kServHttp"),
 	}
 	log := d1.NewLogBuf(param)
 	log.Debug("GetKernelServHttp(): first run")
 	strLocalUrl := os.Getenv("LOCAL_HTTP_URL")
 	d0.If(strLocalUrl == "").Hassert("getParams(): env LOCAL_HTTP_URL not set")
 	kCtx := kern_ctx.GetKernCtx()
-	return d0.LetTxt(strLocalUrl), log, kCtx
+	return d0.LetTxt(owner, strLocalUrl), log, kCtx
 }
 
 // GetKernelServHttp -- возвращает  встроенный HTTP-сервер.
@@ -71,7 +68,10 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 	owner := d0.LetOwner(1, "isol_kern_serv_http")
 	strLocalUrl, log, kCtx := getParams(owner)
 
-	optMonolit := kCtx.Get(d0.LetTxt("monolitName"))
+	msg0 := d0.Txt("kernel_server_http")
+	streamName := stream_name.NewAStreamName(owner, msg0) // Контрольная строка для ожидателя потока
+
+	optMonolit := kCtx.Get(d0.LetTxt(owner, "monolitName"))
 	optMonolit.Hassert("GetKernelServHttp(): not have monolit name from kCtx")
 	strMonolit := optMonolit.Some().Val().(*d0.LTime)
 	confFiber := fiber.Config{
@@ -82,14 +82,15 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 		AppName:      strMonolit.String(),
 	}
 	sf := &kServHttp{
-		owner:    owner,
-		kCtx:     kCtx,
-		log:      log,
-		lCtx:     d1.NewLocalCtx(owner, kCtx.SelfCtx()),
-		strUrl:   strLocalUrl,
-		fiberApp: fiber.New(confFiber),
-		isWork:   d0.MutSafeBool(owner, false),
-		isEnd:    d0.MutSafeBool(owner, false),
+		owner:      owner,
+		kCtx:       kCtx,
+		log:        log,
+		lCtx:       d1.NewLocalCtx(owner, kCtx.SelfCtx()),
+		strUrl:     strLocalUrl,
+		fiberApp:   fiber.New(confFiber),
+		isWork:     d0.MutSafeBool(owner, false),
+		isEnd:      d0.MutSafeBool(owner, false),
+		streamName: streamName,
 	}
 	sf.fiberApp.Use(compress.New(compress.Config{
 		Level: compress.LevelBestCompression, // 2
@@ -106,9 +107,9 @@ func GetKernelServHttp() kspec.IKernelServerHttp {
 		Title: fmt.Sprintf("Страница метрик %q", strMonolit),
 	}))
 	sf.kCtx.Wg().Add(streamName)
-	kCtx.Set(d0.LetTxt("fiberApp"), sf.fiberApp, "GetKernelServHttp() internal fiber app")
+	kCtx.Set(d0.LetTxt(sf.owner, "fiberApp"), sf.fiberApp, "GetKernelServHttp() internal fiber app")
 	kernServHttp = sf
-	kCtx.Set(d0.LetTxt("kServHttp"), kernServHttp, "kServHttp")
+	kCtx.Set(d0.LetTxt(sf.owner, "kServHttp"), kernServHttp, "kServHttp")
 	return kernServHttp
 }
 
@@ -146,13 +147,13 @@ func (sf *kServHttp) Run() {
 	fnListen := func() {
 		defer close(chErr)
 		err := sf.fiberApp.Listen(":" + strPort)
-		chErr <- d0.LetErr("kServHttp.Run().fnListen(): in listen server on port=%q, err=\n\t%v", strPort, err)
+		chErr <- d0.LetErr(sf.owner, "kServHttp.Run().fnListen(): in listen server on port=%q, err=\n\t%v", strPort, err)
 	}
 	go fnListen()
 	go sf.fnChErr(chErr)
 	fnCheckServer := func() error {
 		client := &http.Client{Timeout: 5 * time.Millisecond}
-		url := d0.LetTxt(sf.strUrl.Get() + "monitor")
+		url := d0.LetTxt(sf.owner, sf.strUrl.Get()+"monitor")
 		sf.log.Debug("url=%v", url.Get())
 		var (
 			resp *http.Response
@@ -180,7 +181,7 @@ func (sf *kServHttp) Run() {
 func (sf *kServHttp) fnChErr(chErr <-chan *d0.LErr) {
 	err := <-chErr
 	if err.Get() != "<nil>" {
-		err := d0.LetErr("kServHttp.fnChErr(): in listen, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "kServHttp.fnChErr(): in listen, err=\n\t%w", err)
 		sf.log.Err(err)
 		sf.kCtx.Cancel()
 	}
@@ -196,6 +197,6 @@ func (sf *kServHttp) close() {
 	sf.isEnd.Set()
 	err := sf.fiberApp.Server().Shutdown()
 	d0.If(err != nil).Assert("kServHttp.close(): in close server, err=\n\t%v", err)
-	sf.kCtx.Wg().Done(streamName)
+	sf.kCtx.Wg().Done(sf.streamName)
 	sf.log.Debug("close(): end")
 }

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

@@ -47,7 +47,7 @@ func (sf *tester) close() {
 	}
 	kernServHttp.Run()
 	chErr := make(chan *d0.LErr, 2)
-	chErr <- d0.LetErr("test err")
+	chErr <- d0.LetErr(sf.owner, "test err")
 	close(chErr)
 	kernServHttp.fnChErr(chErr)
 }
@@ -83,7 +83,7 @@ func (sf *tester) newGood1() {
 	sf.me = mock_env.MakeEnv(sf.owner)
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl)
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "comment")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "monolitName"), "test_monolit", "comment")
 	serv := GetKernelServHttp().(*kServHttp)
 	if serv != kernServHttp {
 		sf.t.Fatalf("newGood1(): bad IKernelServHttp")

+ 7 - 5
v4/d2/kserv_http_std/kserv_http_std.go

@@ -13,9 +13,9 @@ import (
 
 // kServHttpStd -- реализация HTTP-сервера на стандартной библиотеке.
 type kServHttpStd struct {
+	owner *d0.LOwner
 	kCtx   *kern_ctx.KernCtx
 	log    *d1.LogBuf
-	owner  *d0.LOwner
 	port   *d0.LNum
 	server *http.Server
 }
@@ -34,12 +34,13 @@ func GetKservHttpStd() *d0.Result[*kServHttpStd] {
 	}
 	owner := d0.LetOwner(1, "isol_serv_http_std")
 	logBufParam := &d1.LogBufParam{
+		Owner_:owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
-		Prefix_: d0.LetTxt("kServHttpStd"),
+		Prefix_: d0.LetTxt(owner, "kServHttpStd"),
 	}
 	log := d1.NewLogBuf(logBufParam)
 	log.Debug("GetKservHttpStd()")
-	resPort := d0.MutSafeNumFromEnv(owner, d0.LetTxt("SERV_HTTP_STD_PORT"))
+	resPort := d0.MutSafeNumFromEnv(owner, d0.LetTxt(owner, "SERV_HTTP_STD_PORT"))
 	port := resPort.Hassert("in get env SERV_HTTP_STD_PORT")
 	sf := &kServHttpStd{
 		owner: owner,
@@ -62,10 +63,11 @@ func (sf *kServHttpStd) Run() {
 	}
 	// Запуск сервера в горутине
 	go func() {
-		msg := d0.LetTxt("kServHttpStd.Run().fn(): run on http://%v", sf.server.Addr)
+		msg := d0.LetTxt(sf.owner, "kServHttpStd.Run().fn(): run on http://%v",
+		sf.server.Addr)
 		sf.log.Debug(msg.Get())
 		if err := sf.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
-			err := d0.LetErr("kServHttpStd.Run.fn(): in work, err=\n\t%v", err)
+			err := d0.LetErr(sf.owner, "kServHttpStd.Run.fn(): in work,err=\n\t%v", err)
 			sf.log.Err(err)
 		}
 	}()

+ 2 - 1
v4/d2/kwg/kwg.go

@@ -38,8 +38,9 @@ func GetKernelWg(ctx context.Context) *KernWg {
 	owner := d0.LetOwner(1, "isol_kern_wg")
 	d0.If(ctx == nil).Hassert("GetKernelWg(): ctx==nil")
 	paramLogBuf := &d1.LogBufParam{
+		Owner_:owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
-		Prefix_: d0.LetTxt("kernelWg"),
+		Prefix_: d0.LetTxt(owner, "kernelWg"),
 	}
 	sf := &KernWg{
 		MSafeMutex: d0.MutSafeMutex(),

+ 10 - 8
v4/d2/kwg/kwg_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ent/stream_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kspec"
 )
@@ -14,16 +15,21 @@ type tester struct {
 	ctx      context.Context
 	fnCancel func()
 	wg       kspec.IKernelWg
+	owner *d0.LOwner
+	streamName *stream_name.AStreamName
 }
 
 func TestKernelWG(t *testing.T) {
 	ctxBg := context.Background()
 	ctx, fnCancel := context.WithCancel(ctxBg)
 	defer fnCancel()
+	owner:=d0.LetOwner(1, "test_owner")
 	sf := &tester{
 		t:        t,
 		ctx:      ctx,
 		fnCancel: fnCancel,
+		owner: owner,
+		streamName: stream_name.NewAStreamName(owner, "test_stream"),
 	}
 	sf.new()
 	sf.add()
@@ -32,14 +38,10 @@ func TestKernelWG(t *testing.T) {
 	sf.addBad3()
 }
 
-var (
-	qName = stream_name.NewAStreamName("test_stream")
-)
-
 // Попытка добавления после закрытия ожидателя.
 func (sf *tester) addBad3() {
 	sf.t.Log("addBad3")
-	sf.wg.Add(qName)
+	sf.wg.Add(sf.streamName)
 	_len := sf.wg.Len()
 	if _len != 0 {
 		sf.t.Fatalf("addBad3(): len(%v)!=0", _len)
@@ -51,7 +53,7 @@ func (sf *tester) addBad3() {
 // Убирает имя потока из ожидателя.
 func (sf *tester) done() {
 	sf.t.Log("done")
-	sf.wg.Done(qName)
+	sf.wg.Done(sf.streamName)
 	lst := sf.wg.List()
 	if len(lst) != 0 {
 		sf.t.Fatalf("addBad1(): len(lst)!=0, lst=%#v", lst)
@@ -77,12 +79,12 @@ func (sf *tester) addBad2() {
 			sf.t.Fatalf("addBad1(): len(lst)!=1, lst=%#v", lst)
 		}
 	}()
-	sf.wg.Add(qName)
+	sf.wg.Add(sf.streamName)
 }
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	sf.wg.Add(qName)
+	sf.wg.Add(sf.streamName)
 }
 
 // Ожидание завершения ожидателя потоков.

+ 5 - 3
v4/d2/log_topic/log_topic.go

@@ -9,18 +9,20 @@ import (
 
 // LogTopic -- элемент лога шины.
 type LogTopic struct {
+	owner  *d0.LOwner
 	topic  *topic.LTopic       // Топик, куда публиковать лог
 	client bus_spec.IBusClient // С помощью чего публиковать лог
 }
 
 // NewLogTopic -- возвращает новый элемент лога.
-func NewLogTopic(topic *topic.LTopic, client bus_spec.IBusClient) *d0.Result[*LogTopic] {
+func NewLogTopic(owner *d0.LOwner, topic *topic.LTopic, client bus_spec.IBusClient) *d0.Result[*LogTopic] {
 	d0.If(topic == nil).Hassert("NewLogTopic(): topic==nil", []any{})
 	if client == nil {
-		err := d0.LetErr("NewLogTopic(): IBusClient==nil")
+		err := d0.LetErr(owner, "NewLogTopic(): IBusClient==nil")
 		return d0.ResErr[*LogTopic](err)
 	}
 	sf := &LogTopic{
+		owner:  owner,
 		topic:  topic,
 		client: client,
 	}
@@ -31,7 +33,7 @@ func NewLogTopic(topic *topic.LTopic, client bus_spec.IBusClient) *d0.Result[*Lo
 func (sf *LogTopic) Pub(binMsg []byte) *d0.Result[d0.Bool] {
 	res := sf.client.Publish(sf.topic, binMsg)
 	if res.IsErr() {
-		err := d0.LetErr("LogTopic.Pub(): in pub with client, err=\n\t%w", res.Err())
+		err := d0.LetErr(sf.owner, "LogTopic.Pub(): in pub with client, err=\n\t%w", res.Err())
 		return d0.ResErr[d0.Bool](err)
 	}
 	return res

+ 4 - 1
v4/d2/log_topic/log_topic_test.go

@@ -3,6 +3,7 @@ package log_topic
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/kbus_local/client_bus_local"
@@ -10,11 +11,13 @@ import (
 
 type tester struct {
 	t *testing.T
+	owner *d0.LOwner
 }
 
 func TestLogTopic(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner: d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 }
@@ -30,7 +33,7 @@ func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
 	busClient := client_bus_local.NewClientBusLocal()
 	qTopicTest := topic.LetTopic("test_topic")
-	client := NewLogTopic(qTopicTest, busClient).Hassert("newGood1()")
+	client := NewLogTopic(sf.owner, qTopicTest, busClient).Hassert("newGood1()")
 	res := client.Pub([]byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("newGood1(): err=%v", res.Err())

+ 20 - 21
v4/d2/lsi/kstore_kv/kstore_kv.go

@@ -18,21 +18,18 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_spec"
 )
 
-var (
-	storeStreamName = stream_name.NewAStreamName("kstore_kv") // Имя потока для ожидателя потоков
-)
-
 // kStoreKv -- локальное хранилище ядра.
 type kStoreKv struct {
 	*d0.MSafeMutex
-	owner     *d0.LOwner
-	kCtx      *kern_ctx.KernCtx
-	lCtx      *d1.LocalCtx
-	log       *d1.LogBuf
-	wg        kspec.IKernelWg
-	storePath *d0.LTxt
-	db        *badger.DB
-	isWork    *d0.MSafeBool
+	owner      *d0.LOwner
+	streamName *stream_name.AStreamName // Имя потока для ожидателя потоков
+	kCtx       *kern_ctx.KernCtx
+	lCtx       *d1.LocalCtx
+	log        *d1.LogBuf
+	wg         kspec.IKernelWg
+	storePath  *d0.LTxt
+	db         *badger.DB
+	isWork     *d0.MSafeBool
 }
 
 var (
@@ -51,13 +48,15 @@ func GetKernelStore() store_spec.IKernelStoreKv {
 	owner := d0.LetOwner(1, "isol_kern_store")
 	kCtx := kern_ctx.GetKernCtx()
 	param := &log_buf.LogBufParam{
-		Prefix_: d0.LetTxt("kStoreKv"),
+		Owner_:owner,
+		Prefix_: d0.LetTxt(owner, "kStoreKv"),
 		IsTerm_: d0.MutSafeBool(owner, true),
 	}
 	log := d1.NewLogBuf(param)
 	sf := &kStoreKv{
 		MSafeMutex: d0.MutSafeMutex(),
 		owner:      owner,
+		streamName: stream_name.NewAStreamName(owner, "kstore_kv"),
 		kCtx:       kCtx,
 		lCtx:       d1.NewLocalCtx(owner, kCtx.SelfCtx()),
 		wg:         kCtx.Wg(),
@@ -66,7 +65,7 @@ func GetKernelStore() store_spec.IKernelStoreKv {
 	}
 	sf.open()
 	kernStore = sf
-	kCtx.Set(d0.LetTxt("kernStoreKV"), kernStore, "fast KV store on Badger")
+	kCtx.Set(d0.LetTxt(owner, "kernStoreKV"), kernStore, "fast KV store on Badger")
 	return kernStore
 }
 
@@ -87,7 +86,7 @@ func (sf *kStoreKv) Set(rec store_ent.IRecKvFix) *d0.Result[d0.Bool] {
 	}
 	err := sf.db.Update(fnSet)
 	if err != nil {
-		err := d0.LetErr("Set(): key=%v, err=\n\t%w", key, err)
+		err := d0.LetErr(sf.owner, "Set(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err)
 		return d0.ResErr[d0.Bool](err)
 	}
@@ -110,7 +109,7 @@ func (sf *kStoreKv) Get(key store_ent.IStoreKeyFix) *d0.Result[[]byte] {
 	}
 	err := sf.db.View(fnGet)
 	if err != nil {
-		err := d0.LetErr("Get(): key=%v, err=\n\t%v", key, err)
+		err := d0.LetErr(sf.owner, "Get(): key=%v, err=\n\t%v", key, err)
 		sf.log.Err(err)
 		return d0.ResErr[[]byte](err)
 	}
@@ -144,7 +143,7 @@ func (sf *kStoreKv) ByPrefix(prefix store_ent.IStoreKeyFix) *d0.Result[[]store_e
 	}
 	err := sf.db.View(fnPrefix)
 	if err != nil {
-		err := d0.LetErr("ByPrefix(): in find, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "ByPrefix(): in find, err=\n\t%w", err)
 		return d0.ResErr[[]store_ent.AStoreKey](err)
 	}
 	return d0.ResOk(lstKey)
@@ -161,7 +160,7 @@ func (sf *kStoreKv) Delete(key store_ent.IStoreKeyFix) *d0.Result[d0.Bool] {
 	}
 	err := sf.db.Update(fnDelete)
 	if err != nil {
-		err := d0.LetErr("Delete(): key=%v, err=\n\t%w", key, err)
+		err := d0.LetErr(sf.owner, "Delete(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err)
 		return d0.ResErr[d0.Bool](err)
 	}
@@ -177,12 +176,12 @@ func (sf *kStoreKv) open() {
 	d0.If(strPath == "").Hassert("open(): env LOCAL_STORE_PATH not set")
 	pwd, err := os.Getwd()
 	d0.If(err != nil).Hassert("open(): in get PWD, err=\n\t%v", err)
-	sf.storePath = d0.LetTxt(pwd + strPath + "/db_local")
+	sf.storePath = d0.LetTxt(sf.owner, pwd + strPath + "/db_local")
 	err = os.MkdirAll(sf.storePath.String(), 0750)
 	d0.If(err != nil).Hassert("open(): in make dir %v, err=\n\t%v", sf.storePath, err)
 	sf.db, err = badger.Open(badger.DefaultOptions(sf.storePath.String()))
 	d0.If(err != nil).Hassert("open(): in open DB %v, err=\n\t%v", sf.storePath, err)
-	sf.wg.Add(storeStreamName)
+	sf.wg.Add(sf.streamName)
 	sf.isWork.Set()
 	go sf.close()
 	go sf.clean()
@@ -234,6 +233,6 @@ func (sf *kStoreKv) close() {
 	sf.isWork.Reset()
 	err := sf.db.Close()
 	d0.If(err != nil).Assert("kStoreKv.close(): in close DB, err=\n\t%v", err)
-	sf.wg.Done(storeStreamName)
+	sf.wg.Done(sf.streamName)
 	sf.log.Debug("close(): done")
 }

+ 7 - 9
v4/d2/lsi/kstore_kv/kstore_kv_test.go

@@ -20,6 +20,7 @@ type tester struct {
 	ctx   *kern_ctx.KernCtx
 	wg    kspec.IKernelWg
 	owner *d0.LOwner
+	streamName *stream_name.AStreamName
 }
 
 func TestKernelStore(t *testing.T) {
@@ -31,6 +32,7 @@ func TestKernelStore(t *testing.T) {
 		ctx:   kCtx,
 		wg:    kCtx.Wg(),
 		owner: owner,
+		streamName: stream_name.NewAStreamName(owner, "123"),
 	}
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
 	_ = os.Setenv("LOCAL_STORE_PATH", "/store/store_kernel")
@@ -54,7 +56,7 @@ func (sf *tester) workBad1() {
 	sf.t.Log("workBad1")
 	key := store_ent.NewStoreKeyFix("test_key")
 	recVal := store_ent.NewRecValFix([]byte("test_val"))
-	rec := store_ent.NewRecKvFix(key, recVal)
+	rec := store_ent.NewRecKvFix(sf.owner, key, recVal)
 	res := kernStore.Set(rec)
 	if res.IsOk() {
 		sf.t.Fatalf("workBad1(): set, err==nil")
@@ -89,7 +91,7 @@ func (sf *tester) byPrefix() {
 	sf.t.Log("byPrefix")
 	key := rec_key.NewRecKey("test_key2")
 	val := store_ent.NewRecValFix([]byte("test_val"))
-	rec := store_ent.NewRecKvFix(key, val)
+	rec := store_ent.NewRecKvFix(sf.owner, key, val)
 	res0 := kernStore.Set(rec)
 	if res0.IsErr() {
 		sf.t.Fatalf("byPrefix(): err=%v", res0.Err())
@@ -120,24 +122,20 @@ func (sf *tester) set() {
 	sf.t.Log("set")
 	key := rec_key.NewRecKey("test_key")
 	val := store_ent.NewRecValFix([]byte("test_val"))
-	rec := store_ent.NewRecKvFix(key, val)
+	rec := store_ent.NewRecKvFix(sf.owner, key, val)
 	res := kernStore.Set(rec)
 	if res.IsErr() {
 		sf.t.Fatalf("set(): err=%v", res.Err())
 	}
 }
 
-var (
-	qName = stream_name.NewAStreamName("123")
-)
-
 // Закрытие хранилища.
 func (sf *tester) close() {
 	sf.t.Log("close")
-	sf.wg.Add(qName)
+	sf.wg.Add(sf.streamName)
 	sf.ctx.Cancel()
 	time.Sleep(time.Millisecond * 20)
-	go sf.wg.Done(qName)
+	go sf.wg.Done(sf.streamName)
 	sf.wg.Wait()
 	kernStore.close()
 	prefix := store_ent.NewStoreKeyFix("test")

+ 4 - 2
v4/d2/lsi/store_ent/dict_rec/dict_rec.go

@@ -21,13 +21,15 @@ type IDictRec interface {
 
 // DictRec -- потокобезопасный словарь KV-бакета.
 type DictRec struct {
+	owner *d0.LOwner
 	dict  map[rec_key.ARecKey]rec_kv.IRecKvFix
 	block *d0.MSafeMutex
 }
 
 // NewDictRec -- создание нового потокобезопасного словаря KV.
-func NewDictRec() *DictRec {
+func NewDictRec(owner *d0.LOwner) *DictRec {
 	sf := &DictRec{
+		owner: owner,
 		dict:  map[rec_key.ARecKey]rec_kv.IRecKvFix{},
 		block: d0.MutSafeMutex(),
 	}
@@ -49,7 +51,7 @@ func (sf *DictRec) Get(key rec_key.IRecKeyFix) *d0.Option[rec_kv.IRecKvFix] {
 // Set -- установка значения по ключу.
 func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *d0.Result[d0.Bool] {
 	if rec == nil {
-		err := d0.LetErr("DictRec.Set(): rec is nil")
+		err := d0.LetErr(sf.owner, "DictRec.Set(): rec is nil")
 		return d0.ResErr[d0.Bool](err)
 	}
 	sf.block.Lock()

+ 9 - 5
v4/d2/lsi/store_ent/dict_rec/dict_rec_test.go

@@ -3,20 +3,24 @@ package dict_rec
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_kv"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_val"
 )
 
 type tester struct {
-	t    *testing.T
-	dict *DictRec
+	t     *testing.T
+	dict  *DictRec
+	owner *d0.LOwner
 }
 
 func TestDictRec(t *testing.T) {
+	owner := d0.LetOwner(1, "test_owner")
 	sf := &tester{
-		t:    t,
-		dict: NewDictRec(),
+		t:     t,
+		owner: owner,
+		dict:  NewDictRec(owner),
 	}
 	if sf.dict == nil {
 		sf.t.Fatal("DictRec is nil")
@@ -53,7 +57,7 @@ func (sf *tester) set_good1() {
 func (sf *tester) new_rec(key rec_key.ARecKey) rec_kv.IRecKvFix {
 	_key := rec_key.NewRecKey(key)
 	val := rec_val.NewRecVal([]byte(key + "_val"))
-	rec := rec_kv.NewRecKv(_key, val)
+	rec := rec_kv.NewRecKv(sf.owner, _key, val)
 	return rec
 }
 

+ 10 - 8
v4/d2/lsi/store_ent/rec_kv/rec_kv.go

@@ -20,20 +20,22 @@ type IRecKvFix interface {
 
 // RecKv -- запись KV-хранилища.
 type RecKv struct {
-	key  rec_key.IRecKeyFix // Ключ записи
-	meta rec_meta.IRecMeta  // Метаданные записи
-	val  rec_val.IRecValFix // Значение записи
+	owner *d0.LOwner
+	key   rec_key.IRecKeyFix // Ключ записи
+	meta  rec_meta.IRecMeta  // Метаданные записи
+	val   rec_val.IRecValFix // Значение записи
 }
 
 // NewRecKv -- создает новую запись.
-func NewRecKv(key rec_key.IRecKeyFix, val rec_val.IRecValFix) *RecKv {
+func NewRecKv(owner *d0.LOwner, key rec_key.IRecKeyFix, val rec_val.IRecValFix) *RecKv {
 	d0.If(key == nil).Hassert("NewRecKv(): key==nil")
 	d0.If(val == nil).Hassert("NewRecKv(): val==nil")
-	meta := rec_meta.NewRecMeta(key)
+	meta := rec_meta.NewRecMeta(owner, key)
 	sf := &RecKv{
-		key:  key,
-		meta: meta,
-		val:  val,
+		owner: owner,
+		key:   key,
+		meta:  meta,
+		val:   val,
 	}
 	_ = IRecKvFix(sf)
 	return sf

+ 6 - 3
v4/d2/lsi/store_ent/rec_kv/rec_kv_test.go

@@ -3,6 +3,7 @@ package rec_kv
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_meta"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_val"
@@ -10,11 +11,13 @@ import (
 
 type tester struct {
 	t *testing.T
+	owner *d0.LOwner
 }
 
 func TestRecKv(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner: d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 }
@@ -35,9 +38,9 @@ func (sf *tester) new_good1() {
 		}
 	}()
 	key := rec_key.NewRecKey("test_key")
-	meta := rec_meta.IRecMeta(rec_meta.NewRecMeta(key))
+	meta := rec_meta.IRecMeta(rec_meta.NewRecMeta(sf.owner, key))
 	val := rec_val.NewRecVal([]byte("test_val"))
-	rec := NewRecKv(key, val)
+	rec := NewRecKv(sf.owner, key, val)
 	if rec.Meta() == meta {
 		sf.t.Fatalf("new_good1(): rec.Meta()==meta")
 	}
@@ -54,5 +57,5 @@ func (sf *tester) new_bad1() {
 			sf.t.Fatalf("new_bad1(): panic==nil")
 		}
 	}()
-	_ = NewRecKv(nil, nil)
+	_ = NewRecKv(nil, nil, nil)
 }

+ 4 - 2
v4/d2/lsi/store_ent/rec_meta/rec_meta.go

@@ -25,6 +25,7 @@ type IRecMeta interface {
 // Даже если ключ содержит пробелы или экранированное форматирование
 // JSON их экранирует внутри.
 type RecMeta struct {
+	owner      *d0.LOwner
 	Key_       rec_key.ARecKey `json:"key"`       // Ключ
 	Vers_      int64           `json:"vers"`      // Версия записи
 	Operation_ *d0.LTxt        `json:"operation"` // Тип операции над записью
@@ -37,12 +38,13 @@ type RecMeta struct {
 }
 
 // NewRecMeta -- создание новой мета-информации записи KV-хранилища.
-func NewRecMeta(key rec_key.IRecKeyFix) *RecMeta {
+func NewRecMeta(owner *d0.LOwner, key rec_key.IRecKeyFix) *RecMeta {
 	d0.If(key == nil).Hassert("NewRecMeta: key==nil")
 	sf := &RecMeta{
+		owner:      owner,
 		Key_:       key.Get(),
 		Vers_:      1,
-		Operation_: d0.LetTxt("create"),
+		Operation_: d0.LetTxt(owner, "create"),
 		createdAt_: d0.LetTimeAuto(),
 		updateAt_:  d0.MutTimeAuto(),
 	}

+ 7 - 4
v4/d2/lsi/store_ent/rec_meta/rec_meta_test.go

@@ -3,17 +3,20 @@ package rec_meta
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
 )
 
 type tester struct {
-	t    *testing.T
-	meta *RecMeta
+	t     *testing.T
+	owner *d0.LOwner
+	meta  *RecMeta
 }
 
 func TestRecMeta(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
+		owner: d0.LetOwner(1, "test_owner"),
 	}
 	sf.new()
 	sf.gets()
@@ -60,7 +63,7 @@ func (sf *tester) newBad1() {
 		}
 	}()
 	key := rec_key.NewRecKey("test")
-	sf.meta = NewRecMeta(key)
+	sf.meta = NewRecMeta(sf.owner, key)
 	if sf.meta == nil {
 		sf.t.Fatalf("newBad1(): sf.meta==nil")
 	}

+ 5 - 4
v4/d2/lsi/store_ent/store_ent.go

@@ -1,6 +1,7 @@
 package store_ent
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/dict_rec"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_kv"
@@ -23,8 +24,8 @@ type IDictRec = dict_rec.IDictRec
 // NewDictRec -- возвращает новый словарь записей.
 //
 
-func NewDictRec() IDictRec {
-	return dict_rec.NewDictRec()
+func NewDictRec(owner *d0.LOwner) IDictRec {
+	return dict_rec.NewDictRec(owner)
 }
 
 // IRecValFix -- значение ключа хранилища.
@@ -46,6 +47,6 @@ type IRecKvFix = rec_kv.IRecKvFix
 // NewRecKvFix -- возвращает новую запись хранилища.
 //
 
-func NewRecKvFix(key IStoreKeyFix, val IRecValFix) IRecKvFix {
-	return rec_kv.NewRecKv(key, val)
+func NewRecKvFix(owner *d0.LOwner,key IStoreKeyFix, val IRecValFix) IRecKvFix {
+	return rec_kv.NewRecKv(owner, key, val)
 }

+ 3 - 2
v4/d2/lti/bus_ent/bus_ent.go

@@ -2,6 +2,7 @@
 package bus_ent
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/handler_name"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
 )
@@ -34,6 +35,6 @@ type LHandlerName = handler_name.LHandlerName
 // NewHandlerNameFix -- создать новое неизменяемое имя функции обработчика.
 //
 
-func NewHandlerNameFix(name AHandlerName) *LHandlerName {
-	return handler_name.LetHandlerName(name)
+func NewHandlerNameFix(owner *d0.LOwner, name AHandlerName) *LHandlerName {
+	return handler_name.LetHandlerName(owner, name)
 }

+ 4 - 2
v4/d2/lti/bus_ent/handler_name/handler_name.go

@@ -10,14 +10,16 @@ type AHandlerName d0.Txt
 
 // LHandlerName -- имя функции обработчика.
 type LHandlerName struct {
+	owner *d0.LOwner
 	val AHandlerName
 }
 
 // LetHandlerName -- создать новое имя функции обработчика.
-func LetHandlerName(val AHandlerName) *LHandlerName {
+func LetHandlerName(owner *d0.LOwner,val AHandlerName) *LHandlerName {
 	d0.If(val == "").Assert("NewAHandlerName: val is empty")
 	sf := &LHandlerName{
 		val: val,
+		owner: owner,
 	}
 	return sf
 }
@@ -34,5 +36,5 @@ func (sf *LHandlerName) String() string {
 
 // Txt -- внутренне представление имени функции обработчика.
 func (sf *LHandlerName) Txt() *d0.LTxt {
-	return d0.LetTxt(sf.val)
+	return d0.LetTxt(sf.owner, sf.val)
 }

+ 6 - 4
v4/d2/lti/bus_ent/handler_name/handler_name_test.go

@@ -2,6 +2,8 @@ package handler_name
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 )
 
 func TestNewAHandlerName_ok(t *testing.T) {
@@ -12,12 +14,12 @@ func TestNewAHandlerName_ok(t *testing.T) {
 		"Handler_1",
 		"имя_обработчика",
 	}
-
+	owner := d0.LetOwner(1, "test_owner_1")
 	for _, tc := range cases {
 		t.Run(string(tc), func(t *testing.T) {
 			t.Parallel()
 
-			hn := LetHandlerName(tc)
+			hn := LetHandlerName(owner, tc)
 			if hn == nil {
 				t.Fatalf("NewAHandlerName(): nil")
 			}
@@ -39,6 +41,6 @@ func TestNewAHandlerName_empty_panics(t *testing.T) {
 			t.Fatalf("expected panic, got nil")
 		}
 	}()
-
-	_ = LetHandlerName("")
+	owner := d0.LetOwner(1, "test_owner_2")
+	_ = LetHandlerName(owner, "")
 }

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

@@ -26,7 +26,7 @@ func NewMockHandlerServe(topic *topic.LTopic, name bus_ent.AHandlerName) *MockHa
 	sf := &MockHandlerServe{
 		owner:  owner,
 		Topic_: topic,
-		Name_:  bus_ent.NewHandlerNameFix(name),
+		Name_:  bus_ent.NewHandlerNameFix(owner, name),
 		IsBad_: d0.MutSafeBool(owner, false),
 		block:  d0.MutSafeMutex(),
 	}
@@ -39,7 +39,7 @@ func (sf *MockHandlerServe) FnBack(binMsg []byte) *d0.Result[[]byte] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if sf.IsBad_.IsOk() {
-		err := d0.LetErr("FnBack(): isBad==true")
+		err := d0.LetErr(sf.owner, "FnBack(): isBad==true")
 		return d0.ResErr[[]byte](err)
 	}
 	sf.Msg_ = binMsg

+ 6 - 4
v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http.go

@@ -14,6 +14,7 @@ import (
 
 // MockHandSubHttp -- обработчик подписки по HTTP.
 type MockHandSubHttp struct {
+	owner    *d0.LOwner
 	Name_    *bus_ent.LHandlerName // Уникальное имя обработчика
 	Topic_   *topic.LTopic         // Имя топика, на который подписан обработчик
 	WebHook_ *d0.LTxt              // Куда обращаться при запросах
@@ -22,15 +23,16 @@ type MockHandSubHttp struct {
 }
 
 // NewMockHandSubHttp -- возвращает новый обработчик подписки по HTTP.
-func NewMockHandSubHttp(topic *topic.LTopic, webHook *d0.LTxt) bus_spec.IBusHandlerSubscribe {
+func NewMockHandSubHttp(owner *d0.LOwner, topic *topic.LTopic, webHook *d0.LTxt) bus_spec.IBusHandlerSubscribe {
 	d0.If(topic == nil).Hassert("NewHandlerHttpSub(): topic is empty")
 	d0.If(webHook.Get() == "").Hassert("NewHandlerHttpSub(): webHook is empty")
 	sf := &MockHandSubHttp{
+		owner:  owner,
 		block:  d0.MutSafeMutex(),
 		Topic_: topic,
-		Name_: handler_name.LetHandlerName(
+		Name_: handler_name.LetHandlerName(owner,
 			bus_ent.AHandlerName(
-				webHook.String() + "_" + rand.Text())),
+				webHook.String()+"_"+rand.Text())),
 		WebHook_: webHook,
 	}
 	return sf
@@ -68,5 +70,5 @@ func (sf *MockHandSubHttp) FnBack(binMsg []byte) {
 func (sf *MockHandSubHttp) Msg() *d0.LTxt {
 	sf.block.Lock()
 	defer sf.block.Unlock()
-	return d0.LetTxt(d0.Txt(sf.BinMsg_))
+	return d0.LetTxt(sf.owner, d0.Txt(sf.BinMsg_))
 }

+ 4 - 4
v4/d2/lti/bus_mock/mock_hand_sub_http/mock_hand_sub_http_test.go

@@ -47,7 +47,7 @@ func TestHandlerHttpSub(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "comment")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "monolitName"), "test_monolit", "comment")
 	sf.new()
 	sf.back()
 	sf.kCtx.Cancel()
@@ -71,7 +71,7 @@ func (sf *tester) backBad2() {
 	sf.t.Log("backBad2")
 	kernServ := kserv_http.GetKernelServHttp()
 	fiberApp := kernServ.Fiber()
-	sf.hand.WebHook_ = d0.LetTxt(baseUrl + "test/local")
+	sf.hand.WebHook_ = d0.LetTxt(sf.owner, baseUrl + "test/local")
 	fiberApp.Post("/test/local", sf.testLocal)
 	kernServ.Run()
 	sf.isBad = true
@@ -110,14 +110,14 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.hand = NewMockHandSubHttp(qTopicTest, d0.LetTxt("/test/local")).(*MockHandSubHttp)
+	sf.hand = NewMockHandSubHttp(sf.owner, qTopicTest, d0.LetTxt(sf.owner,"/test/local")).(*MockHandSubHttp)
 	if sf.hand == nil {
 		sf.t.Fatalf("newGood1(): handler==nil")
 	}
 	if name := sf.hand.Name(); !strings.Contains(name.String(), "/test/local_") {
 		sf.t.Fatalf("newGood1(): name(%v)!='/test/local_'", name)
 	}
-	sf.hand.SetName(handler_name.LetHandlerName("test_name"))
+	sf.hand.SetName(handler_name.LetHandlerName(sf.owner, "test_name"))
 	if name := sf.hand.Name(); name.Get() != "test_name" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_name'", name)
 	}

+ 5 - 3
v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub.go

@@ -11,6 +11,7 @@ import (
 )
 
 type MockHandlerSub struct {
+	owner  *d0.LOwner
 	Msg_   []byte                // Для обратного вызова
 	Name_  *bus_ent.LHandlerName // Уникальное имя мок-обработчика подписки
 	Topic_ *topic.LTopic         // Имя топика подписки
@@ -18,11 +19,12 @@ type MockHandlerSub struct {
 }
 
 // NewMockHandlerSub -- возвращает новый обработчик подписки.
-func NewMockHandlerSub(topic *topic.LTopic, localHook *d0.LTxt) *MockHandlerSub {
+func NewMockHandlerSub(owner *d0.LOwner, topic *topic.LTopic, localHook *d0.LTxt) *MockHandlerSub {
 	d0.If(topic == nil).Hassert("NewMockHandlerSub(): topic is nil")
 	d0.If(localHook == nil).Hassert("NewMockHandlerSub(): name is empty")
-	handlerName := bus_ent.NewHandlerNameFix(bus_ent.AHandlerName(localHook.String() + "_" + rand.Text()))
+	handlerName := bus_ent.NewHandlerNameFix(owner, bus_ent.AHandlerName(localHook.String()+"_"+rand.Text()))
 	sf := &MockHandlerSub{
+		owner:  owner,
 		block:  d0.MutSafeMutex(),
 		Topic_: topic,
 		Name_:  handlerName,
@@ -35,7 +37,7 @@ func NewMockHandlerSub(topic *topic.LTopic, localHook *d0.LTxt) *MockHandlerSub
 func (sf *MockHandlerSub) Msg() *d0.LTxt {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
-	return d0.LetTxt(d0.Txt(sf.Msg_))
+	return d0.LetTxt(sf.owner, d0.Txt(sf.Msg_))
 }
 
 // Функция обратного вызова подписки.

+ 3 - 1
v4/d2/lti/bus_mock/mock_hand_sub_local/mock_hand_sub_test.go

@@ -10,12 +10,14 @@ import (
 
 type tester struct {
 	t    *testing.T
+	owner *d0.LOwner
 	hand *MockHandlerSub
 }
 
 func TestMockHandleServe(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner: d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 	sf.back()
@@ -47,7 +49,7 @@ var (
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	sf.hand = NewMockHandlerSub(qTopicTest, d0.LetTxt("test_name"))
+	sf.hand = NewMockHandlerSub(sf.owner, qTopicTest, d0.LetTxt(sf.owner, "test_name"))
 	if sf.hand == nil {
 		sf.t.Fatalf("newGood1(): handler==nil")
 	}

+ 4 - 2
v4/d2/lti/dot/msg_pub/msg_pub_test.go

@@ -9,11 +9,13 @@ import (
 
 type tester struct {
 	t *testing.T
+	owner *d0.LOwner
 }
 
 func TestPublishMsg(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner:d0.LetOwner(1,"test_owner"),
 	}
 	sf.req()
 	sf.resp()
@@ -24,7 +26,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &PublishResp{
-		Status_: d0.LetTxt("test_ok"),
+		Status_: d0.LetTxt(sf.owner, "test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,7 +53,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &PublishReq{
 		Topic_:  qName,
-		Uuid_:   d0.LetTxt("test_uuid"),
+		Uuid_:   d0.LetTxt(sf.owner, "test_uuid"),
 		BinMsg_: []byte("test msg"),
 	}
 	req.SelfCheck()

+ 6 - 4
v4/d2/lti/dot/msg_serve/msg_serve_test.go

@@ -8,12 +8,14 @@ import (
 )
 
 type tester struct {
-	t *testing.T
+	t     *testing.T
+	owner *d0.LOwner
 }
 
 func TestServeMsg(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
+		owner: d0.LetOwner(1, "test_owner"),
 	}
 	sf.req()
 	sf.resp()
@@ -24,7 +26,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &ServeResp{
-		Status_: d0.LetTxt("test_ok"),
+		Status_: d0.LetTxt(sf.owner, "test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,7 +53,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &ServeReq{
 		Topic_:  qName,
-		Uuid_:   d0.LetTxt("test_uuid"),
+		Uuid_:   d0.LetTxt(sf.owner, "test_uuid"),
 		BinReq_: []byte("test msg"),
 	}
 	req.SelfCheck()

+ 7 - 5
v4/d2/lti/dot/msg_sub/msg_sub_test.go

@@ -8,12 +8,14 @@ import (
 )
 
 type tester struct {
-	t *testing.T
+	t     *testing.T
+	owner *d0.LOwner
 }
 
 func TestPublishMsg(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
+		owner: d0.LetOwner(1, "test_owner"),
 	}
 	sf.req()
 	sf.resp()
@@ -24,7 +26,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &SubscribeResp{
-		Status_: d0.LetTxt("test_ok"),
+		Status_: d0.LetTxt(sf.owner, "test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -51,8 +53,8 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &SubscribeReq{
 		Topic_:   qName,
-		Uuid_:    d0.LetTxt("test_uuid"),
-		WebHook_: d0.LetTxt("test msg"),
+		Uuid_:    d0.LetTxt(sf.owner,"test_uuid"),
+		WebHook_: d0.LetTxt(sf.owner,"test msg"),
 	}
 	req.SelfCheck()
 }

+ 4 - 2
v4/d2/lti/dot/msg_unsub/msg_unsub_test.go

@@ -9,11 +9,13 @@ import (
 
 type tester struct {
 	t *testing.T
+	owner *d0.LOwner
 }
 
 func TestPublishMsg(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner: d0.LetOwner(1,"test_owner"),
 	}
 	sf.req()
 	sf.resp()
@@ -24,7 +26,7 @@ func (sf *tester) resp() {
 	sf.t.Log("resp")
 	sf.respBad1()
 	resp := &UnsubResp{
-		Status_: d0.LetTxt("test_ok"),
+		Status_: d0.LetTxt(sf.owner, "test_ok"),
 	}
 	resp.SelfCheck()
 }
@@ -47,7 +49,7 @@ func (sf *tester) req() {
 	sf.reqBad1()
 	req := &UnsubReq{
 		HandlerName_: bus_ent.AHandlerName("test_topic"),
-		Uuid_:        d0.LetTxt("test_uuid"),
+		Uuid_:        d0.LetTxt(sf.owner, "test_uuid"),
 	}
 	req.SelfCheck()
 }

+ 6 - 4
v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook.go

@@ -11,14 +11,16 @@ import (
 // dictSubHook -- словарь потребителей топика по подписке.
 type dictSubHook struct {
 	kCtx  *kern_ctx.KernCtx
+	owner *d0.LOwner
 	dict  map[bus_ent.AHandlerName]struct{} // В качестве ключа -- URL веб-хука
 	block *d0.MSafeMutex
 }
 
 // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
-func NewDictSubHook() bus_spec.IDictSubHook {
+func NewDictSubHook(owner *d0.LOwner) bus_spec.IDictSubHook {
 	sf := &dictSubHook{
 		kCtx:  kern_ctx.GetKernCtx(),
+		owner:owner,
 		dict:  map[bus_ent.AHandlerName]struct{}{},
 		block: d0.MutSafeMutex(),
 	}
@@ -30,7 +32,7 @@ func (sf *dictSubHook) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if handler == nil {
-		err := d0.LetErr("dictSubHook.Unsubscribe(): handler==nil")
+		err := d0.LetErr(sf.owner, "dictSubHook.Unsubscribe(): handler==nil")
 		sf.kCtx.Log().Err(err)
 		return
 	}
@@ -54,9 +56,9 @@ func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	for handlerName := range sf.dict {
-		optHand := sf.kCtx.Get(d0.LetTxt(handlerName))
+		optHand := sf.kCtx.Get(d0.LetTxt(sf.owner, handlerName))
 		if optHand.IsNone() {
-			sf.kCtx.Del(d0.LetTxt(handlerName))
+			sf.kCtx.Del(d0.LetTxt(sf.owner, handlerName))
 			continue
 		}
 		handler := optHand.Some().Val().(bus_spec.IBusHandlerSubscribe)

+ 6 - 3
v4/d2/lti/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -10,6 +10,7 @@ import (
 
 type tester struct {
 	t        *testing.T
+	owner *d0.LOwner
 	dict     *dictSubHook
 	handSub  *mock_hand_sub_local.MockHandlerSub
 	handSub2 *mock_hand_sub_local.MockHandlerSub
@@ -21,10 +22,12 @@ var (
 )
 
 func TestDictSubWebHook(t *testing.T) {
+	owner:=d0.LetOwner(1,"test_owner")
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicHand1, d0.LetTxt("hand_name1")),
-		handSub2: mock_hand_sub_local.NewMockHandlerSub(qTopicHand2, d0.LetTxt("hand_name2")),
+		owner:owner,
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(owner, qTopicHand1, d0.LetTxt(owner, "hand_name1")),
+		handSub2: mock_hand_sub_local.NewMockHandlerSub(owner, qTopicHand2, d0.LetTxt(owner, "hand_name2")),
 	}
 	sf.new()
 	sf.add()
@@ -70,7 +73,7 @@ func (sf *tester) addBad1() {
 // Создание словаря.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.dict = NewDictSubHook().(*dictSubHook)
+	sf.dict = NewDictSubHook(sf.owner).(*dictSubHook)
 	if sf.dict == nil {
 		sf.t.Fatalf("new(): dict==nil")
 	}

+ 10 - 6
v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve.go

@@ -18,14 +18,16 @@ import (
 type dictServe struct {
 	*d0.MSafeMutex
 	kCtx      *kern_ctx.KernCtx
+	owner *d0.LOwner
 	dictServe map[bus_ent.ATopic]bus_spec.IBusHandlerServe
 }
 
 // NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов.
-func NewDictServe() *dictServe {
+func NewDictServe(owner *d0.LOwner) *dictServe {
 	sf := &dictServe{
 		MSafeMutex: d0.MutSafeMutex(),
 		kCtx:       kern_ctx.GetKernCtx(),
+		owner:owner,
 		dictServe:  map[bus_ent.ATopic]bus_spec.IBusHandlerServe{},
 	}
 	return sf
@@ -36,13 +38,13 @@ func (sf *dictServe) Register(handler bus_spec.IBusHandlerServe) *d0.Result[d0.B
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
-		err := d0.LetErr("dictServe.Register(): IBusHandlerSubscribe==nil")
+		err := d0.LetErr(sf.owner, "dictServe.Register(): IBusHandlerSubscribe==nil")
 		return d0.ResErr[d0.Bool](err)
 	}
 	topic := handler.Topic()
 	isTwinRegister := sf.register(handler)
 	if isTwinRegister {
-		err := d0.LetErr("dictServe.Register(): handler of topic (%v) already register", topic.Get())
+		err := d0.LetErr(sf.owner, "dictServe.Register(): handler of topic (%v) already register", topic.Get())
 		return d0.ResErr[d0.Bool](err)
 	}
 	return d0.ResOk(d0.Bool(true))
@@ -53,7 +55,7 @@ func (sf *dictServe) Unregister(handler bus_spec.IBusHandlerServe) {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
-		err := d0.LetErr("dictServe.Unregister(): IBusHandlerSubscribe==nil")
+		err := d0.LetErr(sf.owner, "dictServe.Unregister(): IBusHandlerSubscribe==nil")
 		sf.kCtx.Log().Err(err)
 		return
 	}
@@ -66,7 +68,8 @@ func (sf *dictServe) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Result[
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic.Get()]
 	if !isOk {
-		err := d0.LetErr("dictServe.SendRequest(): handler for topic (%v) not exists", topic.Get())
+		err := d0.LetErr(sf.owner,
+			"dictServe.SendRequest(): handler for topic (%v) not exists", topic.Get())
 		return d0.ResErr[[]byte](err)
 	}
 	var (
@@ -82,7 +85,8 @@ func (sf *dictServe) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Result[
 	go fnCall()
 	select {
 	case <-ctx.Done():
-		err := d0.LetErr("dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic.Get(), ctx.Err())
+		err := d0.LetErr(sf.owner,
+			"dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic.Get(), ctx.Err())
 		return d0.ResErr[[]byte](err)
 	case res := <-chRes:
 		return res

+ 10 - 6
v4/d2/lti/kbus/dict_topic_serve/dict_topic_serve_test.go

@@ -3,15 +3,17 @@ package dict_topic_serve
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/kern_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_ent/topic"
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/bus_mock/mock_hand_serve"
 )
 
 type tester struct {
-	t    *testing.T
-	dict *dictServe
-	hand *mock_hand_serve.MockHandlerServe
+	t     *testing.T
+	owner *d0.LOwner
+	dict  *dictServe
+	hand  *mock_hand_serve.MockHandlerServe
 }
 
 var (
@@ -19,9 +21,11 @@ var (
 )
 
 func TestDictSub(t *testing.T) {
+	owner := d0.LetOwner(1, "test_owner")
 	sf := &tester{
-		t:    t,
-		hand: mock_hand_serve.NewMockHandlerServe(qTopicServ, "name_dict_serve"),
+		t:     t,
+		owner: owner,
+		hand:  mock_hand_serve.NewMockHandlerServe(qTopicServ, "name_dict_serve"),
 	}
 	sf.new()
 	sf.addBad1()
@@ -135,7 +139,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictServe()
+	sf.dict = NewDictServe(sf.owner)
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictServe==nil")
 	}

+ 4 - 2
v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub.go

@@ -20,14 +20,16 @@ type tReadReq struct {
 type dictTopicSub struct {
 	*d0.MSafeMutex
 	kCtx          *kern_ctx.KernCtx
+	owner         *d0.LOwner
 	dictTopicHook map[bus_ent.ATopic]bus_spec.IDictSubHook
 }
 
 // NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков.
-func NewDictTopicSub() *dictTopicSub {
+func NewDictTopicSub(owner *d0.LOwner) *dictTopicSub {
 	sf := &dictTopicSub{
 		MSafeMutex:    d0.MutSafeMutex(),
 		kCtx:          kern_ctx.GetKernCtx(),
+		owner:         owner,
 		dictTopicHook: map[bus_ent.ATopic]bus_spec.IDictSubHook{},
 	}
 	return sf
@@ -57,7 +59,7 @@ func (sf *dictTopicSub) Subscribe(handler bus_spec.IBusHandlerSubscribe) {
 	topic := handler.Topic()
 	dictSubHook := sf.dictTopicHook[topic.Get()]
 	if dictSubHook == nil {
-		dictSubHook := dict_sub_hook.NewDictSubHook()
+		dictSubHook := dict_sub_hook.NewDictSubHook(sf.owner)
 		sf.dictTopicHook[topic.Get()] = dictSubHook
 	}
 	dictSubHook.Subscribe(handler)

+ 6 - 3
v4/d2/lti/kbus/dict_topic_sub/dict_topic_sub_test.go

@@ -11,6 +11,7 @@ import (
 
 type tester struct {
 	t    *testing.T
+	owner *d0.LOwner
 	dict *dictTopicSub
 	hand *mock_hand_sub_local.MockHandlerSub
 }
@@ -24,9 +25,11 @@ var (
 )
 
 func TestDictSub(t *testing.T) {
+	owner:=d0.LetOwner(1,"test_owner")
 	sf := &tester{
 		t:    t,
-		hand: mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub, d0.LetTxt("name_dict_sub")),
+		owner:owner,
+		hand: mock_hand_sub_local.NewMockHandlerSub(owner, qTopicDictSub, d0.LetTxt(owner, "name_dict_sub")),
 	}
 	sf.new()
 	sf.addBad1()
@@ -45,7 +48,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, d0.LetTxt("name_dict_sub"))
+	hand := mock_hand_sub_local.NewMockHandlerSub(sf.owner, qTopicDictSub1, d0.LetTxt(sf.owner, "name_dict_sub"))
 	sf.dict.Unsubscribe(hand)
 	count := 0
 	for count < 100 {
@@ -130,7 +133,7 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.dict = NewDictTopicSub()
+	sf.dict = NewDictTopicSub(sf.owner)
 	if sf.dict == nil {
 		sf.t.Fatalf("newGood1(): DictSub==nil")
 	}

+ 33 - 30
v4/d2/lti/kbus_base/kbus_base.go

@@ -12,19 +12,16 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/kbus/dict_topic_sub"
 )
 
-var (
-	busBaseStreamName = stream_name.NewAStreamName("bus_base")
-)
-
 // KBusBase -- базовая часть шины данных.
 type KBusBase struct {
-	owner     *d0.LOwner
-	KCtx_     *kern_ctx.KernCtx
-	IsWork_   *d0.MSafeBool
-	lCtx      *d1.LocalCtx
-	log       *d1.LogBuf
-	dictSub   bus_spec.IDictTopicSub
-	dictServe bus_spec.IDictTopicServe
+	owner      *d0.LOwner
+	streamName *stream_name.AStreamName
+	KCtx_      *kern_ctx.KernCtx
+	IsWork_    *d0.MSafeBool
+	lCtx       *d1.LocalCtx
+	log        *d1.LogBuf
+	dictSub    bus_spec.IDictTopicSub
+	dictServe  bus_spec.IDictTopicServe
 }
 
 var (
@@ -43,23 +40,29 @@ func GetKernelBusBase() *KBusBase {
 	kCtx := kern_ctx.GetKernCtx()
 	lCtx := d1.NewLocalCtx(owner, kCtx.SelfCtx())
 	Bus_ = &KBusBase{
-		owner:     owner,
-		KCtx_:     kCtx,
-		IsWork_:   d0.MutSafeBool(owner, false),
-		dictSub:   dict_topic_sub.NewDictTopicSub(),
-		dictServe: dict_topic_serve.NewDictServe(),
-		lCtx:      lCtx,
+		owner:      owner,
+		streamName: stream_name.NewAStreamName(owner, "bus_base"),
+		KCtx_:      kCtx,
+		IsWork_:    d0.MutSafeBool(owner, false),
+		dictSub:    dict_topic_sub.NewDictTopicSub(owner),
+		dictServe:  dict_topic_serve.NewDictServe(owner),
+		lCtx:       lCtx,
 	}
 	Bus_.log = Bus_.lCtx.Log()
 	go Bus_.close()
 	go Bus_.run()
 	Bus_.IsWork_.Set()
-	Bus_.KCtx_.Wg().Add(busBaseStreamName)
-	Bus_.KCtx_.Set(d0.LetTxt("kernBusBase"), Bus_, "base of data bus")
+	Bus_.KCtx_.Wg().Add(Bus_.streamName)
+	Bus_.KCtx_.Set(d0.LetTxt(owner, "kernBusBase"), Bus_, "base of data bus")
 	_ = bus_spec.IKernelBus(Bus_)
 	return Bus_
 }
 
+// Owner --  возвращает владельца базовой шины
+func (sf *KBusBase) Owner() *d0.LOwner {
+	return sf.owner
+}
+
 // Log -- возвращает лог шины.
 func (sf *KBusBase) Log() *d1.LogBuf {
 	return sf.log
@@ -74,7 +77,7 @@ func (sf *KBusBase) run() {
 
 // Unsubscribe -- отписывает обработчик от топика.
 func (sf *KBusBase) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
-	msg := d0.LetTxt("KBusBase.Unsubscribe(): handler='%v'",
+	msg := d0.LetTxt(sf.owner, "KBusBase.Unsubscribe(): handler='%v'",
 		handler.Name())
 	sf.log.Debug(msg.Get())
 	sf.dictSub.Unsubscribe(handler)
@@ -82,7 +85,7 @@ func (sf *KBusBase) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 
 // Subscribe -- подписывает обработчик на топик.
 func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) *d0.Result[d0.Bool] {
-	msg := d0.LetTxt("KBusBase.Subscribe(): handler='%v'",
+	msg := d0.LetTxt(sf.owner, "KBusBase.Subscribe(): handler='%v'",
 		handler.Name()).Get()
 	sf.log.Debug(msg)
 	d0.If(sf.IsWork_.IsNot()).
@@ -94,16 +97,16 @@ func (sf *KBusBase) Subscribe(handler bus_spec.IBusHandlerSubscribe) *d0.Result[
 
 // SendRequest -- отправляет запрос в шину данных.
 func (sf *KBusBase) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Result[[]byte] {
-	msg := d0.LetTxt("KBusBase.SendRequest(): topic='%v'", topic.Get()).Get()
+	msg := d0.LetTxt(sf.owner, "KBusBase.SendRequest(): topic='%v'", topic.Get()).Get()
 	sf.log.Debug(msg)
 	if sf.IsWork_.IsNot() {
-		err := d0.LetErr("KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
+		err := d0.LetErr(sf.owner, "KBusBase.SendRequest():  topic='%v', bus already closed", topic.Get())
 		sf.log.Err(err)
 		return d0.ResErr[[]byte](err)
 	}
 	res := sf.dictServe.SendRequest(topic, binReq)
 	if res.IsErr() {
-		err := d0.LetErr("KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic.Get(), res.Err())
+		err := d0.LetErr(sf.owner, "KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic.Get(), res.Err())
 		sf.log.Err(err)
 		return d0.ResErr[[]byte](err)
 	}
@@ -113,14 +116,14 @@ func (sf *KBusBase) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Result[[
 // RegisterServe -- регистрирует обработчики входящих запросов.
 func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) *d0.Result[d0.Bool] {
 	if handler == nil {
-		err := d0.LetErr("KBusBase.RegisterServe(): IBusHandlerServe==nil")
+		err := d0.LetErr(sf.owner, "KBusBase.RegisterServe(): IBusHandlerServe==nil")
 		return d0.ResErr[d0.Bool](err)
 	}
-	msg := d0.LetTxt("KBusBase.RegisterServe(): handler='%v'", handler.Name()).Get()
+	msg := d0.LetTxt(sf.owner, "KBusBase.RegisterServe(): handler='%v'", handler.Name()).Get()
 	sf.log.Debug(msg)
 	res := sf.dictServe.Register(handler)
 	if res.IsErr() {
-		err := d0.LetErr("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
+		err := d0.LetErr(sf.owner, "KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
 		sf.log.Err(err)
 		return d0.ResErr[d0.Bool](err)
 	}
@@ -129,10 +132,10 @@ func (sf *KBusBase) RegisterServe(handler bus_spec.IBusHandlerServe) *d0.Result[
 
 // Publish -- публикует сообщение в шину.
 func (sf *KBusBase) Publish(topic *topic.LTopic, binMsg []byte) *d0.Result[d0.Bool] {
-	msg := d0.LetTxt("KBusBase.Publish(): topic='%v'", topic).Get()
+	msg := d0.LetTxt(sf.owner, "KBusBase.Publish(): topic='%v'", topic).Get()
 	sf.log.Debug(msg)
 	if sf.IsWork_.IsNot() {
-		err := d0.LetErr("KBusBase.Publish(): topic='%v',bus already closed", topic)
+		err := d0.LetErr(sf.owner, "KBusBase.Publish(): topic='%v',bus already closed", topic)
 		sf.log.Err(err)
 		return d0.ResErr[d0.Bool](err)
 	}
@@ -155,6 +158,6 @@ func (sf *KBusBase) close() {
 		return
 	}
 	sf.IsWork_.Reset()
-	sf.KCtx_.Wg().Done(busBaseStreamName)
+	sf.KCtx_.Wg().Done(sf.streamName)
 	sf.log.Debug("KBusBase.close(): done")
 }

+ 6 - 3
v4/d2/lti/kbus_base/kbus_base_test.go

@@ -13,6 +13,7 @@ import (
 
 type tester struct {
 	t        *testing.T
+	owner    *d0.LOwner
 	kBus     bus_spec.IKernelBus
 	handSub  bus_spec.IBusHandlerSubscribe
 	handServ bus_spec.IBusHandlerServe
@@ -24,10 +25,12 @@ var (
 )
 
 func TestKernelBusLocal(t *testing.T) {
+	owner := d0.LetOwner(1, "test_owner")
 	sf := &tester{
-		t: t,
-		handSub: mock_hand_sub_local.NewMockHandlerSub(qNameSub,
-			d0.LetTxt("mock_hand_sub")),
+		t:     t,
+		owner: owner,
+		handSub: mock_hand_sub_local.NewMockHandlerSub(owner, qNameSub,
+			d0.LetTxt(owner, "mock_hand_sub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServe,
 			"mock_hand_serv"),
 	}

+ 34 - 33
v4/d2/lti/kbus_http/client_bus_http/client_bus_http.go

@@ -33,27 +33,28 @@ type ClientBusHttp struct {
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины.
 func NewClientBusHttp(owner *d0.LOwner, urlRemote *d0.LTxt) bus_spec.IBusClient {
 	param := &log_buf.LogBufParam{
+		Owner_:owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
-		Prefix_: d0.LetTxt("ClientBusHttp"),
+		Prefix_: d0.LetTxt(owner, "ClientBusHttp"),
 	}
 	log := d1.NewLogBuf(param)
 	log.Debug("NewClientBusHttp()")
 	d0.If(urlRemote == nil).Hassert("NewClientBusHttp(): urlRemote is empty", []any{})
 	kCtx := d2.GetKernCtx()
-	resLocal := d0.MutSafeTxtFromEnv(
-		d0.LetTxt("LOCAL_HTTP_URL"))
+	resLocal := d0.MutSafeTxtFromEnv(owner, d0.LetTxt(owner, "LOCAL_HTTP_URL"))
 	resLocal.Hassert("NewClientBusHttp(): in get env LOCAL_HTTP_URL)")
 	urlLocal := resLocal.Ok()
 	txtUrl := urlLocal.TrimSuffix("/")
 	kBusHttp := kbus_http.GetKernelBusHttp()
+	urlRemoteMut:=d0.MutTxt(owner,urlRemote.Get())
 	sf := &ClientBusHttp{
 		owner:     owner,
 		lCtx:      d1.NewLocalCtx(owner, kCtx.SelfCtx()),
 		log:       log,
 		bus:       kBusHttp,
 		isWork:    d0.MutSafeBool(owner, true),
-		urlRemote: d0.LetTxt(urlRemote.TrimSuffix("/")),
-		urlLocal:  d0.LetTxt(txtUrl),
+		urlRemote: d0.LetTxt(owner, urlRemoteMut.TrimSuffix("/")),
+		urlLocal:  d0.LetTxt(owner, txtUrl),
 	}
 	return sf
 }
@@ -65,7 +66,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 
 	req := &dot.UnsubReq{
 		HandlerName_: handler.Name().Get(),
-		Uuid_:        d0.LetTxt(_uuid.String()),
+		Uuid_:        d0.LetTxt(sf.owner, _uuid.String()),
 	}
 	req.SelfCheck()
 	binReq, err := json.MarshalIndent(req, "", "  ")
@@ -84,16 +85,16 @@ func (sf *ClientBusHttp) Unsubscribe(handler bus_spec.IBusHandlerSubscribe) {
 	resp := &dot.UnsubResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := d0.LetErr("Unsubscribe(): in unmarshal response, err=\n\t%v", err)
+		err := d0.LetErr(sf.owner, "Unsubscribe(): in unmarshal response, err=\n\t%v", err)
 		sf.log.Err(err)
 		return
 	}
 	if resp.Status_.Get() != "ok" {
-		err := d0.LetErr("Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := d0.LetErr(sf.owner, "Unsubscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 		sf.log.Err(err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := d0.LetErr("Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
+		err := d0.LetErr(sf.owner, "Unsubscribe(): resp uuid(%v) bad", resp.Uuid_)
 		sf.log.Err(err)
 	}
 }
@@ -106,13 +107,13 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) *d0.Re
 			[]any{err})
 	req := &dot.SubscribeReq{
 		Topic_:   handler.Topic().Get(),
-		Uuid_:    d0.LetTxt(_uuid.String()),
-		WebHook_: d0.LetTxt("%v%v", sf.urlLocal.String()+"/bus/pub"), // Веб-хук всегда на своей стороне
+		Uuid_:    d0.LetTxt(sf.owner, _uuid.String()),
+		WebHook_: d0.LetTxt(sf.owner, "%v%v", sf.urlLocal.String()+"/bus/pub"), // Веб-хук всегда на своей стороне
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	endPoint := d0.LetTxt("%v%v", sf.urlLocal.String()+"/bus/sub")
+	endPoint := d0.LetTxt(sf.owner, "%v%v", sf.urlLocal.String()+"/bus/sub")
 	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	d0.If(err != nil).
 		Hassert("ClientBusHttp.Subscribe(): in new request, err=\n\t%v",
@@ -120,21 +121,21 @@ func (sf *ClientBusHttp) Subscribe(handler bus_spec.IBusHandlerSubscribe) *d0.Re
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := d0.LetErr("ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Subscribe(): in make POST-request, err=\n\t%w", err)
 		return d0.ResErr[d0.Bool](err)
 	}
 	resp := &dot.SubscribeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := d0.LetErr("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
 		return d0.ResErr[d0.Bool](err)
 	}
 	if resp.Status_.Get() != "ok" {
-		err := d0.LetErr("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
 		return d0.ResErr[d0.Bool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := d0.LetErr("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
 		return d0.ResErr[d0.Bool](err)
 	}
 	res := sf.bus.Subscribe(handler)
@@ -149,13 +150,13 @@ func (sf *ClientBusHttp) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Res
 			err)
 	req := &dot.ServeReq{
 		Topic_:  topic.Get(),
-		Uuid_:   d0.LetTxt(_uuid.String()),
+		Uuid_:   d0.LetTxt(sf.owner, _uuid.String()),
 		BinReq_: binReq,
 	}
 	req.SelfCheck()
 	_binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(_binReq))
-	endPont := d0.LetTxt("%v%v", sf.urlRemote.String(), "/bus/request")
+	endPont := d0.LetTxt(sf.owner, "%v%v", sf.urlRemote.String(), "/bus/request")
 	hReq, err := http.NewRequest(http.MethodPost, endPont.String(), body)
 	d0.If(err != nil).
 		Hassert("ClientBusHttp.SendRequest(): in new request, err=\n\t%v",
@@ -163,21 +164,21 @@ func (sf *ClientBusHttp) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Res
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := d0.LetErr("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
 		return d0.WrapErr(resBody, err)
 	}
 	resp := &dot.ServeResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := d0.LetErr("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
 		return d0.ResErr[[]byte](err)
 	}
 	if resp.Status_.Get() != "ok" {
-		err := d0.LetErr("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
 		return d0.ResErr[[]byte](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := d0.LetErr("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
 		return d0.ResErr[[]byte](err)
 	}
 	return d0.ResOk(resp.BinResp_)
@@ -186,12 +187,12 @@ func (sf *ClientBusHttp) SendRequest(topic *topic.LTopic, binReq []byte) *d0.Res
 // RegisterServe -- регистрирует в локальной шине обработчик.
 func (sf *ClientBusHttp) RegisterServe(handler bus_spec.IBusHandlerServe) *d0.Result[d0.Bool] {
 	if handler == nil {
-		err := d0.LetErr("ClientBusHttp.RegisterServe(): handler==nil")
+		err := d0.LetErr(sf.owner, "ClientBusHttp.RegisterServe(): handler==nil")
 		return d0.ResErr[d0.Bool](err)
 	}
 	res := sf.bus.RegisterServe(handler)
 	if res.IsErr() {
-		err := d0.LetErr("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
+		err := d0.LetErr(sf.owner, "ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
 		return d0.ResErr[d0.Bool](err)
 	}
 	return d0.ResOk(d0.Bool(true))
@@ -205,33 +206,33 @@ func (sf *ClientBusHttp) Publish(topic *topic.LTopic, binMsg []byte) *d0.Result[
 			err)
 	req := &dot.PublishReq{
 		Topic_:  topic.Get(),
-		Uuid_:   d0.LetTxt(_uuid.String()),
+		Uuid_:   d0.LetTxt(sf.owner, _uuid.String()),
 		BinMsg_: binMsg,
 	}
 	req.SelfCheck()
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
-	endPoint := d0.LetTxt("%v%v", sf.urlRemote.Get(), "/bus/pub")
+	endPoint := d0.LetTxt(sf.owner, "%v%v", sf.urlRemote.Get(), "/bus/pub")
 	hReq, err := http.NewRequest(http.MethodPost, endPoint.String(), body)
 	d0.If(err != nil).Hassert("ClientBusHttp.Publish(): in new request, err=\n\t%v")
 
 	resBody := sf.makePost(hReq)
 	if resBody.IsErr() {
-		err := d0.LetErr("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
 		return d0.ResErr[d0.Bool](err)
 	}
 	resp := &dot.PublishResp{}
 	err = json.Unmarshal(resBody.Ok(), resp)
 	if err != nil {
-		err := d0.LetErr("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
 		return d0.ResErr[d0.Bool](err)
 	}
 	if resp.Status_.Get() != "ok" {
-		err := d0.LetErr("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
 		return d0.ResErr[d0.Bool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
-		err := d0.LetErr("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
 		return d0.ResErr[d0.Bool](err)
 	}
 	return d0.ResOk(d0.Bool(true))
@@ -242,21 +243,21 @@ func (sf *ClientBusHttp) makePost(hReq *http.Request) *d0.Result[[]byte] {
 	hReq.Header.Add("Content-Type", "application/json")
 	_resp, err := http.DefaultClient.Do(hReq)
 	if err != nil {
-		err := d0.LetErr("ClientBusHttp.makePost(): after request, err=\n\t%w", err)
+		err := d0.LetErr(sf.owner, "ClientBusHttp.makePost(): after request, err=\n\t%w", err)
 		return d0.ResErr[[]byte](err)
 	}
 	defer func() {
 		_ = _resp.Body.Close()
 	}()
 	if _resp.StatusCode != http.StatusOK {
-		err := d0.LetErr("ClientBusHttp.makePost(): url=%q, status=%q",
+		err := d0.LetErr(sf.owner, "ClientBusHttp.makePost(): url=%q, status=%q",
 			hReq.URL, _resp.Status)
 		return d0.ResErr[[]byte](err)
 	}
 
 	binBody, err := io.ReadAll(_resp.Body)
 	if err != nil {
-		err := d0.LetErr("ClientBusHttp.makePost(): after read body, err=\n\t%v",
+		err := d0.LetErr(sf.owner, "ClientBusHttp.makePost(): after read body, err=\n\t%v",
 			err)
 		return d0.ResErr[[]byte](err)
 	}

+ 32 - 37
v4/d2/lti/kbus_http/client_bus_http/client_bus_http_test.go

@@ -18,20 +18,18 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/d2/lti/kbus_http"
 )
 
-var (
-	baseUrl   = d0.LetTxt("http://127.0.0.1:18350/")
-	pathStore = d0.LetTxt("/store/store_client_bus_http")
-)
-
 type tester struct {
-	t        *testing.T
-	me       d1.IMockEnv
-	kCtx     *kern_ctx.KernCtx
-	cl       *ClientBusHttp
-	handSub  *mock_hand_sub_http.MockHandSubHttp
-	handServ *mock_hand_serve.MockHandlerServe
-	kBus     *kbus_base.KBusBase
-	owner    *d0.LOwner
+	t         *testing.T
+	me        d1.IMockEnv
+	kCtx      *kern_ctx.KernCtx
+	cl        *ClientBusHttp
+	handSub   *mock_hand_sub_http.MockHandSubHttp
+	handServ  *mock_hand_serve.MockHandlerServe
+	kBus      *kbus_base.KBusBase
+	owner     *d0.LOwner
+	baseUrl   *d0.LTxt
+	pathStore *d0.LTxt
+	strTraTaTa *d0.LTxt
 }
 
 var (
@@ -41,24 +39,25 @@ var (
 )
 
 func TestClientBusHttp(t *testing.T) {
-	handSub := mock_hand_sub_http.NewMockHandSubHttp(qNameSub, baseUrl).(*mock_hand_sub_http.MockHandSubHttp)
-	handServ := mock_hand_serve.NewMockHandlerServe(qNameServ, "local_hook")
 	owner := d0.LetOwner(1, "test_client_bus_http")
 	sf := &tester{
-		t:        t,
-		owner:    owner,
-		me:       d1.MakeEnv(owner),
-		kCtx:     kern_ctx.GetKernCtx(),
-		handSub:  handSub,
-		handServ: handServ,
-		kBus:     kbus_base.GetKernelBusBase(),
+		t:         t,
+		owner:     owner,
+		baseUrl:   d0.LetTxt(owner, "http://127.0.0.1:18350/"),
+		pathStore: d0.LetTxt(owner, "/store/store_client_bus_http"),
+		me:        d1.MakeEnv(owner),
+		kCtx:      kern_ctx.GetKernCtx(),
+		kBus:      kbus_base.GetKernelBusBase(),
 	}
+	sf.handSub = mock_hand_sub_http.NewMockHandSubHttp(sf.owner, qNameSub, sf.baseUrl).(*mock_hand_sub_http.MockHandSubHttp)
+	sf.handServ = mock_hand_serve.NewMockHandlerServe(qNameServ, "local_hook")
+	sf.strTraTaTa = d0.LetTxt(sf.owner, "tra-ta-ta")
 	_ = os.Unsetenv("LOCAL_STORE_PATH")
-	_ = os.Setenv("LOCAL_STORE_PATH", pathStore.String())
+	_ = os.Setenv("LOCAL_STORE_PATH", sf.pathStore.String())
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
-	_ = os.Setenv("LOCAL_HTTP_URL", baseUrl.String())
+	_ = os.Setenv("LOCAL_HTTP_URL", sf.baseUrl.String())
 	fnClear := func() {
-		pwd := sf.me.Pwd().String() + pathStore.String()
+		pwd := sf.me.Pwd().String() + sf.pathStore.String()
 		_ = os.RemoveAll(pwd)
 	}
 	fnClear()
@@ -97,15 +96,11 @@ func (sf *tester) sendGood1() {
 	}
 }
 
-var (
-	strTraTaTa = d0.LetTxt("tra-ta-ta")
-)
-
 // Левый адрес.
 func (sf *tester) sendBad2() {
 	sf.t.Log("sendBad2")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = strTraTaTa
+	sf.cl.urlRemote = sf.strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -223,7 +218,7 @@ var (
 func (sf *tester) pubBad1() {
 	sf.t.Log("pubBad1")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = strTraTaTa
+	sf.cl.urlRemote = sf.strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -305,7 +300,7 @@ func (sf *tester) subBad4() {
 func (sf *tester) subBad2() {
 	sf.t.Log("subBad2")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = strTraTaTa
+	sf.cl.urlRemote = sf.strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -343,7 +338,7 @@ func (sf *tester) unsub() {
 func (sf *tester) unsubBad3() {
 	sf.t.Log("unsubBad3")
 	urlRemote := sf.cl.urlRemote
-	sf.cl.urlRemote = strTraTaTa
+	sf.cl.urlRemote = sf.strTraTaTa
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
@@ -392,8 +387,8 @@ func (sf *tester) newGood1() {
 			sf.t.Fatalf("newGood1(): panic=%v", _panic)
 		}
 	}()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_client_bus_http", "comment")
-	sf.cl = NewClientBusHttp(sf.owner, baseUrl).(*ClientBusHttp)
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "monolitName"), "test_client_bus_http", "comment")
+	sf.cl = NewClientBusHttp(sf.owner, sf.baseUrl).(*ClientBusHttp)
 	kServHttp := kserv_http.GetKernelServHttp()
 	kServHttp.Run()
 
@@ -408,11 +403,11 @@ func (sf *tester) newGood1() {
 // Пустой URL.
 func (sf *tester) newBad2() {
 	sf.t.Log("newBad2")
-	_ = NewClientBusHttp(sf.owner, d0.LetTxt(""))
+	_ = NewClientBusHttp(sf.owner, d0.LetTxt(sf.owner,""))
 }
 
 // Нет ничего для HTTP-шины.
 func (sf *tester) newBad1() {
 	sf.t.Log("newBad1")
-	_ = NewClientBusHttp(sf.owner, d0.LetTxt("url"))
+	_ = NewClientBusHttp(sf.owner, d0.LetTxt(sf.owner, "url"))
 }

+ 22 - 21
v4/d2/lti/kbus_http/kbus_http.go

@@ -37,8 +37,9 @@ func GetKernelBusHttp() bus_spec.IKernelBus {
 	}
 	owner := d0.LetOwner(1, "kern_bus_http")
 	paramLogBuf := &d1.LogBufParam{
+		Owner_:  owner,
 		IsTerm_: d0.MutSafeBool(owner, true),
-		Prefix_: d0.LetTxt("kBusHttp"),
+		Prefix_: d0.LetTxt(owner, "kBusHttp"),
 	}
 	log := d1.NewLogBuf(paramLogBuf)
 	log.Debug("GetKernelBusHttp(): new")
@@ -54,7 +55,7 @@ func GetKernelBusHttp() bus_spec.IKernelBus {
 	fibApp.Post("/bus/unsub", sf.postUnsub)         // Топик отписки, IN
 	fibApp.Post("/bus/request", sf.postSendRequest) // Топик входящих запросов, IN
 	fibApp.Post("/bus/pub", sf.postPublish)         // Топик публикаций подписки, IN
-	kCtx.Set(d0.LetTxt("kernBus"), sf, "GetKernelBusHttp(): http data bus")
+	kCtx.Set(d0.LetTxt(owner, "kernBus"), sf, "GetKernelBusHttp(): http data bus")
 	Bus_ = sf
 	return Bus_
 }
@@ -70,12 +71,12 @@ func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.SubscribeResp{
-			Status_: d0.LetTxt("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
+			Status_: d0.LetTxt(sf.Owner(), "kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		err := d0.LetErr("kBusHttp.postSub(): in body parser, status=%q", resp.Status_)
+		err := d0.LetErr(sf.Owner(), "kBusHttp.postSub(): in body parser, status=%q", resp.Status_)
 		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
@@ -88,15 +89,15 @@ func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 func (sf *kBusHttp) processSubscribe(req *dot.SubscribeReq) *dot.SubscribeResp {
 	req.SelfCheck()
 	topic := topic.LetTopic(req.Topic_)
-	handler := mock_hand_sub_http.NewMockHandSubHttp(topic, req.WebHook_)
+	handler := mock_hand_sub_http.NewMockHandSubHttp(sf.Owner(), topic, req.WebHook_)
 	resp := &dot.SubscribeResp{
-		Status_: d0.LetTxt("ok"),
+		Status_: d0.LetTxt(sf.Owner(), "ok"),
 		Uuid_:   req.Uuid_,
 		Name_:   handler.Name().Get(),
 	}
 	res := sf.Subscribe(handler)
 	if res.IsErr() {
-		resp.Status_ = d0.LetTxt(
+		resp.Status_ = d0.LetTxt(sf.Owner(),
 			"kernelBusHttp.processSubscribe(): err=\n\t%v",
 			res.Err())
 		return resp
@@ -112,12 +113,12 @@ func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.PublishResp{
-			Status_: d0.LetTxt("kernelBusHttp.postPublish(): in parse request, err=\n\t%v\n", err),
+			Status_: d0.LetTxt(sf.Owner(), "kernelBusHttp.postPublish(): in parse request, err=\n\t%v\n", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		err := d0.LetErr("postPublish(): in body parser, status=%v", resp.Status_)
+		err := d0.LetErr(sf.Owner(), "postPublish(): in body parser, status=%v", resp.Status_)
 		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
@@ -134,12 +135,12 @@ func (sf *kBusHttp) postUnsub(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.ServeResp{
-			Status_: d0.LetTxt("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
+			Status_: d0.LetTxt(sf.Owner(), "kernelBusHttp.postSendRequest(): err=\n\t%v", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		err := d0.LetErr("kBusHttp.postUnsub(): in body parser, status=%q", resp.Status_)
+		err := d0.LetErr(sf.Owner(), "kBusHttp.postUnsub(): in body parser, status=%q", resp.Status_)
 		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
@@ -161,11 +162,11 @@ func (sf *kBusHttp) processPublish(req *dot.PublishReq) *dot.PublishResp {
 	topic := topic.LetTopic(req.Topic_)
 	res := sf.Publish(topic, req.BinMsg_)
 	resp := &dot.PublishResp{
-		Status_: d0.LetTxt("ok"),
+		Status_: d0.LetTxt(sf.Owner(), "ok"),
 		Uuid_:   req.Uuid_,
 	}
 	if res.IsErr() {
-		resp.Status_ = d0.LetTxt("kernelBusHttp.processPublish(): err=\n\t%v", res.Err())
+		resp.Status_ = d0.LetTxt(sf.Owner(), "kernelBusHttp.processPublish(): err=\n\t%v", res.Err())
 		return resp
 	}
 	return resp
@@ -181,12 +182,12 @@ func (sf *kBusHttp) postSendRequest(ctx fiber.Ctx) error {
 	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &dot.ServeResp{
-			Status_: d0.LetTxt("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
+			Status_: d0.LetTxt(sf.Owner(), "kernelBusHttp.postSendRequest(): err=\n\t%v", err),
 			Uuid_:   req.Uuid_,
 		}
 		resp.SelfCheck()
 		ctx.Response().SetStatusCode(http.StatusBadRequest)
-		err := d0.LetErr("kBusHttp.postSendRequest(): in body parser, status=%v", resp.Status_)
+		err := d0.LetErr(sf.Owner(), "kBusHttp.postSendRequest(): in body parser, status=%v", resp.Status_)
 		sf.log.Err(err)
 		return ctx.JSON(resp)
 	}
@@ -201,11 +202,11 @@ func (sf *kBusHttp) processSendRequest(req *dot.ServeReq) *dot.ServeResp {
 	topic := topic.LetTopic(req.Topic_)
 	res := sf.SendRequest(topic, req.BinReq_)
 	resp := &dot.ServeResp{
-		Status_: d0.LetTxt("ok"),
+		Status_: d0.LetTxt(sf.Owner(), "ok"),
 		Uuid_:   req.Uuid_,
 	}
 	if res.IsErr() {
-		resp.Status_ = d0.LetTxt("kernelBusHttp.processSendRequest(): err=\n\t%v", res.Err())
+		resp.Status_ = d0.LetTxt(sf.Owner(), "kernelBusHttp.processSendRequest(): err=\n\t%v", res.Err())
 		return resp
 	}
 	resp.BinResp_ = res.Ok()
@@ -216,17 +217,17 @@ func (sf *kBusHttp) processSendRequest(req *dot.ServeReq) *dot.ServeResp {
 func (sf *kBusHttp) processUnsubRequest(req *dot.UnsubReq) *dot.UnsubResp {
 	req.SelfCheck()
 	resp := &dot.UnsubResp{
-		Status_: d0.LetTxt("ok"),
+		Status_: d0.LetTxt(sf.Owner(), "ok"),
 		Uuid_:   req.Uuid_,
 	}
-	optHandler := sf.KCtx_.Get(d0.LetTxt(req.HandlerName_))
+	optHandler := sf.KCtx_.Get(d0.LetTxt(sf.Owner(), req.HandlerName_))
 	if optHandler.IsNone() {
-		resp.Status_ = d0.LetTxt("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
+		resp.Status_ = d0.LetTxt(sf.Owner(), "kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
 			req.HandlerName_)
 		return resp
 	}
 	if optHandler == nil {
-		resp.Status_ = d0.LetTxt("kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.HandlerName_)
+		resp.Status_ = d0.LetTxt(sf.Owner(), "kernelBusHttp.processUnsubRequest(): handler(%v) not exists", req.HandlerName_)
 		return resp
 	}
 	hand := optHandler.Some().Val().(bus_spec.IBusHandlerSubscribe)

+ 18 - 18
v4/d2/lti/kbus_http/kbus_http_test.go

@@ -40,12 +40,12 @@ func TestKernelBusHttp(t *testing.T) {
 	sf := &tester{
 		owner: owner,
 		t:     t,
-		handSub: mock_hand_sub_local.NewMockHandlerSub(qNameSub,
-			d0.LetTxt("http://localhost:18200/bus/pub")),
+		handSub: mock_hand_sub_local.NewMockHandlerSub(owner, qNameSub,
+			d0.LetTxt(owner, "http://localhost:18200/bus/pub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qNameServ, "name_serv"),
 	}
 	ctx := kern_ctx.GetKernCtx()
-	ctx.Set(d0.LetTxt("monolitName"), "test_monolit", "comment")
+	ctx.Set(d0.LetTxt(owner, "monolitName"), "test_monolit", "comment")
 	sf.get()
 	sf.req()
 	sf.sub()
@@ -71,7 +71,7 @@ func (sf *tester) unsubGood2() {
 	}
 	req := &dot.UnsubReq{
 		HandlerName_: sf.handSub.Name().Get(),
-		Uuid_:        d0.LetTxt(test_uuid),
+		Uuid_:        d0.LetTxt(sf.owner, test_uuid),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
@@ -142,7 +142,7 @@ func (sf *tester) unsubGood1() {
 	}
 	req := &dot.UnsubReq{
 		HandlerName_: sf.handSub.Name().Get(),
-		Uuid_:        d0.LetTxt(test_uuid),
+		Uuid_:        d0.LetTxt(sf.owner, test_uuid),
 	}
 	resp := Bus_.processUnsubRequest(req)
 	if resp.Status_.Get() != "ok" {
@@ -161,7 +161,7 @@ func (sf *tester) unsubBad2() {
 	}
 	req := &dot.UnsubReq{
 		HandlerName_: sf.handSub.Name().Get(),
-		Uuid_:        d0.LetTxt(test_uuid),
+		Uuid_:        d0.LetTxt(sf.owner, test_uuid),
 	}
 	resp := Bus_.processUnsubRequest(req)
 	if resp.Status_.Get() == "ok" {
@@ -195,7 +195,7 @@ func (sf *tester) pubGood2() {
 	sf.t.Log("pubGood2")
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinMsg_: []byte("http_pub"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
@@ -261,7 +261,7 @@ func (sf *tester) pubBad2() {
 
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinMsg_: []byte("test_pub"),
 	}
 	resp := Bus_.processPublish(req)
@@ -279,7 +279,7 @@ func (sf *tester) pubGood1() {
 	}
 	req := &dot.PublishReq{
 		Topic_:  qNameSub.Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinMsg_: []byte("test_pub"),
 	}
 	_ = Bus_.processPublish(req)
@@ -323,8 +323,8 @@ func (sf *tester) subGood2() {
 	sf.t.Log("subGood2")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    d0.LetTxt(test_uuid),
-		WebHook_: d0.LetTxt("http://localhost:18200/bus/pub/"),
+		Uuid_:    d0.LetTxt(sf.owner, test_uuid),
+		WebHook_: d0.LetTxt(sf.owner, "http://localhost:18200/bus/pub/"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
 	body := strings.NewReader(string(binReq))
@@ -361,8 +361,8 @@ func (sf *tester) subBad3() {
 	sf.t.Log("subBad3")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    d0.LetTxt(test_uuid),
-		WebHook_: d0.LetTxt("http://localhost:18200/bus/pub/"),
+		Uuid_:    d0.LetTxt(sf.owner, test_uuid),
+		WebHook_: d0.LetTxt(sf.owner, "http://localhost:18200/bus/pub/"),
 	}
 	defer func() {
 		if _panic := recover(); _panic != nil {
@@ -383,8 +383,8 @@ func (sf *tester) subGood1() {
 	sf.t.Log("subGood1")
 	req := &dot.SubscribeReq{
 		Topic_:   qNameServ.Get(),
-		Uuid_:    d0.LetTxt(test_uuid),
-		WebHook_: d0.LetTxt("http://localhost:18200/bus/"),
+		Uuid_:    d0.LetTxt(sf.owner, test_uuid),
+		WebHook_: d0.LetTxt(sf.owner, "http://localhost:18200/bus/"),
 	}
 	defer func() {
 		if _panic := recover(); _panic != nil {
@@ -454,7 +454,7 @@ func (sf *tester) reqBad4() {
 	defer sf.handServ.IsBad_.Reset()
 	req := &dot.ServeReq{
 		Topic_:  sf.handServ.Topic().Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinReq_: []byte("test_msg"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
@@ -491,7 +491,7 @@ func (sf *tester) reqGood1() {
 	sf.t.Log("reqGood1")
 	req := &dot.ServeReq{
 		Topic_:  sf.handServ.Topic().Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinReq_: []byte("test_msg"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")
@@ -533,7 +533,7 @@ func (sf *tester) reqBad3() {
 	sf.t.Log("reqBad3")
 	req := &dot.ServeReq{
 		Topic_:  qNameBad.Get(),
-		Uuid_:   d0.LetTxt(test_uuid),
+		Uuid_:   d0.LetTxt(sf.owner, test_uuid),
 		BinReq_: []byte("test_msg"),
 	}
 	binReq, _ := json.MarshalIndent(req, "", "  ")

+ 4 - 1
v4/d2/lti/kbus_local/kbus_local_test.go

@@ -12,17 +12,20 @@ import (
 
 type tester struct {
 	t        *testing.T
+	owner    *d0.LOwner
 	lBus     bus_spec.IKernelBus
 	handSub  *mock_hand_sub_local.MockHandlerSub
 	handServ *mock_hand_serve.MockHandlerServe
 }
 
 func TestKernelBusLocal(t *testing.T) {
+	owner := d0.LetOwner(1, "test_owner")
 	qTopicSub := topic.LetTopic("topic_hand_sub")
 	qTopicServ := topic.LetTopic("topic_hand_serv")
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicSub, d0.LetTxt("mock_hand_sub")),
+		owner:    owner,
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(owner,qTopicSub, d0.LetTxt(owner, "mock_hand_sub")),
 		handServ: mock_hand_serve.NewMockHandlerServe(qTopicServ, "mock_hand_serv"),
 	}
 	sf.new()

+ 4 - 2
v4/d2/wui/hx_url/hx_url.go

@@ -10,14 +10,16 @@ import (
 
 // HxUrl -- атрибут HTMX (URL запроса).
 type HxUrl struct {
+	owner  *d0.LOwner
 	method mWt.IHxUrlMethod
 	patch  mWt.IHxUrlPatch
 }
 
 // NewHxUrl -- возвращает новый URL запроса.
-func NewHxUrl(patch *d0.LTxt) *HxUrl {
+func NewHxUrl(owner *d0.LOwner, patch *d0.LTxt) *HxUrl {
 	sf := &HxUrl{
-		method: hx_url_method.NewHxUrlMethod(),
+		owner:  owner,
+		method: hx_url_method.NewHxUrlMethod(owner),
 		patch:  hx_url_patch.NewHxUrlPatch(patch),
 	}
 	_ = mWt.IHxUrl(sf)

+ 2 - 1
v4/d2/wui/hx_url/hx_url_test.go

@@ -7,7 +7,8 @@ import (
 )
 
 func TestHxUrl(t *testing.T) {
-	swap := NewHxUrl(d0.LetTxt("/wui/click/abc"))
+	owner := d0.LetOwner(1, "test_owner")
+	swap := NewHxUrl(owner, d0.LetTxt(owner, "/wui/click/abc"))
 	if swap == nil {
 		t.Fatalf("swap==nil")
 	}

+ 4 - 2
v4/d2/wui/hx_url_method/hx_url_method.go

@@ -9,14 +9,16 @@ import (
 // HxSwap -- атрибут HTMX (метод запроса, внеполосная замена).
 type HxSwap struct {
 	*d0.MSafeMutex
+	owner *d0.LOwner
 	method *d0.LTxt
 }
 
 // NewHxUrlMethod -- возвращает новый метод запроса.
-func NewHxUrlMethod() *HxSwap {
+func NewHxUrlMethod(owner *d0.LOwner) *HxSwap {
 	sf := &HxSwap{
+		owner:owner,
 		MSafeMutex: d0.MutSafeMutex(),
-		method:     d0.LetTxt("hx-post"),
+		method:     d0.LetTxt(owner, "hx-post"),
 	}
 	_ = mWt.IHxUrlMethod(sf)
 	return sf

+ 3 - 2
v4/d2/wui/hx_url_method/hx_url_method_test.go

@@ -7,14 +7,15 @@ import (
 )
 
 func TestHxUrlMethod(t *testing.T) {
-	swap := NewHxUrlMethod()
+	owner:=d0.LetOwner(1,"test_owner")
+	swap := NewHxUrlMethod(owner)
 	if swap == nil {
 		t.Fatalf("swap==nil")
 	}
 	if method := swap.Method(); method.Get() != "hx-post" {
 		t.Fatalf("tag not empty")
 	}
-	swap.Set(d0.LetTxt("hx-get"))
+	swap.Set(d0.LetTxt(owner, "hx-get"))
 	if method := swap.Method(); method.Get() != "hx-get" {
 		t.Fatalf("tag bad")
 	}

+ 3 - 2
v4/d2/wui/hx_url_patch/hx_url_patch_test.go

@@ -7,14 +7,15 @@ import (
 )
 
 func TestHxUrlPatch(t *testing.T) {
-	swap := NewHxUrlPatch(d0.LetTxt("/wui/form/123"))
+	owner:=d0.LetOwner(1,"test_owner")
+	swap := NewHxUrlPatch(d0.LetTxt(owner, "/wui/form/123"))
 	if swap == nil {
 		t.Fatalf("swap==nil")
 	}
 	if patch := swap.Patch(); patch.Get() != "/wui/form/123" {
 		t.Fatalf("patch bad")
 	}
-	swap.Set(d0.LetTxt("/wui/click/abc"))
+	swap.Set(d0.LetTxt(owner, "/wui/click/abc"))
 	if patch := swap.Patch(); patch.Get() != "/wui/click/abc" {
 		t.Fatalf("patch bad")
 	}

+ 2 - 2
v4/d2/wui/wui.go

@@ -9,8 +9,8 @@ import (
 )
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text *d0.LTxt, fnClick func(map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt]) mWt.IWuiButton {
-	wBtn := wui_button.NewWuiButton(text, fnClick)
+func NewWuiButton(owner *d0.LOwner, text *d0.LTxt, fnClick func(map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt]) mWt.IWuiButton {
+	wBtn := wui_button.NewWuiButton(owner, text, fnClick)
 	return wBtn
 }
 

+ 7 - 5
v4/d2/wui/wui_button/wui_button.go

@@ -18,20 +18,22 @@ type FnBtnBack func(map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt]
 // WuiButton -- WUI-кнопка.
 type WuiButton struct {
 	mWt.IWuiWidget
+	owner  *d0.LOwner
 	text   mWt.IWuiText
 	fnBack FnBtnBack
 	hx     mWt.IWuiHx
 }
 
 // NewWuiButton -- возвращает новую WUI-кнопку.
-func NewWuiButton(text *d0.LTxt, fnBack FnBtnBack) *WuiButton {
+func NewWuiButton(owner *d0.LOwner, text *d0.LTxt, fnBack FnBtnBack) *WuiButton {
 	d0.If(fnBack == nil).Hassert("NewWuiButton(): text=%q, fnBack==nil", []any{text})
 	sf := &WuiButton{
-		IWuiWidget: wui_widget.NewWuiWidget(),
-		text:       wui_text.NewWuiText(text),
+		IWuiWidget: wui_widget.NewWuiWidget(owner),
+		owner:      owner,
+		text:       wui_text.NewWuiText(owner, text),
 		fnBack:     fnBack,
 	}
-	sf.hx = wui_hx.NewWuiHx(d0.LetTxt("/wui/click/" + sf.Id().Get()))
+	sf.hx = wui_hx.NewWuiHx(owner, d0.LetTxt(sf.owner, "/wui/click/"+sf.Id().Get()))
 	wCtx := wui_ctx.GetWuiCtx()
 	wCtx.Set(sf.Id(), sf, "WUI-кнопка")
 	_ = mWt.IWuiButton(sf)
@@ -62,5 +64,5 @@ func (sf *WuiButton) Html() *d0.LTxt {
 	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
 	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.String())
 	strRes = strings.ReplaceAll(strRes, "{.hx}", sf.hx.String())
-	return d0.LetTxt(strRes)
+	return d0.LetTxt(sf.owner, strRes)
 }

+ 4 - 2
v4/d2/wui/wui_button/wui_button_test.go

@@ -8,12 +8,14 @@ import (
 
 type tester struct {
 	t      *testing.T
+	owner *d0.LOwner
 	chCall chan d0.Txt
 }
 
 func TestWuiButton(t *testing.T) {
 	sf := &tester{
 		t:      t,
+		owner:d0.LetOwner(1,"test_owner"),
 		chCall: make(chan d0.Txt, 2),
 	}
 	sf.new()
@@ -22,7 +24,7 @@ func TestWuiButton(t *testing.T) {
 // Создание кнопки.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	btn := NewWuiButton(d0.LetTxt("test_val"), sf.fnBack)
+	btn := NewWuiButton(sf.owner, d0.LetTxt(sf.owner, "test_val"), sf.fnBack)
 	if btn == nil {
 		sf.t.Fatalf("new(): WuiButton==nil")
 	}
@@ -44,5 +46,5 @@ func (sf *tester) new() {
 // Функция обратного вызова.
 func (sf *tester) fnBack(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] {
 	sf.chCall <- "test"
-	return d0.ResOk(d0.LetTxt("test_click"))
+	return d0.ResOk(d0.LetTxt(sf.owner, "test_click"))
 }

+ 4 - 2
v4/d2/wui/wui_hx/wui_hx.go

@@ -14,6 +14,7 @@ import (
 
 // WuiHx -- HTMX-атрибуты WUI-объекта.
 type WuiHx struct {
+	owner *d0.LOwner
 	url     *hx_url.HxUrl
 	trigger *hx_trigger.HxTrigger
 	target  *hx_target.HxSwap
@@ -23,9 +24,10 @@ type WuiHx struct {
 }
 
 // NewWuiHx -- возвращает новые атрибуты HTMX для WUI-объекта.
-func NewWuiHx(path *d0.LTxt) *WuiHx {
+func NewWuiHx(owner *d0.LOwner, path *d0.LTxt) *WuiHx {
 	sf := &WuiHx{
-		url:     hx_url.NewHxUrl(path),
+		owner:owner,
+		url:     hx_url.NewHxUrl(owner, path),
 		trigger: hx_trigger.NewHxTrigger(),
 		target:  hx_target.NewHxTarget(),
 		swap:    hx_swap.NewHxSwap(),

+ 4 - 2
v4/d2/wui/wui_hx/wui_hx_test.go

@@ -9,11 +9,13 @@ import (
 type tester struct {
 	t  *testing.T
 	hx *WuiHx
+	owner *d0.LOwner
 }
 
 func TestWhx(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner:d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 	sf.str()
@@ -22,7 +24,7 @@ func TestWhx(t *testing.T) {
 // Получает строку атрибутов.
 func (sf *tester) str() {
 	sf.t.Log("str")
-	sf.hx.Url().Method().Set(d0.LetTxt("hx-put"))
+	sf.hx.Url().Method().Set(d0.LetTxt(sf.owner, "hx-put"))
 	sf.hx.Trigger().Trigger().Set("load")
 	sf.hx.Target().Set("#main")
 	sf.hx.Swap().Swap().Set("before")
@@ -43,7 +45,7 @@ func (sf *tester) str() {
 // Создаёт новые тэги HTMX.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	hx := NewWuiHx(d0.LetTxt("/wui/click/123"))
+	hx := NewWuiHx(sf.owner, d0.LetTxt(sf.owner, "/wui/click/123"))
 	if hx == nil {
 		sf.t.Fatalf("new(): IWuiHx==nil")
 	}

+ 7 - 5
v4/d2/wui/wui_label/wui_label.go

@@ -14,14 +14,16 @@ import (
 // WuiLabel -- WUI метка.
 type WuiLabel struct {
 	mWt.IWuiWidget
-	text mWt.IWuiText
+	owner *d0.LOwner
+	text  mWt.IWuiText
 }
 
 // NewWuiLabel -- возвращает новую метку.
-func NewWuiLabel(text *d0.LTxt) *d0.Result[*WuiLabel] {
+func NewWuiLabel(owner *d0.LOwner, text *d0.LTxt) *d0.Result[*WuiLabel] {
 	sf := &WuiLabel{
-		IWuiWidget: wui_widget.NewWuiWidget(),
-		text:       wui_text.NewWuiText(text),
+		IWuiWidget: wui_widget.NewWuiWidget(owner),
+		owner:      owner,
+		text:       wui_text.NewWuiText(owner, text),
 	}
 	wCtx := wui_ctx.GetWuiCtx()
 	wCtx.Set(sf.Id(), sf, "WUI-метка")
@@ -42,5 +44,5 @@ const (
 func (sf *WuiLabel) Html() *d0.LTxt {
 	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
 	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.text.String())
-	return d0.LetTxt(strRes)
+	return d0.LetTxt(sf.owner, strRes)
 }

+ 3 - 1
v4/d2/wui/wui_label/wui_label_test.go

@@ -8,11 +8,13 @@ import (
 
 type tester struct {
 	t *testing.T
+	owner *d0.LOwner
 }
 
 func TestWuiLabel(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner:d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 }
@@ -20,7 +22,7 @@ func TestWuiLabel(t *testing.T) {
 // Создаёт новую метку.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	lbl := NewWuiLabel(d0.LetTxt("test_lbl")).Hassert("new()")
+	lbl := NewWuiLabel(sf.owner, d0.LetTxt(sf.owner, "test_lbl")).Hassert("new()")
 	if txt := lbl.Text(); txt == nil {
 		sf.t.Fatalf("new(): txt==nil")
 	}

+ 6 - 4
v4/d2/wui/wui_test.go

@@ -7,12 +7,14 @@ import (
 )
 
 type tester struct {
-	t *testing.T
+	t     *testing.T
+	owner *d0.LOwner
 }
 
 func TestWui(t *testing.T) {
 	sf := &tester{
-		t: t,
+		t:     t,
+		owner: d0.LetOwner(1, "test_owner"),
 	}
 	sf.get()
 }
@@ -24,7 +26,7 @@ func (sf *tester) get() {
 	if wCtx == nil {
 		sf.t.Fatalf("get(): IWuiCtx==nil")
 	}
-	wBtn := NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick)
+	wBtn := NewWuiButton(sf.owner, d0.LetTxt(sf.owner, "test_btn"), sf.fnClick)
 	if wBtn == nil {
 		sf.t.Fatalf("get(): IWuiButton==nil")
 	}
@@ -33,5 +35,5 @@ func (sf *tester) get() {
 // Функция обратного вызова.
 func (sf *tester) fnClick(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] {
 	sf.t.Log("fnClick")
-	return d0.ResOk(d0.LetTxt("test_click"))
+	return d0.ResOk(d0.LetTxt(sf.owner, "test_click"))
 }

+ 7 - 5
v4/d2/wui/wui_text/wui_text.go

@@ -13,15 +13,17 @@ import (
 type WuiText struct {
 	mWt.IWuiWidget
 	*d0.MSafeMutex
-	d0.MTxt
+	*d0.MTxt
+	owner *d0.LOwner
 }
 
 // NewWuiText -- возвращает новый текст WUI.
-func NewWuiText(val *d0.LTxt) *WuiText {
+func NewWuiText(owner *d0.LOwner, val *d0.LTxt) *WuiText {
 	sf := &WuiText{
+		owner:owner,
 		MSafeMutex: d0.MutSafeMutex(),
-		IWuiWidget: wui_widget.NewWuiWidget(),
-		MTxt:       *d0.MutTxt(val.Get()),
+		IWuiWidget: wui_widget.NewWuiWidget(owner),
+		MTxt:       d0.MutTxt(owner, val.Get()),
 	}
 	_ = mWt.IWuiText(sf)
 	return sf
@@ -37,7 +39,7 @@ func (sf *WuiText) Html() *d0.LTxt {
 	defer sf.RUnlock()
 	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.Id().String())
 	strRes = strings.ReplaceAll(strRes, "{.txt}", sf.MTxt.String())
-	return d0.LetTxt(strRes)
+	return d0.LetTxt(sf.owner, strRes)
 }
 
 // Set -- устанавливает хранимое значение.

+ 4 - 2
v4/d2/wui/wui_text/wui_text_test.go

@@ -8,12 +8,14 @@ import (
 
 type tester struct {
 	t   *testing.T
+	owner *d0.LOwner
 	txt *WuiText
 }
 
 func TestWuiText(t *testing.T) {
 	sf := &tester{
 		t: t,
+		owner:d0.LetOwner(1,"test_owner"),
 	}
 	sf.new()
 	sf.set()
@@ -31,7 +33,7 @@ func (sf *tester) html() {
 // Устанавливает новый текст.
 func (sf *tester) set() {
 	sf.t.Log("set")
-	sf.txt.Set(d0.LetTxt("test_val2"))
+	sf.txt.Set(d0.LetTxt(sf.owner, "test_val2"))
 	if txt := sf.txt.Get(); txt != "test_val2" {
 		sf.t.Fatalf("set(): text is bad")
 	}
@@ -40,7 +42,7 @@ func (sf *tester) set() {
 // Получение нового WuiText.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.txt = NewWuiText(d0.LetTxt("test_text"))
+	sf.txt = NewWuiText(sf.owner, d0.LetTxt(sf.owner, "test_text"))
 	if txt := sf.txt.Get(); txt != "test_text" {
 		sf.t.Fatalf("new(): text is bad")
 	}

+ 5 - 3
v4/d2/wui/wui_widget/wui_widget.go

@@ -11,13 +11,15 @@ import (
 
 // WuiWidget -- базовый виджет WUI.
 type WuiWidget struct {
+	owner *d0.LOwner
 	val *d0.LTxt
 }
 
 // NewWuiWidget -- возвращает новый базовый виджет WUI.
-func NewWuiWidget() *WuiWidget {
+func NewWuiWidget(owner *d0.LOwner) *WuiWidget {
 	sf := &WuiWidget{
-		val: d0.LetTxt("wui_" + rand.Text()),
+		owner:owner,
+		val: d0.LetTxt(owner, "wui_" + rand.Text()),
 	}
 	_ = mWt.IWuiWidget(sf)
 	return sf
@@ -35,7 +37,7 @@ const (
 // Html -- возвращает HTML представление виджета.
 func (sf *WuiWidget) Html() *d0.LTxt {
 	strRes := strings.ReplaceAll(strBeg, "{.id}", sf.String())
-	return d0.LetTxt(strRes)
+	return d0.LetTxt(sf.owner, strRes)
 }
 
 // String -- возвращает строковое представление виджета.

+ 4 - 1
v4/d2/wui/wui_widget/wui_widget_test.go

@@ -2,10 +2,13 @@ package wui_widget
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/d0"
 )
 
 func TestWuiWidget(t *testing.T) {
-	w := NewWuiWidget()
+	owner := d0.LetOwner(1, "test_owner")
+	w := NewWuiWidget(owner)
 	if id := w.Id(); id.Get() == "" {
 		t.Fatalf("ID is empty")
 	}

+ 2 - 2
v4/d3/mod_ent/mod_ent.go

@@ -16,8 +16,8 @@ type AModNum = mod_num.AModNum
 type LModuleNum = mod_num.LModuleNum
 
 // NewModuleNumFix -- возвращает новый модуль номера.
-func NewModuleNumFix() *LModuleNum {
-	return mod_num.LetModuleNum()
+func NewModuleNumFix(owner *d0.LOwner) *LModuleNum {
+	return mod_num.LetModuleNum(owner)
 }
 
 // ModuleNumFromStr -- возвращает номер модуля из строки

+ 12 - 7
v4/d3/mod_ent/mod_num/mod_num.go

@@ -12,7 +12,8 @@ type AModNum d0.Num
 
 // LModuleNum -- номер модуля.
 type LModuleNum struct {
-	num AModNum // Номер модуля
+	owner *d0.LOwner
+	num   AModNum // Номер модуля
 }
 
 var (
@@ -21,11 +22,12 @@ var (
 )
 
 // LetModuleNum -- возвращает новый модуль номера.
-func LetModuleNum() *LModuleNum {
+func LetModuleNum(owner *d0.LOwner) *LModuleNum {
 	block.Lock()
 	defer block.Unlock()
 	sf := &LModuleNum{
-		num: nextNum,
+		owner: owner,
+		num:   nextNum,
 	}
 	nextNum++
 	return sf
@@ -33,13 +35,16 @@ func LetModuleNum() *LModuleNum {
 
 // FromStr -- возвращает новый номер модуля из строки.
 func FromStr(txtNumMod *d0.LTxt) *d0.Result[*LModuleNum] {
-	resNum := txtNumMod.Atoi()
+	owner := txtNumMod.Owner()
+	txtNumModMut := d0.MutTxt(owner, txtNumMod.Get())
+	resNum := txtNumModMut.Atoi()
 	if resNum.IsErr() {
-		err := d0.LetErr("FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumMod, resNum.Err())
+		err := d0.LetErr(owner, "FromStr(): strNumMod(%q) not nu,ber, err=\n\t%w", txtNumModMut.Get(), resNum.Err())
 		return d0.ResErr[*LModuleNum](err)
 	}
 	sf := &LModuleNum{
-		num: AModNum(resNum.Ok()),
+		owner: owner,
+		num:   AModNum(resNum.Ok()),
 	}
 	return d0.ResOk(sf)
 }
@@ -51,7 +56,7 @@ func (sf *LModuleNum) Num() AModNum {
 
 // Get -- внутренняя строка модуля.
 func (sf *LModuleNum) Get() d0.Txt {
-	return d0.LetTxt("%v", sf.num).Get()
+	return d0.LetTxt(sf.owner, "%v", sf.num).Get()
 }
 
 // String -- строковое представление номера модуля.

+ 3 - 3
v4/d3/mod_kctx/mod_kctx.go

@@ -45,10 +45,10 @@ func GetModuleKernelCtx() *ModuleKernelCtx {
 		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.Ctx().Log()
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
+	_ = page_monolit.GetPageMonolit(owner)
+	_ = page_module.GetPageModule(owner)
 
-	_ = http_api.NewHttpApi()
+	_ = http_api.NewHttpApi(owner)
 	mod = sf
 	return mod
 }

+ 1 - 1
v4/d3/mod_kctx/mod_kctx_test.go

@@ -42,7 +42,7 @@ func TestModKernelCtx(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "test")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "monolitName"), "test_monolit", "test")
 	sf.new()
 	sf.done()
 }

+ 5 - 4
v4/d3/mod_keeper/mod_keeper.go

@@ -39,7 +39,8 @@ func GetModuleKeeper() *ModuleKeeper {
 	}
 	owner := d0.LetOwner(1, "isol_kern_keeper")
 	param := &d1.LogBufParam{
-		Prefix_: d0.LetTxt("ModuleKeeper"),
+		Owner_:owner,
+		Prefix_: d0.LetTxt(owner, "ModuleKeeper"),
 		IsTerm_: d0.MutSafeBool(owner, true),
 	}
 	log := d1.NewLogBuf(param)
@@ -54,10 +55,10 @@ func GetModuleKeeper() *ModuleKeeper {
 		kServHttp:     kServHttp,
 		log:           log,
 	}
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
+	_ = page_monolit.GetPageMonolit(owner)
+	_ = page_module.GetPageModule(owner)
 
-	_ = http_api.NewHttpApi()
+	_ = http_api.NewHttpApi(owner)
 	mod = sf
 	return sf
 }

+ 6 - 5
v4/d3/mod_serv_http/btn_modules/btn_modules.go

@@ -14,16 +14,17 @@ import (
 )
 
 type BtnModules struct {
+	owner *d0.LOwner
 	btn  mWt.IWuiButton
 	kCtx *d2.KernCtx
 }
 
 // NewBtnModules -- возвращает новую кнопку для показа модулей.
-func NewBtnModules() *BtnModules {
+func NewBtnModules(owner *d0.LOwner) *BtnModules {
 	sf := &BtnModules{
 		kCtx: d2.GetKernCtx(),
 	}
-	sf.btn = wui.NewWuiButton(d0.LetTxt("Modules"), sf.clickMonolit)
+	sf.btn = wui.NewWuiButton(owner, d0.LetTxt(owner, "Modules"), sf.clickMonolit)
 	sf.btn.Hx().Target().Set("#modules")
 	return sf
 }
@@ -41,9 +42,9 @@ var strBlockRow string
 
 // Событие клика по кнопке.
 func (sf *BtnModules) clickMonolit(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] {
-	optMonolit := sf.kCtx.Get(d0.LetTxt("monolit"))
+	optMonolit := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit"))
 	if optMonolit.IsNone() {
-		err := d0.LetErr("clickMonolit(): monolit module not found")
+		err := d0.LetErr(sf.owner, "clickMonolit(): monolit module not found")
 		return d0.ResErr[*d0.LTxt](err)
 	}
 	mon := optMonolit.Some().Val().(mod_spec.IKernelMonolit)
@@ -69,6 +70,6 @@ func (sf *BtnModules) clickMonolit(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt]
 		strOut += strRow
 	}
 	strOut = strings.ReplaceAll(strBlockModules, "{.mod_block}", strOut)
-	txtOut := d0.LetTxt(strOut)
+	txtOut := d0.LetTxt(sf.owner, strOut)
 	return d0.ResOk(txtOut)
 }

+ 3 - 3
v4/d3/mod_serv_http/btn_modules/btn_modules_test.go

@@ -11,13 +11,13 @@ import (
 )
 
 func TestBtnModules(t *testing.T) {
-	btn := NewBtnModules()
+	owner:=d0.LetOwner(1,"isol_wui_btn")
+	btn := NewBtnModules(owner)
 	if html := btn.Html(); html.Get() == "" {
 		t.Fatalf("html is empty")
 	}
-	owner := d0.LetOwner(1, "isol_wui_btn")
 	kCtx := kern_ctx.GetKernCtx()
-	kCtx.Set(d0.LetTxt("isLocal"), true, "test")
+	kCtx.Set(d0.LetTxt(owner, "isLocal"), true, "test")
 	kMon := kmonolit.LetModMonolit("test")
 	modName := module_name.LetModuleName("test")
 	mod := kmodule.NewKernelModule(owner, modName)

+ 4 - 3
v4/d3/mod_serv_http/btn_monolit/btn_monolit.go

@@ -11,12 +11,13 @@ import (
 
 type BtnMonolit struct {
 	btn mWt.IWuiButton
+	owner *d0.LOwner
 }
 
 // NewBtnMonolit -- возвращает новую кнопку монолита.
-func NewBtnMonolit() *BtnMonolit {
+func NewBtnMonolit(owner *d0.LOwner) *BtnMonolit {
 	sf := &BtnMonolit{}
-	sf.btn = wui.NewWuiButton(d0.LetTxt("Monolit"), sf.clickMonolit)
+	sf.btn = wui.NewWuiButton(owner, d0.LetTxt(owner, "Monolit"), sf.clickMonolit)
 	sf.btn.Hx().Target().Set("#monolit")
 	return sf
 }
@@ -31,6 +32,6 @@ var strBlockMonolit string
 
 // Событие клика по кнопке.
 func (sf *BtnMonolit) clickMonolit(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] {
-	txtBlockMonolit := d0.LetTxt(strBlockMonolit)
+	txtBlockMonolit := d0.LetTxt(sf.owner, strBlockMonolit)
 	return d0.ResOk(txtBlockMonolit)
 }

+ 3 - 3
v4/d3/mod_serv_http/btn_monolit/btn_monolit_test.go

@@ -11,13 +11,13 @@ import (
 )
 
 func TestBtnModules(t *testing.T) {
-	btn := NewBtnMonolit()
+	owner := d0.LetOwner(1, "test_isol_wui_btn")
+	btn := NewBtnMonolit(owner)
 	if html := btn.Html(); html.Get() == "" {
 		t.Fatalf("html is empty")
 	}
-	owner := d0.LetOwner(1, "test_isol_wui_btn")
 	kCtx := kern_ctx.GetKernCtx()
-	kCtx.Set(d0.LetTxt("isLocal"), true, "test")
+	kCtx.Set(d0.LetTxt(owner, "isLocal"), true, "test")
 	kMon := kmonolit.LetModMonolit("test")
 	modName := module_name.LetModuleName("test")
 	mod := kmodule.NewKernelModule(owner, modName)

+ 3 - 3
v4/d3/mod_serv_http/http_api/http_api.go

@@ -12,12 +12,12 @@ import (
 type HttpApi struct{}
 
 // NewHttpApi -- возвращает новое HttpApi.
-func NewHttpApi() *d0.Result[*HttpApi] {
+func NewHttpApi(owner *d0.LOwner) *d0.Result[*HttpApi] {
 	sf := &HttpApi{}
 	kCtx := kern_ctx.GetKernCtx()
-	optFiber := kCtx.Get(d0.LetTxt("fiberApp"))
+	optFiber := kCtx.Get(d0.LetTxt(owner, "fiberApp"))
 	if optFiber.IsNone() {
-		err := d0.LetErr("NewHttpApi(): not found fiberApp in kernel ctx")
+		err := d0.LetErr(owner, "NewHttpApi(): not found fiberApp in kernel ctx")
 		return d0.ResErr[*HttpApi](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)

+ 2 - 2
v4/d3/mod_serv_http/http_api/http_api_test.go

@@ -66,11 +66,11 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv(sf.owner)
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18312/")
-	sf.kCtx.Set(d0.LetTxt("isLocal"), true, "testing")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "isLocal"), true, "testing")
 	_ = kmonolit.LetModMonolit("test_monolit")
 	sf.serv = kserv_http.GetKernelServHttp()
 
-	sf.api = NewHttpApi().Hassert("new()")
+	sf.api = NewHttpApi(sf.owner).Hassert("new()")
 	if sf.api == nil {
 		sf.t.Fatalf("new(): page==nil")
 	}

+ 4 - 4
v4/d3/mod_serv_http/mod_serv_http.go

@@ -42,17 +42,17 @@ func GetModuleServHttp() *ModuleServHttp {
 		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.Ctx().Log()
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
+	_ = page_monolit.GetPageMonolit(owner)
+	_ = page_module.GetPageModule(owner)
 
-	_ = http_api.NewHttpApi()
+	_ = http_api.NewHttpApi(owner)
 	mod = sf
 	return sf
 }
 
 // Run -- запускает модуль в работу.
 func (sf *ModuleServHttp) Run() {
-	msg := d0.LetTxt("ModuleServHttp.Run(): module=%v, is run", sf.Name()).Get()
+	msg := d0.LetTxt(sf.owner, "ModuleServHttp.Run(): module=%v, is run", sf.Name()).Get()
 	sf.log.Info(msg)
 	go sf.kServHttp.Run()
 }

+ 1 - 1
v4/d3/mod_serv_http/mod_serv_http_test.go

@@ -47,7 +47,7 @@ func TestModServHttp(t *testing.T) {
 	}
 	fnClear()
 	defer fnClear()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "test")
+	sf.kCtx.Set(d0.LetTxt(owner,"monolitName"), "test_monolit", "test")
 	sf.new()
 	sf.done()
 }

+ 13 - 11
v4/d3/mod_serv_http/page_module/page_module.go

@@ -18,28 +18,30 @@ import (
 // PageModule -- страница показа модуля.
 type PageModule struct {
 	kCtx *d2.KernCtx
+	owner *d0.LOwner
 }
 
 var (
 	page        *PageModule
-	txtFiberApp = d0.LetTxt("fiberApp")
 )
 
 // GetPageModule -- возвращает страницу модуля.
-func GetPageModule() *d0.Result[*PageModule] {
+func GetPageModule(owner *d0.LOwner) *d0.Result[*PageModule] {
 	if page != nil {
 		return d0.ResOk(page)
 	}
 	kCtx := d2.GetKernCtx()
+	txtFiberApp := d0.LetTxt(owner, "fiberApp")
 	optFiber := kCtx.Get(txtFiberApp)
 	if optFiber.IsNone() {
-		err := d0.LetErr("GetPageModule(): not found fiberApp in kernel ctx")
+		err := d0.LetErr(owner,"GetPageModule(): not found fiberApp in kernel ctx")
 		return d0.ResErr[*PageModule](err)
 	}
 	fiberApp := optFiber.Some().Val().(*fiber.App)
 	kCtx.Set(txtFiberApp, fiberApp, "fiberApp in GetPageModule()")
 	sf := &PageModule{
 		kCtx: kCtx,
+		owner: owner,
 	}
 	fiberApp.Post("/module/:id", sf.postModule)
 	fiberApp.Post("/module_state/:id", sf.postModuleState)
@@ -58,7 +60,7 @@ var strLogBlock string
 // Возвращает страницу лога модуля.
 func (sf *PageModule) postModuleLog(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		return ctx.SendString(resNum.Err().Error())
 	}
@@ -99,7 +101,7 @@ var strCtxRowBlock string
 // Возвращает блок контекста монолита.
 func (sf *PageModule) postModuleCtx(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postModuleCtx(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -154,7 +156,7 @@ var strStateModuleBlock string
 // Показывает состояние модуля.
 func (sf *PageModule) postModuleState(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postModuleState(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -185,7 +187,7 @@ func (sf *PageModule) postModuleState(ctx fiber.Ctx) error {
 // Показывает состояние модуля.
 func (sf *PageModule) postModule(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postModule(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -223,7 +225,7 @@ func (sf *PageModule) postModule(ctx fiber.Ctx) error {
 // Возвращает секундную статистику модуля.
 func (sf *PageModule) postSvgDay(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postSvgDay(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -242,7 +244,7 @@ func (sf *PageModule) postSvgDay(ctx fiber.Ctx) error {
 // Возвращает секундную статистику модуля.
 func (sf *PageModule) postSvgMin(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postSvgMin(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -261,7 +263,7 @@ func (sf *PageModule) postSvgMin(ctx fiber.Ctx) error {
 // Возвращает секундную статистику модуля.
 func (sf *PageModule) postSvgSec(ctx fiber.Ctx) error {
 	_modNum := ctx.Params("id", "1")
-	resNum := mod_num.FromStr(d0.LetTxt(_modNum))
+	resNum := mod_num.FromStr(d0.LetTxt(sf.owner, _modNum))
 	if resNum.IsErr() {
 		err := fmt.Errorf("PageModule.postSvgSec(): in extract module num(%q), err=\n\t%w",
 			_modNum, resNum.Err())
@@ -279,7 +281,7 @@ func (sf *PageModule) postSvgSec(ctx fiber.Ctx) error {
 
 // Возвращает модуль.
 func (sf *PageModule) getModule(modNum *mod_num.LModuleNum) (mod_spec.IKernelModule, *d1.CtxValue) {
-	optMonolit := sf.kCtx.Get(d0.LetTxt("monolit"))
+	optMonolit := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit"))
 	if optMonolit.IsNone() {
 		return nil, nil
 	}

+ 10 - 10
v4/d3/mod_serv_http/page_module/page_module_test.go

@@ -118,9 +118,9 @@ func (sf *tester) comSvgPost() *fiber.App {
 	kMod := kmodule.NewKernelModule(sf.owner, modName)
 	kMod.Log().Debug("test msg")
 	ctxMod := kMod.Ctx()
-	ctxMod.Set(d0.LetTxt("demo_key"), "demo value", "for demo comment")
+	ctxMod.Set(d0.LetTxt(sf.owner, "demo_key"), "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set(d0.LetTxt("module_1"), kMod, "test_module")
+	ctxMon.Set(d0.LetTxt(sf.owner, "module_1"), kMod, "test_module")
 	fiberApp := sf.serv.Fiber()
 	return fiberApp
 }
@@ -135,9 +135,9 @@ func (sf *tester) postSvgMinBad1() {
 	kMod := kmodule.NewKernelModule(sf.owner, modName)
 	kMod.Log().Debug("test msg")
 	ctxMod := kMod.Ctx()
-	ctxMod.Set(d0.LetTxt("demo_key"), "demo value", "for demo comment")
+	ctxMod.Set(d0.LetTxt(sf.owner, "demo_key"), "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set(d0.LetTxt("module_1"), kMod, "test_module")
+	ctxMon.Set(d0.LetTxt(sf.owner, "module_1"), kMod, "test_module")
 	fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest(http.MethodPost, "/module_svg_min/svg_min_20.svg", nil)
 	if err != nil {
@@ -267,9 +267,9 @@ func (sf *tester) postModule1() {
 	module.Log().Debug(testMsg)
 	module.Log().Debug(testMsg)
 	ctxMod := module.Ctx()
-	ctxMod.Set(d0.LetTxt("demo_key"), "demo value", "for demo comment")
+	ctxMod.Set(d0.LetTxt(sf.owner, "demo_key"), "demo value", "for demo comment")
 	time.Sleep(time.Millisecond * 20)
-	ctxMon.Set(d0.LetTxt("module_1"), module, "test_module")
+	ctxMon.Set(d0.LetTxt(sf.owner, "module_1"), module, "test_module")
 	fiberApp := sf.serv.Fiber()
 	req, err := http.NewRequest(http.MethodPost, "/module/1", nil)
 	if err != nil {
@@ -290,7 +290,7 @@ func (sf *tester) postModule1() {
 // Возвращает состояние лога модуля.
 func (sf *tester) postModuleLog() {
 	sf.t.Log("postModuleLog")
-	monCtx := sf.kCtx.Get(d0.LetTxt("monolit")).Hassert("postModuleLog()")
+	monCtx := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit")).Hassert("postModuleLog()")
 	mon := monCtx.Val().(mod_spec.IKernelMonolit)
 	log := mon.Log()
 	log.Debug(testMsg)
@@ -364,14 +364,14 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv(sf.owner)
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18322/")
-	sf.kCtx.Set(d0.LetTxt("isLocal"), true, "testing")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "isLocal"), true, "testing")
 	_ = kmonolit.LetModMonolit("test_monolit")
 	sf.serv = kserv_http.GetKernelServHttp()
 
-	sf.page = GetPageModule().Hassert("new()")
+	sf.page = GetPageModule(sf.owner).Hassert("new()")
 	if sf.page == nil {
 		sf.t.Fatalf("new(): page==nil")
 	}
-	_ = GetPageModule()
+	_ = GetPageModule(sf.owner)
 	go sf.serv.Run()
 }

+ 9 - 7
v4/d3/mod_serv_http/page_monolit/page_monolit.go

@@ -18,6 +18,7 @@ import (
 // PageMonolit -- страница показа монолита.
 type PageMonolit struct {
 	kCtx       *d2.KernCtx
+	owner      *d0.LOwner
 	btnMonolit *btn_monolit.BtnMonolit
 	btnModules *btn_modules.BtnModules
 }
@@ -28,7 +29,7 @@ var (
 )
 
 // GetPageMonolit -- возвращает страницу монолита.
-func GetPageMonolit() *PageMonolit {
+func GetPageMonolit(owner *d0.LOwner) *PageMonolit {
 	block.Lock()
 	defer block.Unlock()
 	if page != nil {
@@ -36,11 +37,12 @@ func GetPageMonolit() *PageMonolit {
 	}
 	sf := &PageMonolit{
 		kCtx:       d2.GetKernCtx(),
-		btnMonolit: btn_monolit.NewBtnMonolit(),
-		btnModules: btn_modules.NewBtnModules(),
+		owner:      owner,
+		btnMonolit: btn_monolit.NewBtnMonolit(owner),
+		btnModules: btn_modules.NewBtnModules(owner),
 	}
 
-	optFiber := sf.kCtx.Get(d0.LetTxt("fiberApp"))
+	optFiber := sf.kCtx.Get(d0.LetTxt(owner, "fiberApp"))
 	optFiber.Hassert("GetPageMonolit(): mod='monolit', not found fiberApp in kernel ctx")
 	fiberApp := optFiber.Some().Val().(*fiber.App)
 	fiberApp.Get("/monolit", sf.getMonolit)
@@ -61,7 +63,7 @@ var strLogBlock string
 
 // Возвращает страницу лога монолита.
 func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
-	optMonolit := sf.kCtx.Get(d0.LetTxt("monolit"))
+	optMonolit := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit"))
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitLog(): mod='monolit', not found monolit in kernel ctx")
 		return err
@@ -88,7 +90,7 @@ var strCtxRowBlock string
 
 // Возвращает блок контекста монолита.
 func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
-	optMon := sf.kCtx.Get(d0.LetTxt("monolit"))
+	optMon := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit"))
 	if optMon.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitCtx(): mod='monolit', not found monolit in kernel ctx")
 		return err
@@ -118,7 +120,7 @@ var strStateMonolit string
 // Показывает состояние монолита.
 func (sf *PageMonolit) postMonolitState(ctx fiber.Ctx) error {
 	dictState := map[string]any{}
-	optMonolit := sf.kCtx.Get(d0.LetTxt("monolit"))
+	optMonolit := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit"))
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("PageMonolit.postMonolitState(): mod='monolit', not found monolit from kernel ctx")
 		return err

+ 5 - 5
v4/d3/mod_serv_http/page_monolit/page_monolit_test.go

@@ -41,7 +41,7 @@ func TestPageMonolit(t *testing.T) {
 // Возвращает состояние лога монолита.
 func (sf *tester) postMonolitLog() {
 	sf.t.Log("postMonolitCtx")
-	mon := sf.kCtx.Get(d0.LetTxt("monolit")).
+	mon := sf.kCtx.Get(d0.LetTxt(sf.owner, "monolit")).
 		Hassert("postMonolitLog()").
 		Val().(*kmonolit.LModMonolit)
 	log := mon.Log()
@@ -137,20 +137,20 @@ func (sf *tester) new() {
 	_ = mock_env.MakeEnv(sf.owner)
 	_ = os.Unsetenv("LOCAL_HTTP_URL")
 	_ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18310/")
-	sf.kCtx.Set(d0.LetTxt("isLocal"), true, "testing")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "isLocal"), true, "testing")
 	for {
 		time.Sleep(time.Millisecond * 1)
-		if sf.kCtx.Get(d0.LetTxt("isLocal")) != nil {
+		if sf.kCtx.Get(d0.LetTxt(sf.owner, "isLocal")) != nil {
 			break
 		}
 	}
 	_ = kmonolit.LetModMonolit("test_monolit")
 	sf.serv = kserv_http.GetKernelServHttp()
 
-	sf.page = GetPageMonolit()
+	sf.page = GetPageMonolit(sf.owner)
 	if sf.page == nil {
 		sf.t.Fatalf("new(): page==nil")
 	}
-	_ = GetPageMonolit()
+	_ = GetPageMonolit(sf.owner)
 	go sf.serv.Run()
 }

+ 11 - 9
v4/d3/mod_wui/mod_wui.go

@@ -29,6 +29,7 @@ import (
 type ModuleWui struct {
 	mod_spec.IKernelModule
 	kCtx      *d2.KernCtx
+	owner     *d0.LOwner
 	wCtx      *wui_ctx.WuiCtx
 	kServHttp kspec.IKernelServerHttp
 	log       *d1.LogBuf
@@ -50,16 +51,17 @@ func GetModuleWui() *ModuleWui {
 	modName := mod_ent.LetModuleName("wui")
 	sf := &ModuleWui{
 		kCtx:          d2.GetKernCtx(),
+		owner:         owner,
 		wCtx:          wui.GetWuiCtx(),
 		IKernelModule: kmodule.NewKernelModule(owner, modName),
 		kServHttp:     kserv_http.GetKernelServHttp(),
 	}
 	sf.log = sf.wCtx.Log()
-	_ = page_monolit.GetPageMonolit()
-	_ = page_module.GetPageModule()
+	_ = page_monolit.GetPageMonolit(owner)
+	_ = page_module.GetPageModule(owner)
 
-	_ = http_api.NewHttpApi()
-	optFiber := sf.kCtx.Get(d0.LetTxt("fiberApp"))
+	_ = http_api.NewHttpApi(owner)
+	optFiber := sf.kCtx.Get(d0.LetTxt(owner, "fiberApp"))
 	optFiber.Hassert("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx")
 	fibApp := optFiber.Some().Val().(*fiber.App)
 	fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet)
@@ -69,7 +71,7 @@ func GetModuleWui() *ModuleWui {
 
 // Run -- запускает модуль в работу.
 func (sf *ModuleWui) Run() {
-	msg := d0.LetTxt("ModuleWui.Run(): module=%v, is run", sf.Name()).Get()
+	msg := d0.LetTxt(sf.owner, "ModuleWui.Run(): module=%v, is run", sf.Name()).Get()
 	sf.log.Info(msg)
 	sf.kServHttp.Run()
 }
@@ -86,11 +88,11 @@ func (sf *ModuleWui) IsWork() d0.Bool {
 
 // Получает событие из сети.
 func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
-	url := d0.LetTxt(req.RequestURI)
+	url := d0.LetTxt(sf.owner, req.RequestURI)
 	id := strings.TrimPrefix(url.String(), "/wui/click/")
-	optWidget := sf.wCtx.Get(d0.LetTxt(id))
+	optWidget := sf.wCtx.Get(d0.LetTxt(sf.owner, id))
 	if optWidget == nil {
-		err := d0.LetErr("ModuleWui.wuiClick(): id(%v), widget not exists", id)
+		err := d0.LetErr(sf.owner, "ModuleWui.wuiClick(): id(%v), widget not exists", id)
 		sf.log.Err(err)
 		_, _ = fmt.Fprint(resp, err)
 		return
@@ -98,7 +100,7 @@ func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
 	_widget1 := optWidget.Some()
 	widget1, isOk := _widget1.Val().(*wui_button.WuiButton)
 	if !isOk {
-		strOut := d0.LetErr("ModuleWui.wuiClick(): widget(%T) not button",
+		strOut := d0.LetErr(sf.owner, "ModuleWui.wuiClick(): widget(%T) not button",
 			optWidget.Some())
 		sf.log.Err(strOut)
 		_, _ = fmt.Fprint(resp, strOut)

+ 7 - 7
v4/d3/mod_wui/mod_wui_test.go

@@ -52,7 +52,7 @@ func TestModKernelCtx(t *testing.T) {
 	fnClear()
 
 	defer fnClear()
-	sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "test")
+	sf.kCtx.Set(d0.LetTxt(sf.owner, "monolitName"), "test_monolit", "test")
 	sf.new()
 	sf.click()
 	sf.done()
@@ -71,7 +71,7 @@ func (sf *tester) click() {
 // С кривой POST-формой.
 func (sf *tester) clickBad3() {
 	sf.t.Log("clickBad3")
-	btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick)
+	btn := wui_button.NewWuiButton(sf.owner, d0.LetTxt(sf.owner, "test_btn"), sf.fnClick)
 	// Данные формы
 	reader := strings.NewReader("tra-ta-ta")
 	req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), reader)
@@ -99,7 +99,7 @@ func (sf *tester) clickBad3() {
 // С POST-формой.
 func (sf *tester) clickGood2() {
 	sf.t.Log("clickGood2")
-	btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick)
+	btn := wui_button.NewWuiButton(sf.owner, d0.LetTxt(sf.owner, "test_btn"), sf.fnClick)
 	// Данные формы
 	formData := url.Values{
 		"username": {"john_doe"},
@@ -133,7 +133,7 @@ func (sf *tester) clickGood2() {
 // Без POST-формы.
 func (sf *tester) clickGood1() {
 	sf.t.Log("clickGood1")
-	btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick)
+	btn := wui_button.NewWuiButton(sf.owner, d0.LetTxt(sf.owner, "test_btn"), sf.fnClick)
 	req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), nil)
 
 	if err != nil {
@@ -155,13 +155,13 @@ func (sf *tester) clickGood1() {
 // Обратный вызов клика.
 func (sf *tester) fnClick(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] {
 	sf.t.Log("fnClick")
-	return d0.ResOk(d0.LetTxt("test_click"))
+	return d0.ResOk(d0.LetTxt(sf.owner, "test_click"))
 }
 
 // Неправильный тип объекта.
 func (sf *tester) clickBad2() {
 	sf.t.Log("clickBad2")
-	lbl := wui_label.NewWuiLabel(d0.LetTxt("test_lbl")).
+	lbl := wui_label.NewWuiLabel(sf.owner, d0.LetTxt(sf.owner, "test_lbl")).
 		Hassert("clickBad2()")
 	req, err := http.NewRequest(http.MethodPost, "/wui/click/"+lbl.Id().String(), nil)
 
@@ -233,7 +233,7 @@ func (sf *tester) newGood1() {
 
 	sf.mod = GetModuleWui()
 	kCtx := d2.GetKernCtx()
-	kCtx.Set(d0.LetTxt("isLocal"), true, "type msg bus")
+	kCtx.Set(d0.LetTxt(sf.owner, "isLocal"), true, "type msg bus")
 
 	_ = kmonolit.LetModMonolit("test_monolit")
 	_ = GetModuleWui()

+ 9 - 7
v4/kern.go

@@ -82,8 +82,8 @@ func MutSafeBool[T BoolConstraint](owner *LOwner, val T) *MSafeBool {
 // GetKernelBusLocal -- возвращает локальную шину данных.
 func GetKernelBusLocal() bus_spec.IKernelBus {
 	kCtx := d2.GetKernCtx()
-	kCtx.Set(d0.LetTxt("monolitName"), "unknown monolit", "GetKernelBusLocal()")
 	lBus := kbus_local.GetKernelBusLocal()
+	kCtx.Set(d0.LetTxt(lBus.Owner(), "monolitName"), "unknown monolit", "GetKernelBusLocal()")
 	return lBus
 }
 
@@ -104,10 +104,11 @@ type AModuleName = mod_ent.AModuleName
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
 func GetMonolitLocal(name AModuleName) mod_spec.IKernelMonolit {
 	kCtx := d2.GetKernCtx()
-	kCtx.Set(d0.LetTxt("isLocal"), true, "bus type")
+	owner:=kCtx.Owner()
+	kCtx.Set(d0.LetTxt(owner, "isLocal"), true, "bus type")
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get(d0.LetTxt("isLocal"))
+		optIsLocal := kCtx.Get(d0.LetTxt(owner, "isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}
@@ -121,10 +122,11 @@ func GetMonolitLocal(name AModuleName) mod_spec.IKernelMonolit {
 func GetMonolitHttp(name AModuleName) mod_spec.IKernelMonolit {
 	kCtx := d2.GetKernCtx()
 	_ = kbus_http.GetKernelBusHttp()
-	kCtx.Set(d0.LetTxt("isLocal"), false, "bus type")
+	owner:=kCtx.Owner()
+	kCtx.Set(d0.LetTxt(owner, "isLocal"), false, "bus type")
 	for {
 		time.Sleep(time.Millisecond * 1)
-		optIsLocal := kCtx.Get(d0.LetTxt("isLocal"))
+		optIsLocal := kCtx.Get(d0.LetTxt(owner, "isLocal"))
 		if optIsLocal.IsSome() {
 			break
 		}
@@ -249,8 +251,8 @@ type TxtConstraint = d0.TxtConstraint
 type MSafeTxt = d0.MSafeTxt
 
 // MutSafeTxt -- возвращает новую потокобезопасный текст.
-func MutSafeTxt[T TxtConstraint](txt T, arg ...any) *MSafeTxt {
-	str := d0.MutSafeTxt(txt, arg...)
+func MutSafeTxt[T TxtConstraint](owner *d0.LOwner, txt T, arg ...any) *MSafeTxt {
+	str := d0.MutSafeTxt(owner, txt, arg...)
 	return str
 }
 

+ 2 - 2
v4/kern_test.go

@@ -72,7 +72,7 @@ func (sf *tester) new() {
 }
 
 func (sf *tester) new3() {
-	safeStr := MutSafeTxt("test %v", 123)
+	safeStr := MutSafeTxt(sf.owner, "test %v", 123)
 	if safeStr == nil {
 		sf.t.Fatalf("new(): ISafeStr==nil")
 	}
@@ -147,7 +147,7 @@ func (sf *tester) new1() {
 	if clientLocal == nil {
 		sf.t.Fatalf("new1(): (local) IBusClient==nil")
 	}
-	clientHttp := NewClientBusHttp(sf.owner, defs.LetTxt("test_url"))
+	clientHttp := NewClientBusHttp(sf.owner, defs.LetTxt(sf.owner, "test_url"))
 	if clientHttp == nil {
 		sf.t.Fatalf("new1(): (http) IBusClient==nil")
 	}