Bladeren bron

SVI Переделка кода под кванты

SVI 2 maanden geleden
bovenliggende
commit
ecf9563421
100 gewijzigde bestanden met toevoegingen van 1289 en 792 verwijderingen
  1. 12 5
      v4/go.mod
  2. 28 8
      v4/go.sum
  3. 75 74
      v4/kern.go
  4. 3 11
      v4/kern_test.go
  5. 77 0
      v4/lev0/alias/alias.go
  6. 1 1
      v4/lev0/alias/alias_test.go
  7. 73 0
      v4/lev0/alias/atime/atime.go
  8. 23 0
      v4/lev0/alias/atime/atime_test.go
  9. 34 0
      v4/lev0/alias/handler_name/handler_name.go
  10. 36 0
      v4/lev0/alias/module_name/module_name.go
  11. 32 0
      v4/lev0/alias/store_key/store_key.go
  12. 35 0
      v4/lev0/alias/stream_name/stream_name.go
  13. 34 0
      v4/lev0/alias/topic/topic.go
  14. 0 8
      v4/lev0/helpers/helpers.go
  15. 1 4
      v4/lev0/helpers/helpers_test.go
  16. 0 22
      v4/lev0/kalias/kalias.go
  17. 5 1
      v4/lev0/ktypes/ibucket_base.go
  18. 7 4
      v4/lev0/ktypes/idict_kv.go
  19. 14 13
      v4/lev0/ktypes/ikernel_bus.go
  20. 5 3
      v4/lev0/ktypes/ikernel_int.go
  21. 2 2
      v4/lev0/ktypes/ikernel_module.go
  22. 3 1
      v4/lev0/ktypes/ikernel_monolit.go
  23. 1 1
      v4/lev0/ktypes/ikernel_server_http.go
  24. 6 4
      v4/lev0/ktypes/ikernel_store_kv.go
  25. 5 4
      v4/lev0/ktypes/ikernel_wg.go
  26. 7 5
      v4/lev0/ktypes/ilocal_ctx.go
  27. 7 5
      v4/lev0/ktypes/ilog_buf.go
  28. 0 19
      v4/lev0/ktypes/ioption.go
  29. 4 4
      v4/lev0/ktypes/irec_meta.go
  30. 2 2
      v4/lev0/ktypes/irec_val.go
  31. 0 23
      v4/lev0/ktypes/iresult.go
  32. 6 2
      v4/lev0/ktypes/isafe_bool.go
  33. 3 1
      v4/lev0/ktypes/isafe_bool_react.go
  34. 3 1
      v4/lev0/ktypes/isafe_string.go
  35. 49 0
      v4/lev0/lev0.go
  36. 1 3
      v4/lev0/option/option.go
  37. 3 5
      v4/lev0/option/option_test.go
  38. 30 0
      v4/lev0/quark/quark.go
  39. 21 9
      v4/lev0/quark/quark_base/quark_base.go
  40. 4 0
      v4/lev0/quark/quark_bool/quark_bool.go
  41. 12 0
      v4/lev0/quark/quark_byte/quark_byte.go
  42. 6 0
      v4/lev0/quark/quark_float/quark_float.go
  43. 6 0
      v4/lev0/quark/quark_int/quark_int.go
  44. 4 0
      v4/lev0/quark/quark_str/quark_str.go
  45. 15 11
      v4/lev0/quark/quark_val/quark_val.go
  46. 2 2
      v4/lev0/quark/quark_val/quark_val_test.go
  47. 15 16
      v4/lev0/result/result.go
  48. 5 7
      v4/lev0/result/result_test.go
  49. 10 12
      v4/lev1/ctx_value/ctx_value.go
  50. 4 4
      v4/lev1/ctx_value/ctx_value_test.go
  51. 5 5
      v4/lev1/kbus_msg/msg_pub/msg_pub.go
  52. 7 1
      v4/lev1/kbus_msg/msg_pub/msg_pub_test.go
  53. 5 5
      v4/lev1/kbus_msg/msg_serve/msg_serve.go
  54. 7 1
      v4/lev1/kbus_msg/msg_serve/msg_serve_test.go
  55. 9 8
      v4/lev1/kbus_msg/msg_sub/msg_sub.go
  56. 7 1
      v4/lev1/kbus_msg/msg_sub/msg_sub_test.go
  57. 4 4
      v4/lev1/kbus_msg/msg_unsub/msg_unsub.go
  58. 3 1
      v4/lev1/kbus_msg/msg_unsub/msg_unsub_test.go
  59. 11 11
      v4/lev1/kint/kint.go
  60. 14 39
      v4/lev1/lev1.go
  61. 14 15
      v4/lev1/local_ctx/local_ctx.go
  62. 1 1
      v4/lev1/log_buf/log_buf.go
  63. 7 7
      v4/lev1/log_dict_topic/log_dict_topic.go
  64. 16 13
      v4/lev1/log_msg/log_msg.go
  65. 4 4
      v4/lev1/log_msg/log_msg_test.go
  66. 14 14
      v4/lev1/safe_bool/safe_bool.go
  67. 18 18
      v4/lev1/safe_bool_react/safe_bool_react.go
  68. 13 13
      v4/lev1/safe_int/safe_int.go
  69. 9 9
      v4/lev1/safe_string/safe_string.go
  70. 15 15
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook.go
  71. 8 2
      v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go
  72. 15 18
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go
  73. 8 2
      v4/lev2/kbus/dict_topic_serve/dict_topic_serve_test.go
  74. 14 22
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go
  75. 15 6
      v4/lev2/kbus/dict_topic_sub/dict_topic_sub_test.go
  76. 30 28
      v4/lev2/kbus_base/kbus_base.go
  77. 20 6
      v4/lev2/kbus_base/kbus_base_test.go
  78. 29 28
      v4/lev2/kbus_http/client_bus_http/client_bus_http.go
  79. 22 8
      v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go
  80. 18 17
      v4/lev2/kbus_http/kbus_http.go
  81. 24 10
      v4/lev2/kbus_http/kbus_http_test.go
  82. 4 4
      v4/lev2/kbus_local/client_bus_local/client_bus_local.go
  83. 6 1
      v4/lev2/kbus_local/client_bus_local/client_bus_local_test.go
  84. 5 6
      v4/lev2/kbus_local/kbus_local.go
  85. 8 2
      v4/lev2/kbus_local/kbus_local_test.go
  86. 5 4
      v4/lev2/kctx/kctx.go
  87. 11 8
      v4/lev2/kernel_keeper/kernel_keeper.go
  88. 17 18
      v4/lev2/kmodule/kmodule.go
  89. 4 12
      v4/lev2/kmodule/kmodule_test.go
  90. 4 4
      v4/lev2/kmodule/mod_stat/mod_stat.go
  91. 4 13
      v4/lev2/kmodule/mod_stat/mod_stat_test.go
  92. 19 18
      v4/lev2/kmonolit/kmonolit.go
  93. 7 4
      v4/lev2/kmonolit/kmonolit_test.go
  94. 17 17
      v4/lev2/kserv_http/kserv_http.go
  95. 5 4
      v4/lev2/kserv_http_std/kserv_http_std.go
  96. 22 20
      v4/lev2/kstore_kv/kstore_kv.go
  97. 7 2
      v4/lev2/kstore_kv/kstore_kv_test.go
  98. 11 11
      v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec.go
  99. 4 3
      v4/lev2/kstore_kv_std/kv_bucket_base/dict_rec/dict_rec_test.go
  100. 12 12
      v4/lev2/kstore_kv_std/kv_bucket_base/kv_bucket_base.go

+ 12 - 5
v4/go.mod

@@ -1,11 +1,12 @@
 module gitp78su.ipnodns.ru/svi/kern/v4
 
-go 1.24.2
+go 1.25.0
 
 require (
 	github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b
 	github.com/dgraph-io/badger/v4 v4.8.0
 	github.com/gofiber/fiber/v2 v2.52.9
+	github.com/gofiber/fiber/v3 v3.1.0
 	github.com/google/uuid v1.6.0
 )
 
@@ -18,18 +19,24 @@ require (
 	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/go-logr/logr v1.4.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/gofiber/schema v1.7.0 // indirect
+	github.com/gofiber/utils/v2 v2.0.2 // indirect
 	github.com/google/flatbuffers v25.9.23+incompatible // indirect
-	github.com/klauspost/compress v1.18.1 // indirect
+	github.com/klauspost/compress v1.18.4 // indirect
 	github.com/mattn/go-colorable v0.1.14 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-runewidth v0.0.19 // indirect
+	github.com/philhofer/fwd v1.2.0 // indirect
+	github.com/tinylib/msgp v1.6.3 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
-	github.com/valyala/fasthttp v1.68.0 // indirect
+	github.com/valyala/fasthttp v1.69.0 // indirect
 	go.opentelemetry.io/auto/sdk v1.2.1 // indirect
 	go.opentelemetry.io/otel v1.38.0 // indirect
 	go.opentelemetry.io/otel/metric v1.38.0 // indirect
 	go.opentelemetry.io/otel/trace v1.38.0 // indirect
-	golang.org/x/net v0.46.0 // indirect
-	golang.org/x/sys v0.37.0 // indirect
+	golang.org/x/crypto v0.48.0 // indirect
+	golang.org/x/net v0.50.0 // indirect
+	golang.org/x/sys v0.41.0 // indirect
+	golang.org/x/text v0.34.0 // indirect
 	google.golang.org/protobuf v1.36.10 // indirect
 )

+ 28 - 8
v4/go.sum

@@ -21,6 +21,8 @@ github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa5
 github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
 github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
+github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
+github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
 github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
@@ -28,6 +30,12 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw=
 github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
+github.com/gofiber/fiber/v3 v3.1.0 h1:1p4I820pIa+FGxfwWuQZ5rAyX0WlGZbGT6Hnuxt6hKY=
+github.com/gofiber/fiber/v3 v3.1.0/go.mod h1:n2nYQovvL9z3Too/FGOfgtERjW3GQcAUqgfoezGBZdU=
+github.com/gofiber/schema v1.7.0 h1:yNM+FNRZjyYEli9Ey0AXRBrAY9jTnb+kmGs3lJGPvKg=
+github.com/gofiber/schema v1.7.0/go.mod h1:A/X5Ffyru4p9eBdp99qu+nzviHzQiZ7odLT+TwxWhbk=
+github.com/gofiber/utils/v2 v2.0.2 h1:ShRRssz0F3AhTlAQcuEj54OEDtWF7+HJDwEi/aa6QLI=
+github.com/gofiber/utils/v2 v2.0.2/go.mod h1:+9Ub4NqQ+IaJoTliq5LfdmOJAA/Hzwf4pXOxOa3RrJ0=
 github.com/google/flatbuffers v25.9.23+incompatible h1:rGZKv+wOb6QPzIdkM2KxhBZCDrA0DeN6DNmRDrqIsQU=
 github.com/google/flatbuffers v25.9.23+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
@@ -35,22 +43,30 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co=
-github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0=
+github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c=
+github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
 github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
 github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
 github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
+github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM=
+github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/shamaton/msgpack/v3 v3.1.0 h1:jsk0vEAqVvvS9+fTZ5/EcQ9tz860c9pWxJ4Iwecz8gU=
+github.com/shamaton/msgpack/v3 v3.1.0/go.mod h1:DcQG8jrdrQCIxr3HlMYkiXdMhK+KfN2CitkyzsQV4uc=
 github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/tinylib/msgp v1.6.3 h1:bCSxiTz386UTgyT1i0MSCvdbWjVW+8sG3PjkGsZQt4s=
+github.com/tinylib/msgp v1.6.3/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA=
 github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
-github.com/valyala/fasthttp v1.68.0 h1:v12Nx16iepr8r9ySOwqI+5RBJ/DqTxhOy1HrHoDFnok=
-github.com/valyala/fasthttp v1.68.0/go.mod h1:5EXiRfYQAoiO/khu4oU9VISC/eVY6JqmSpPJoHCKsz4=
+github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI=
+github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw=
+github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
+github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
 github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -65,12 +81,14 @@ go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42s
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts=
+golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4=
-golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210=
+golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60=
+golang.org/x/net v0.50.0/go.mod h1:UgoSli3F/pBgdJBHCTc+tp3gmrU4XswgGRgtnwWTfyM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -78,10 +96,12 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ=
-golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
+golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
+golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=

+ 75 - 74
v4/kern.go

@@ -5,9 +5,10 @@ import (
 	"context"
 	"fmt"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
-	kt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_http/client_bus_http"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
@@ -24,98 +25,98 @@ import (
 )
 
 // GetKernelCtx -- возвращает контекст ядра.
-func GetKernelCtx() kt.IResult[kt.IKernelCtx] {
+func GetKernelCtx() *mL0.Result[mKt.IKernelCtx] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("GetKernelCtx(): err=\n\t%w", resCtx.Err())
-		return NewErr[kt.IKernelCtx](err)
+		return NewErr[mKt.IKernelCtx](err)
 	}
-	return NewRes(kt.IKernelCtx(resCtx.Val()))
+	return NewRes(mKt.IKernelCtx(resCtx.Val()))
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) kt.IResult[T] {
-	return lev1.NewErr[T](err)
+func NewErr[T any](err error) *mL0.Result[T] {
+	return mL0.NewErr[T](err)
 }
 
 // NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](res T) kt.IResult[T] {
-	return lev1.NewRes(res)
+func NewRes[T any](res T) *mL0.Result[T] {
+	return mL0.NewRes(res)
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res kt.IResult[T], err error) kt.IResult[T] {
-	return lev1.WrapErr(res, err)
+func WrapErr[T any](res *mL0.Result[T], err error) *mL0.Result[T] {
+	return mL0.WrapErr(res, err)
 }
 
 // GetKernelStoreKv -- возвращает быстрое key-value хранилище ядра.
-func GetKernelStoreKv() kt.IResult[kt.IKernelStoreKv] {
+func GetKernelStoreKv() *mL0.Result[mKt.IKernelStoreKv] {
 	resStore := kstore_kv.GetKernelStore()
 	if resStore.IsErr() {
 		err := fmt.Errorf("GetKernelStoreKv(): err=\n\t%w", resStore.Err())
-		return NewErr[kt.IKernelStoreKv](err)
+		return NewErr[mKt.IKernelStoreKv](err)
 	}
-	store := kt.IKernelStoreKv(resStore.Val())
+	store := mKt.IKernelStoreKv(resStore.Val())
 	return NewRes(store)
 }
 
 // GetKernelServerHttp -- возвращает веб-сервер ядра.
-func GetKernelServerHttp() kt.IResult[kt.IKernelServerHttp] {
+func GetKernelServerHttp() *mL0.Result[mKt.IKernelServerHttp] {
 	kernServHttp := kserv_http.GetKernelServHttp()
 	return kernServHttp
 }
 
 // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-func NewSafeBool() kt.ISafeBool {
-	sb := lev1.NewSafeBool()
+func NewSafeBool() mKt.ISafeBool {
+	sb := mL1.NewSafeBool()
 	return sb
 }
 
 // GetKernelBusLocal -- возвращает локальную шину данных.
-func GetKernelBusLocal() kt.IResult[kt.IKernelBus] {
+func GetKernelBusLocal() *mL0.Result[mKt.IKernelBus] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resCtx.Err())
-		return NewErr[kt.IKernelBus](err)
+		return NewErr[mKt.IKernelBus](err)
 	}
 	kCtx := resCtx.Val()
 	resSet := kCtx.Set("monolitName", "unknown monolit", "GetKernelBusLocal()")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resSet.Err())
-		return NewErr[kt.IKernelBus](err)
+		return NewErr[mKt.IKernelBus](err)
 	}
 	resBus := kbus_local.GetKernelBusLocal()
 	if resBus.IsErr() {
 		err := fmt.Errorf("GetKernelBusLocal(): err=\n\t%w", resBus.Err())
-		return NewErr[kt.IKernelBus](err)
+		return NewErr[mKt.IKernelBus](err)
 	}
-	bus := kt.IKernelBus(resBus.Val())
+	bus := mKt.IKernelBus(resBus.Val())
 	return NewRes(bus)
 }
 
 // GetKernelBusHttp -- возвращает HTTP шину данных.
-func GetKernelBusHttp() kt.IResult[kt.IKernelBus] {
+func GetKernelBusHttp() *mL0.Result[mKt.IKernelBus] {
 	bus := kbus_http.GetKernelBusHttp()
 	return bus
 }
 
 // SleepMs -- спит миллисекунду.
 func SleepMs() {
-	lev1.SleepMs()
+	mL1.SleepMs()
 }
 
 // GetMonolitLocal -- возвращает монолит с локальной шиной.
-func GetMonolitLocal(name string) kt.IResult[kt.IKernelMonolit] {
+func GetMonolitLocal(name string) *mL0.Result[mKt.IKernelMonolit] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resCtx.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
 	kCtx := resCtx.Val()
 	resSet := kCtx.Set("isLocal", true, "bus type")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", resSet.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
 	for {
 		SleepMs()
@@ -127,25 +128,25 @@ func GetMonolitLocal(name string) kt.IResult[kt.IKernelMonolit] {
 	res := kmonolit.GetMonolit(name)
 	if res.IsErr() {
 		err := fmt.Errorf("GetMonolitLocal(): err=\n\t%w", res.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
 	_ = kbus_local.GetKernelBusLocal()
-	return NewRes(kt.IKernelMonolit(res.Val()))
+	return NewRes(mKt.IKernelMonolit(res.Val()))
 }
 
 // GetMonolitHttp -- возвращает монолит с локальной шиной поверх HTTP.
-func GetMonolitHttp(name string) kt.IResult[kt.IKernelMonolit] {
+func GetMonolitHttp(name string) *mL0.Result[mKt.IKernelMonolit] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resCtx.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
 	kCtx := resCtx.Val()
 	_ = kbus_http.GetKernelBusHttp()
 	resSet := kCtx.Set("isLocal", false, "bus type")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", resSet.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
 	for {
 		SleepMs()
@@ -157,151 +158,151 @@ func GetMonolitHttp(name string) kt.IResult[kt.IKernelMonolit] {
 	res := kmonolit.GetMonolit(name)
 	if res.IsErr() {
 		err := fmt.Errorf("GetMonolitHttp(): err=\n\t%w", res.Err())
-		return NewErr[kt.IKernelMonolit](err)
+		return NewErr[mKt.IKernelMonolit](err)
 	}
-	return NewRes(kt.IKernelMonolit(res.Val()))
+	return NewRes(mKt.IKernelMonolit(res.Val()))
 }
 
 // NewKernelModule -- возвращает новый модуль на ядре.
-func NewKernelModule(name mKa.AModuleName) kt.IResult[kt.IKernelModule] {
+func NewKernelModule(name *mKa.AModuleName) *mL0.Result[mKt.IKernelModule] {
 	resMod := kmodule.NewKernelModule(name)
 	return resMod
 }
 
 // NewClientBusLocal -- возвращает клиент для работы с локальной шиной.
-func NewClientBusLocal() kt.IResult[kt.IBusClient] {
+func NewClientBusLocal() *mL0.Result[mKt.IBusClient] {
 	res := client_bus_local.NewClientBusLocal()
 	if res.IsErr() {
 		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", res.Err())
-		return NewErr[kt.IBusClient](err)
+		return NewErr[mKt.IBusClient](err)
 	}
 	client := res.Val()
 	return NewRes(client)
 }
 
 // NewClientBusHttp -- возвращает клиент для работы с шиной поверх HTTP.
-func NewClientBusHttp(url string) kt.IResult[kt.IBusClient] {
+func NewClientBusHttp(url string) *mL0.Result[mKt.IBusClient] {
 	client := client_bus_http.NewClientBusHttp(url)
 	return client
 }
 
 // GetModuleServHttp -- возвращает модуль для IKernelServHttp.
-func GetModuleServHttp() kt.IResult[kt.IKernelModule] {
+func GetModuleServHttp() *mL0.Result[mKt.IKernelModule] {
 	resHttp := mod_serv_http.GetModuleServHttp()
 	if resHttp.IsErr() {
 		err := fmt.Errorf("GetModuleServHttp(): err=\n\t%w", resHttp.Err())
-		return NewErr[kt.IKernelModule](err)
+		return NewErr[mKt.IKernelModule](err)
 	}
 	modServHttp := resHttp.Val()
-	return NewRes(kt.IKernelModule(modServHttp))
+	return NewRes(mKt.IKernelModule(modServHttp))
 }
 
 // GetModuleKernelCtx -- возвращает модуль для IKernelCtx.
-func GetModuleKernelCtx() kt.IResult[kt.IKernelModule] {
+func GetModuleKernelCtx() *mL0.Result[mKt.IKernelModule] {
 	resMod := mod_kctx.GetModuleKernelCtx()
 	if resMod.IsErr() {
 		err := fmt.Errorf("GetModuleKernelCtx(): err=\n\t%w", resMod.Err())
-		return NewErr[kt.IKernelModule](err)
+		return NewErr[mKt.IKernelModule](err)
 	}
 	mod := resMod.Val()
-	return NewRes(kt.IKernelModule(mod))
+	return NewRes(mKt.IKernelModule(mod))
 }
 
 // GetModuleKernelKeeper -- возвращает модуль для IKernelKeeper.
-func GetModuleKernelKeeper() kt.IResult[kt.IKernelModule] {
+func GetModuleKernelKeeper() *mL0.Result[mKt.IKernelModule] {
 	resKeeper := mod_keeper.GetModuleKeeper()
 	if resKeeper.IsErr() {
 		err := fmt.Errorf("GetModuleKernelKeeper(): err=\n\t%w", resKeeper.Err())
-		return NewErr[kt.IKernelModule](err)
+		return NewErr[mKt.IKernelModule](err)
 	}
 	modKernelKeeper := resKeeper.Val()
-	return NewRes(kt.IKernelModule(modKernelKeeper))
+	return NewRes(mKt.IKernelModule(modKernelKeeper))
 }
 
 // GetModuleWui -- возвращает модуль для WUI.
-func GetModuleWui() kt.IResult[kt.IKernelModule] {
+func GetModuleWui() *mL0.Result[mKt.IKernelModule] {
 	resMod := mod_wui.GetModuleWui()
 	if resMod.IsErr() {
 		err := fmt.Errorf("GetModuleWui(): err=\n\t%w", resMod.Err())
-		return NewErr[kt.IKernelModule](err)
+		return NewErr[mKt.IKernelModule](err)
 	}
 	modWui := resMod.Val()
-	return NewRes(kt.IKernelModule(modWui))
+	return NewRes(mKt.IKernelModule(modWui))
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог.
-func NewLogBuf(opts ...lev1.OptionLogBuf) kt.ILogBuf {
-	log := lev1.NewLogBuf(opts...)
+func NewLogBuf(opts ...mL1.OptionLogBuf) mKt.ILogBuf {
+	log := mL1.NewLogBuf(opts...)
 	return log
 }
 
 // NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
-func NewSafeBoolReact() kt.ISafeBoolReact {
-	val := lev1.NewSafeBoolReact()
+func NewSafeBoolReact() mKt.ISafeBoolReact {
+	val := mL1.NewSafeBoolReact()
 	return val
 }
 
 // NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную.
-func NewSafeInt(val int) kt.ISafeInt {
-	val_ := lev1.NewSafeInt(val)
+func NewSafeInt(val int) mKt.ISafeInt {
+	val_ := mL1.NewSafeInt(val)
 	return val_
 }
 
 // NewInt -- возвращает новую целочисленную переменную.
-func NewInt(val int) kt.Int {
-	val_ := lev1.NewInt(val)
+func NewInt(val int) mKt.Int {
+	val_ := mL1.NewInt(val)
 	return val_
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) kt.IResult[kt.ILocalCtx] {
-	resCtx := lev1.NewLocalCtx(ctx)
+func NewLocalCtx(ctx context.Context) *mL0.Result[mKt.ILocalCtx] {
+	resCtx := mL1.NewLocalCtx(ctx)
 	if resCtx.IsErr() {
 		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
-		return NewErr[kt.ILocalCtx](err)
+		return NewErr[mKt.ILocalCtx](err)
 	}
 	ctx_ := resCtx.Val()
 	return NewRes(ctx_)
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку.
-func NewSafeString() kt.ISafeString {
-	str := lev1.NewSafeString()
+func NewSafeString() mKt.ISafeString {
+	str := mL1.NewSafeString()
 	return str
 }
 
 // MakeOk -- возвращает новый положительный результат операции.
-func MakeOk[T any](res T) kt.IResult[T] {
+func MakeOk[T any](res T) *mL0.Result[T] {
 	return NewRes(res)
 }
 
 // MakeErr -- возвращает новую ошибку результат операции.
-func MakeErr[T any](err error) kt.IResult[T] {
+func MakeErr[T any](err error) *mL0.Result[T] {
 	return NewErr[T](err)
 }
 
 // NewOpt -- возвращает новый не пустой результат операции.
-func NewOpt[T any](some T) kt.IOption[T] {
-	return lev1.NewOpt(some)
+func NewOpt[T any](some T) *mL0.Option[T] {
+	return mL0.NewOpt(some)
 }
 
 // NewNone -- возвращает новый пустой результат операции.
-func NewNone[T any]() kt.IOption[T] {
-	return lev1.NewNone[T]()
+func NewNone[T any]() *mL0.Option[T] {
+	return mL0.NewNone[T]()
 }
 
 // FnHassert -- проверяет с жёстким падением условие.
-type FnHassert = lev1.FnHassert
+type FnHassert = mL1.FnHassert
 
 // Hassert -- возвращает ссылку на функцию Hassert.
 func Hassert() FnHassert {
-	return lev1.Hassert()
+	return mL1.Hassert()
 }
 
 // FnAssert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
-type FnAssert = lev1.FnAssert
+type FnAssert = mL1.FnAssert
 
 // Assert -- возвращает ссылку на функцию Hassert.
 func Assert() FnAssert {
-	return lev1.Assert()
+	return mL1.Assert()
 }

+ 3 - 11
v4/kern_test.go

@@ -5,6 +5,7 @@ import (
 	"os"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 )
@@ -34,15 +35,6 @@ func TestBuilders(t *testing.T) {
 	fnClear()
 	defer fnClear()
 	sf.new()
-	sf.newModBad()
-}
-
-func (sf *tester) newModBad() {
-	sf.t.Log("newModBad")
-	res := NewKernelModule("")
-	if res.IsOk() {
-		sf.t.Fatalf("newModBad(): res.IsOk()")
-	}
 }
 
 // создание компонентов.
@@ -143,8 +135,8 @@ func (sf *tester) new1() {
 	if monHttp == nil {
 		sf.t.Fatalf("new1(): (http) IKernelMonolit==nil")
 	}
-
-	mod := NewKernelModule("test_mod")
+	modName := alias.NewAModuleName("test_mod")
+	mod := NewKernelModule(modName)
 	if mod == nil {
 		sf.t.Fatalf("new1(): IKernelModule==nil")
 	}

+ 77 - 0
v4/lev0/alias/alias.go

@@ -0,0 +1,77 @@
+// package alias -- алиасы типов ядра.
+package alias
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/atime"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/handler_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/module_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/store_key"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/stream_name"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias/topic"
+)
+
+// ABucketName -- имя сущности.
+type ABucketName string
+
+// AStreamName -- имя потока для ожидания.
+type AStreamName = stream_name.AStreamName
+
+// NewAStreamName -- создать новое имя потока.
+//
+//go:fix inline
+func NewAStreamName(val string) *AStreamName {
+	return stream_name.NewAStreamName(val)
+}
+
+// ATopic -- имя топика.
+type ATopic = topic.ATopic
+
+// NewATopic -- создать новое имя топика.
+//
+//go:fix inline
+func NewATopic(val string) *ATopic {
+	return topic.NewATopic(val)
+}
+
+// ATime -- метка времени.
+type ATime = atime.ATime
+
+// FnOptAtime -- тп функции опции времени для установки значения.
+type FnOptAtime = atime.FnOptAtime
+
+// NewATime -- создать новую метку времени.
+//
+//go:fix inline
+func NewATime(lstFn ...FnOptAtime) *ATime {
+	return atime.NewATime(lstFn...)
+}
+
+// AHandlerName -- имя функции обработчика.
+type AHandlerName = handler_name.AHandlerName
+
+// NewAHandlerName -- создать новое имя функции обработчика.
+//
+//go:fix inline
+func NewAHandlerName(val string) *AHandlerName {
+	return handler_name.NewAHandlerName(val)
+}
+
+// AStoreKey -- ключ хранилища.
+type AStoreKey = store_key.AStoreKey
+
+// NewAStoreKey -- создать новый ключ хранилища.
+//
+//go:fix inline
+func NewAStoreKey(val string) *AStoreKey {
+	return store_key.NewAStoreKey(val)
+}
+
+// AModuleName -- уникальное имя модуля.
+type AModuleName = module_name.AModuleName
+
+// NewAModuleName -- создать новое уникальное имя модуля.
+//
+//go:fix inline
+func NewAModuleName(val string) *AModuleName {
+	return module_name.NewAModuleName(val)
+}

+ 1 - 1
v4/lev0/kalias/kalias_test.go → v4/lev0/alias/alias_test.go

@@ -1,4 +1,4 @@
-package kalias
+package alias
 
 import (
 	"testing"

+ 73 - 0
v4/lev0/alias/atime/atime.go

@@ -0,0 +1,73 @@
+package atime
+
+import (
+	"time"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+)
+
+// ATime -- метка времени.
+// Вывод: "2006-01-02 15:04:05.000 -07 MST".
+type ATime struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// FnOptAtime -- тп функции опции времени для установки значения.
+type FnOptAtime func() string
+
+// OptAtime -- функция для установки значения.
+func OptAtime(val string) FnOptAtime {
+	return func() string {
+		return val
+	}
+}
+
+// NewATime -- создает новый экземпляр ATime.
+func NewATime(lstFn ...FnOptAtime) *ATime {
+	var val string
+	for _, fn := range lstFn {
+		val = fn()
+	}
+	if val == "" {
+		val = time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
+	}
+	qStr := quark.NewQStr(val)
+	return &ATime{
+		val: qStr,
+	}
+}
+
+// String -- возвращает строку.
+//
+//go:fix inline
+func (a *ATime) String() string {
+	return a.val.Val().Get()
+}
+
+// Get -- возвращает строку.
+//
+//go:fix inline
+func (a *ATime) Get() string {
+	return a.val.Val().Get()
+}
+
+// ATimeMut -- метка времени.
+// Вывод: "2006-01-02 15:04:05.000 -07 MST".
+type ATimeMut struct {
+	val *quark.QStr[quark.Mut]
+}
+
+// NewATimeMut -- создает новый экземпляр ATimeMut.
+func NewATimeMut(lstFn ...FnOptAtime) *ATimeMut {
+	var val string
+	for _, fn := range lstFn {
+		val = fn()
+	}
+	if val == "" {
+		val = time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
+	}
+	qStr := quark.NewQStrMut(val)
+	return &ATimeMut{
+		val: qStr,
+	}
+}

+ 23 - 0
v4/lev0/alias/atime/atime_test.go

@@ -0,0 +1,23 @@
+package atime
+
+import (
+	"testing"
+)
+
+type testTime struct {
+	t *testing.T
+}
+
+func TestATime(t *testing.T) {
+	sf := &testTime{
+		t: t,
+	}
+	sf.get()
+}
+
+// Получение времени
+func (t *testTime) get() {
+	a := NewATime()
+	_ = a.String()
+	_ = a.Get()
+}

+ 34 - 0
v4/lev0/alias/handler_name/handler_name.go

@@ -0,0 +1,34 @@
+// package handler_name -- имя функции обработчика
+package handler_name
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+)
+
+// AHandlerName -- имя функции обработчика.
+type AHandlerName struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// NewAHandlerName -- создать новое имя функции обработчика.
+func NewAHandlerName(val string) *AHandlerName {
+	helpers.Assert(val != "", "NewAHandlerName: val is empty")
+	return &AHandlerName{
+		val: quark.NewQStr(val),
+	}
+}
+
+// String -- строковое представление.
+//
+//go:fix inline
+func (sf *AHandlerName) String() string {
+	return sf.val.Get()
+}
+
+// Get -- получить значение.
+//
+//go:fix inline
+func (sf *AHandlerName) Get() string {
+	return sf.val.Get()
+}

+ 36 - 0
v4/lev0/alias/module_name/module_name.go

@@ -0,0 +1,36 @@
+// package module_name -- имя модуля
+package module_name
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+)
+
+// AModuleName -- уникальное имя модуля.
+type AModuleName struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// NewAModuleName -- создать новое имя модуля.
+//
+//go:fix inline
+func NewAModuleName(val string) *AModuleName {
+	helpers.Hassert(val != "", "NewAModuleName(): val is empty")
+	return &AModuleName{
+		val: quark.NewQStr(val),
+	}
+}
+
+// String -- строковое представление.
+//
+//go:fix inline
+func (a *AModuleName) String() string {
+	return a.val.Get()
+}
+
+// Get -- получить строковое представление.
+//
+//go:fix inline
+func (a *AModuleName) Get() string {
+	return a.val.Get()
+}

+ 32 - 0
v4/lev0/alias/store_key/store_key.go

@@ -0,0 +1,32 @@
+// package store_key -- ключ хранилища
+package store_key
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+)
+
+// AStoreKey -- ключ хранилища.
+type AStoreKey struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// NewAStoreKey -- создать новый ключ хранилища.
+func NewAStoreKey(val string) *AStoreKey {
+	helpers.Hassert(val != "", "NewAStoreKey(): val is empty")
+	return &AStoreKey{val: quark.NewQStr(val)}
+}
+
+// String -- строковое представление.
+//
+//go:fix inline
+func (a *AStoreKey) String() string {
+	return a.val.Get()
+}
+
+// Get -- получить значение.
+//
+//go:fix inline
+func (a *AStoreKey) Get() string {
+	return a.val.Get()
+}

+ 35 - 0
v4/lev0/alias/stream_name/stream_name.go

@@ -0,0 +1,35 @@
+package stream_name
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_str"
+)
+
+// AStreamName -- имя потока для ожидания.
+type AStreamName struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// NewAStreamName -- создать новое имя потока.
+func NewAStreamName(val string) *AStreamName {
+	helpers.Hassert(val != "", "NewAStreamName(): val is empty")
+	sf := &AStreamName{
+		val: quark_str.NewQStr(val),
+	}
+	return sf
+}
+
+// String -- строковое представление.
+//
+//go:fix inline
+func (sf *AStreamName) String() string {
+	return sf.val.Get()
+}
+
+// Get -- получить значение.
+//
+//go:fix inline
+func (sf *AStreamName) Get() string {
+	return sf.val.Get()
+}

+ 34 - 0
v4/lev0/alias/topic/topic.go

@@ -0,0 +1,34 @@
+package topic
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+)
+
+// ATopic -- имя топика в шине.
+type ATopic struct {
+	val *quark.QStr[quark.Fix]
+}
+
+// NewATopic -- создает новый топик.
+func NewATopic(val string) *ATopic {
+	helpers.Hassert(val != "", "NewTopic(): val is empty")
+	sf := &ATopic{
+		val: quark.NewQStr(val),
+	}
+	return sf
+}
+
+// String -- строковое представление топика.
+//
+//go:fix inline
+func (sf *ATopic) String() string {
+	return sf.val.Get()
+}
+
+// Get -- получить строковое представление топика.
+//
+//go:fix inline
+func (sf *ATopic) Get() string {
+	return sf.val.Get()
+}

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

@@ -8,8 +8,6 @@ import (
 	"log"
 	"os"
 	"time"
-
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 )
 
 var (
@@ -48,12 +46,6 @@ func Hassert(isCond bool, msgFormat string, args ...any) {
 	panic(msg)
 }
 
-// TimeNowStr -- возвращает стандартную строку локального сейчас-времени "2006-01-02 15:04:05.000 -07 MST".
-func TimeNowStr() mKa.ATime {
-	strTime := time.Now().Local().Format("2006-01-02 15:04:05.000 -07 MST")
-	return mKa.ATime(strTime)
-}
-
 // TimeNow -- возвращает локальное Unix сейчас-время (мсек, не зависит от положения).
 func TimeNow() int64 {
 	timeNow := time.Now().Local().UnixMilli()

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

@@ -80,9 +80,6 @@ func (sf *tester) hassert() {
 	sf.hassertLocal()
 	sf.hassertProd()
 	sf.hassertProdGood1()
-	if strTime := TimeNowStr(); strTime == "" {
-		sf.t.Fatalf("hassert(): strTime==''")
-	}
 	if unixTime := TimeNow(); unixTime == 0 {
 		sf.t.Fatalf("hassert(): unixTime==0")
 	}
@@ -138,7 +135,7 @@ func (sf *tester) assertProdGood1() {
 	Assert(true, "tra-la-la")
 }
 
-// Мягкая мягка проверка (на проде).
+// Мягкая проверка (на проде).
 func (sf *tester) assertProd() {
 	sf.t.Log("assertProd")
 	err := os.Setenv("STAGE", "prod")

+ 0 - 22
v4/lev0/kalias/kalias.go

@@ -1,22 +0,0 @@
-// package kalias -- алиасы типов ядра.
-package kalias
-
-// ATime -- метка времени.
-//
-// Вывод: "2006-01-02 15:04:05.000 -07 MST".
-type ATime string
-
-// AStreamName -- имя потока для ожидания.
-type AStreamName string
-
-// ATopic -- имя топика в шине.
-type ATopic string
-
-// AHandlerName -- имя функции обработчика.
-type AHandlerName string
-
-// AModuleName -- уникальное имя модуля.
-type AModuleName string
-
-// AKey -- ключ.
-type AKey string

+ 5 - 1
v4/lev0/ktypes/ibucket_base.go

@@ -1,9 +1,13 @@
 package ktypes
 
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+)
+
 // IBucketBase -- интерфейс базового бакета хранилища KV.
 type IBucketBase interface {
 	// Name -- имя бакета
-	Name() string
+	Name() alias.ABucketName
 	// Level -- уровень бакета
 	Level() int
 	// Number -- номер бакета

+ 7 - 4
v4/lev0/ktypes/idict_kv.go

@@ -1,15 +1,18 @@
 package ktypes
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+import (
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+)
 
 // IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
 type IDictRec interface {
 	// Get -- возвращает значение по ключу
-	Get(key kalias.AKey) IOption[IRecKv]
+	Get(key *alias.AStoreKey) *mL0.Option[IRecKv]
 	// Set -- устанавливает значение по ключу
-	Set(val IRecKv) IResult[bool]
+	Set(val IRecKv) *mL0.Result[bool]
 	// Del -- удаляет значение по ключу
-	Del(key kalias.AKey)
+	Del(key *alias.AStoreKey)
 	// Len -- возвращает количество записей
 	Len() int
 }

+ 14 - 13
v4/lev0/ktypes/ikernel_bus.go

@@ -1,15 +1,16 @@
 package ktypes
 
 import (
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // IBusBaseHandler -- базовый обработчик обратного вызова.
 type IBusBaseHandler interface {
 	// Topic -- топик подписки обработчика
-	Topic() mKa.ATopic
+	Topic() *mKa.ATopic
 	// Name -- уникальное имя обработчика
-	Name() mKa.AHandlerName
+	Name() *mKa.AHandlerName
 }
 
 // IBusHandlerSubscribe -- объект обработчика подписки.
@@ -23,13 +24,13 @@ type IBusHandlerSubscribe interface {
 type IBusHandlerServe interface {
 	IBusBaseHandler
 	// FnBack -- функция обратного вызова
-	FnBack(binReq []byte) IResult[[]byte]
+	FnBack(binReq []byte) *mRes.Result[[]byte]
 }
 
 // IDictSubHook -- словарь обработчиков по единственному топику.
 type IDictSubHook interface {
 	// Subscribe -- подписывает обработчик
-	Subscribe(IBusHandlerSubscribe) IResult[bool]
+	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
 	// Read -- все локальные обработчики читают сообщение по его приходу
 	Read(binMsg []byte)
 	// Unsubscribe -- отписывает обработчик
@@ -41,9 +42,9 @@ type IDictSubHook interface {
 //	При подписке потребителей топика может быть НЕСКОЛЬКО на КАЖДЫЙ топик.
 type IDictTopicSub interface {
 	// Subscribe -- подписывает подписчиков на любой из топиков
-	Subscribe(IBusHandlerSubscribe) IResult[bool]
+	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
 	// Read -- читает сообщение для всех обработчиков подписки по приходу на любой из топиков
-	Read(topic mKa.ATopic, binMsg []byte)
+	Read(topic *mKa.ATopic, binMsg []byte)
 	// Unsubscribe -- отписывает подписчиков от любого из топиков
 	Unsubscribe(IBusHandlerSubscribe)
 }
@@ -54,9 +55,9 @@ type IDictTopicSub interface {
 // Но обработчик вызывается конкурентно.
 type IDictTopicServe interface {
 	// Register -- регистрирует единственный обработчик на единственный топик
-	Register(IBusHandlerServe) IResult[bool]
+	Register(IBusHandlerServe) *mRes.Result[bool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic mKa.ATopic, binReq []byte) IResult[[]byte]
+	SendRequest(topic *mKa.ATopic, binReq []byte) *mRes.Result[[]byte]
 	// Unregister -- удаляет единственный обработчик с единственного топика
 	Unregister(IBusHandlerServe)
 }
@@ -67,16 +68,16 @@ type IDictTopicServe interface {
 //	Подписка и обслуживание входящих запросов требует _обработчиков_.
 type IKernelBus interface {
 	// Publish -- публикует сообщение в шину
-	Publish(topic mKa.ATopic, binMsg []byte) IResult[bool]
+	Publish(topic *mKa.ATopic, binMsg []byte) *mRes.Result[bool]
 	// SendRequest -- выполняет запрос по указанному топику
-	SendRequest(topic mKa.ATopic, binReq []byte) IResult[[]byte]
+	SendRequest(topic *mKa.ATopic, binReq []byte) *mRes.Result[[]byte]
 
 	// Subscribe -- подписывает обработчик на топик
-	Subscribe(IBusHandlerSubscribe) IResult[bool]
+	Subscribe(IBusHandlerSubscribe) *mRes.Result[bool]
 	// Unsubscribe -- отписывается от топика
 	Unsubscribe(IBusHandlerSubscribe)
 	// RegisterServe -- Регистрирует обработчик на обслуживание входящих запросов
-	RegisterServe(IBusHandlerServe) IResult[bool]
+	RegisterServe(IBusHandlerServe) *mRes.Result[bool]
 
 	// IsWork -- возвращает признак работы шины
 	IsWork() bool

+ 5 - 3
v4/lev0/ktypes/ikernel_int.go

@@ -1,5 +1,7 @@
 package ktypes
 
+import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+
 // Int -- целочисленный тип ядра.
 type Int interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -13,11 +15,11 @@ type Int interface {
 	// Dec -- уменьшает число на 1
 	Dec()
 	// FromStr -- устанавливает значение из строки
-	FromStr(string) IResult[int]
+	FromStr(string) *mRes.Result[int]
 	// ToStr -- возвращает как строку
 	ToStr() string
 	// FromByte -- устанавливает значение из байтов
-	FromByte([]byte) IResult[int]
+	FromByte([]byte) *mRes.Result[int]
 	// ToByte -- возвращает как срез байт
 	ToByte() []byte
 	// FromBool -- устанавливает значение из булева
@@ -25,5 +27,5 @@ type Int interface {
 	// ToBool -- возвращает как булево значение
 	ToBool() bool
 	// Getenv -- устанавливает значение из окружения
-	Getenv(string) IResult[int]
+	Getenv(string) *mRes.Result[int]
 }

+ 2 - 2
v4/lev0/ktypes/ikernel_module.go

@@ -1,7 +1,7 @@
 package ktypes
 
 import (
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 // IKernelModule -- интерфейс к модулю на основе ядра.
@@ -11,7 +11,7 @@ type IKernelModule interface {
 	// IsWork -- возвращает состояние модуля
 	IsWork() bool
 	// Name -- возвращает уникальное имя модуля
-	Name() mKa.AModuleName
+	Name() *mKa.AModuleName
 	// Ctx -- возвращает контекст модуля
 	Ctx() ILocalCtx
 	// Log -- возвращает буферный лог модуля

+ 3 - 1
v4/lev0/ktypes/ikernel_monolit.go

@@ -1,5 +1,7 @@
 package ktypes
 
+import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+
 // IKernelMonolit -- интерфейс к монолиту на основе ядра.
 type IKernelMonolit interface {
 	// Name -- возвращает имя монолита
@@ -13,7 +15,7 @@ type IKernelMonolit interface {
 	// Wait -- ожидание окончания работы
 	Wait()
 	// Add -- добавляет модуль в монолит
-	Add(IKernelModule) IResult[bool]
+	Add(IKernelModule) *mRes.Result[bool]
 	// Log -- возвращает лог монолита
 	Log() ILogBuf
 	// Ctx -- возвращает контекст монолита

+ 1 - 1
v4/lev0/ktypes/ikernel_server_http.go

@@ -1,6 +1,6 @@
 package ktypes
 
-import "github.com/gofiber/fiber/v2"
+import "github.com/gofiber/fiber/v3"
 
 // IKernelServerHttp -- интерфейс к серверу HTTP в ядре.
 type IKernelServerHttp interface {

+ 6 - 4
v4/lev0/ktypes/ikernel_store_kv.go

@@ -1,15 +1,17 @@
 package ktypes
 
+import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+
 // IKernelStoreKv -- интерфейс к локальному быстрому key-value хранилищу ядра.
 type IKernelStoreKv interface {
 	// Get -- возвращает значение по ключу
-	Get(key string) IResult[[]byte]
+	Get(key string) *mRes.Result[[]byte]
 	// ByPrefix -- возвращает список ключей по префиксу
-	ByPrefix(prefix string) IResult[[]string]
+	ByPrefix(prefix string) *mRes.Result[[]string]
 	// Set -- устанавливает значение по ключу
-	Set(key string, val []byte) IResult[bool]
+	Set(key string, val []byte) *mRes.Result[bool]
 	// Delete -- удаляет значение по ключу
-	Delete(key string) IResult[bool]
+	Delete(key string) *mRes.Result[bool]
 	// Log -- возвращает локальный лог
 	Log() ILogBuf
 }

+ 5 - 4
v4/lev0/ktypes/ikernel_wg.go

@@ -1,21 +1,22 @@
 package ktypes
 
 import (
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // IKernelWg -- интерфейс к именованному ожидателю потоков.
 type IKernelWg interface {
 	// Add -- добавляет имя потока в ожидатель потоков
-	Add(mKa.AStreamName) IResult[bool]
+	Add(*alias.AStreamName) *mRes.Result[bool]
 	// Done -- удаляет имя потока из ожидания
-	Done(mKa.AStreamName)
+	Done(*alias.AStreamName)
 	// Wait -- ожидает завершения работы всех потоков
 	Wait()
 	// IsWork -- признак работы ожидателя потоков (после закрытия добавлять нельзя)
 	IsWork() bool
 	// List -- возвращает список имён потоков на ожидании
-	List() []mKa.AStreamName
+	List() []*alias.AStreamName
 	// Len -- возвращает размер списка потоков ожидания
 	Len() int
 	// Log -- возвращает логгер ожидателя групп

+ 7 - 5
v4/lev0/ktypes/ilocal_ctx.go

@@ -3,7 +3,9 @@ package ktypes
 import (
 	"context"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // ICtxValue -- интерфейс к значению локального контекста.
@@ -14,9 +16,9 @@ type ICtxValue interface {
 	// Val -- возвращает хранимое значение
 	Val() any
 	// CreateAt -- возвращает метку времени создания
-	CreateAt() mKa.ATime
+	CreateAt() *mKa.ATime
 	// UpdateAt -- возвращает метку времени обновления
-	UpdateAt() mKa.ATime
+	UpdateAt() *mKa.ATime
 	// Comment -- возвращает комментарий значения
 	Comment() string
 }
@@ -25,11 +27,11 @@ type ICtxValue interface {
 type ILocalCtx interface {
 	IRWMutex
 	// Get -- извлекает значение из контекста
-	Get(key string) IOption[ICtxValue]
+	Get(key string) *option.Option[ICtxValue]
 	// Del -- удаляет значение из контекста
 	Del(key string)
 	// Set -- добавляет значение в контекст
-	Set(key string, val any, comment string) IResult[bool]
+	Set(key string, val any, comment string) *mRes.Result[bool]
 	// Size -- возвращает размер словаря контекста
 	Size() int
 	// SortedList -- возвращает сортированный список объектов контекста

+ 7 - 5
v4/lev0/ktypes/ilog_buf.go

@@ -1,17 +1,19 @@
 package ktypes
 
 import (
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
 )
 
 // ILogMsg -- сообщение лога.
 type ILogMsg interface {
 	// CreateAt -- когда создано
-	CreateAt() mKa.ATime
+	CreateAt() *alias.ATime
 	// Level -- уровень сообщения
-	Level() string
+	Level() *quark.QStr[quark.Mut]
 	// Msg -- текст сообщения
-	Msg() string
+	Msg() *quark.QStr[quark.Fix]
 	// String -- форматированная строка
 	String() string
 }
@@ -19,7 +21,7 @@ type ILogMsg interface {
 // ILogBus -- публикует в топики логи.
 type ILogBus interface {
 	// DebugAdd -- добавляет топик для отладочного сообщения
-	DebugAdd(topic mKa.ATopic, bus IBusClient) IResult[bool]
+	DebugAdd(topic alias.ATopic, bus IBusClient) *mRes.Result[bool]
 }
 
 // ILogBuf -- буферизованный лог для диагностики.

+ 0 - 19
v4/lev0/ktypes/ioption.go

@@ -1,19 +0,0 @@
-package ktypes
-
-// IOption -- интерфейс опции.
-type IOption[T any] interface {
-	// IsVal - проверяет, есть ли значение
-	IsVal() bool
-	// IsSome - проверяет, есть ли значение
-	IsNone() bool
-	// Val - извлекает значение (паника, если None)
-	Val() T
-	// ValOr - возвращает значение или дефолтное
-	ValOr(defaultValue T) T
-	// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции
-	ValOrFn(fn func() T) T
-	// Hassert -- проверяет, что не пустое значение (с паникой)
-	Hassert(msgFormat string, args ...any) T
-	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
-	Assert(msgFormat string, args ...any) T
-}

+ 4 - 4
v4/lev0/ktypes/irec_meta.go

@@ -1,17 +1,17 @@
 package ktypes
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 
 // IRecMeta -- интерфейс мета-информации записи KV-хранилища.
 type IRecMeta interface {
 	// Key -- ключ записи
-	Key() kalias.AKey
+	Key() *alias.AStoreKey
 	// Vers -- версия записи
 	Vers() int64
 	// Operation -- тип операции над записью
 	Operation() string
 	// CreatedAt -- дата создания записи
-	CreatedAt() kalias.ATime
+	CreatedAt() *alias.ATime
 	// UpdateAt -- дата последнего обновления
-	UpdateAt() kalias.ATime
+	UpdateAt() *alias.ATime
 }

+ 2 - 2
v4/lev0/ktypes/irec_val.go

@@ -1,11 +1,11 @@
 package ktypes
 
-import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+import "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 
 // IRecVal -- значение записи.
 type IRecVal interface {
 	// Key -- возвращает ключ
-	Key() kalias.AKey
+	Key() *alias.AStoreKey
 	// Val -- возвращает значение
 	Val() []byte
 }

+ 0 - 23
v4/lev0/ktypes/iresult.go

@@ -1,23 +0,0 @@
-package ktypes
-
-// IResult -- интерфейс результата.
-type IResult[T any] interface {
-	// IsOk -- возвращает true, если Result содержит значение
-	IsOk() bool
-	// IsErr -- возвращает true, если Result содержит ошибку
-	IsErr() bool
-	// Val -- возвращает значение, если оно есть, иначе паникует
-	Val() T
-	// ValOr -- возвращает значение, если оно есть, или значение по умолчанию
-	ValOr(defaultValue T) T
-	// ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции
-	ValOrFn(fn func() T) T
-	// Err -- возвращает ошибку, если она есть
-	Err() error
-	// Error -- возвращает строковое представление ошибки, если она есть
-	Error() string
-	// Hassert -- проверяет, что нет ошибки (с паникой)
-	Hassert(msgFormat string, args ...any) T
-	// Assert -- проверяет, что нет ошибки (с паникой только на локальном стенде)
-	Assert(msgFormat string, args ...any) T
-}

+ 6 - 2
v4/lev0/ktypes/isafe_bool.go

@@ -1,5 +1,9 @@
 package ktypes
 
+import (
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
 // ISafeBool -- интерфейс к потокобезопасной переменной.
 type ISafeBool interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -9,7 +13,7 @@ type ISafeBool interface {
 	// Reset -- сбрасывает хранимое потокобезопасное значение
 	Reset()
 	// FromStr -- устанавливает значение из строки
-	FromStr(string) IResult[bool]
+	FromStr(string) *mRes.Result[bool]
 	// Getenv -- устанавливает значение из окружения
-	Getenv(string) IResult[bool]
+	Getenv(string) *mRes.Result[bool]
 }

+ 3 - 1
v4/lev0/ktypes/isafe_bool_react.go

@@ -1,10 +1,12 @@
 package ktypes
 
+import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+
 // ISafeBoolReact -- реактивный потокобезопасный булевый признак.
 type ISafeBoolReact interface {
 	ISafeBool
 	// Add -- добавляет функцию обратного вызова
-	Add(key string, fn func(bool)) IResult[bool]
+	Add(key string, fn func(bool)) *mRes.Result[bool]
 	// Delete -- удаляет функцию обратного вызова по ключу
 	Delete(key string)
 }

+ 3 - 1
v4/lev0/ktypes/isafe_string.go

@@ -1,5 +1,7 @@
 package ktypes
 
+import mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+
 // ISafeString -- интерфейс к потокобезопасной переменной.
 type ISafeString interface {
 	// Get -- возвращает хранимое значение потокобезопасной переменной
@@ -11,5 +13,5 @@ type ISafeString interface {
 	// Byte -- возвращает байтовое представление строки
 	Byte() []byte
 	// Getenv -- устанавливает строку из переменной окружения
-	Getenv(string) IResult[string]
+	Getenv(string) *mRes.Result[string]
 }

+ 49 - 0
v4/lev0/lev0.go

@@ -0,0 +1,49 @@
+// package lev0 -- сущности уровня 0
+package lev0
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/option"
+	mRes "gitp78su.ipnodns.ru/svi/kern/v4/lev0/result"
+)
+
+// Result — обёртка вокруг результата с возможной ошибкой.
+type Result[T any] = mRes.Result[T]
+
+// NewRes -- возвращает успешный Result с значением.
+func NewRes[T any](res T) *Result[T] {
+	return mRes.NewRes(res)
+}
+
+// NewErr -- возвращает Result с ошибкой.
+func NewErr[T any](err error) *Result[T] {
+	return mRes.NewErr[T](err)
+}
+
+// WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
+func WrapErr[T any](res *Result[T], err error) *Result[T] {
+	return mRes.WrapErr(res, err)
+}
+
+// Option — обёртка вокруг результата с возможной пустотой.
+type Option[T any] = option.Option[T]
+
+// NewOpt -- возвращает новый не пустой результат операции.
+func NewOpt[T any](some T) *Option[T] {
+	return option.NewOpt(some)
+}
+
+// NewNone -- возвращает новый пустой результат операции.
+func NewNone[T any]() *option.Option[T] {
+	return option.NewNone[T]()
+}
+
+// Hassert -- проверка на правильность утверждения с безусловным падением в панику (hard assert).
+func Hassert(isCond bool, msgFormat string, args ...any) {
+	helpers.Hassert(isCond, msgFormat, args)
+}
+
+// Assert -- проверка на правильность утверждения с падением в панику на локальном стенде (soft assert).
+func Assert(isCond bool, msgFormat string, args ...any) {
+	helpers.Assert(isCond, msgFormat, args)
+}

+ 1 - 3
v4/lev1/option/option.go → v4/lev0/option/option.go

@@ -4,7 +4,6 @@ import (
 	"reflect"
 
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // Option -- результат возможно содержащий nil.
@@ -21,12 +20,11 @@ func NewOpt[T any](value T) *Option[T] {
 		Hassert(!v.IsNil(), "NewSome[T any](): value==nil")
 	}
 	sf := &Option[T]{val: &value}
-	_ = IOption[T](sf)
 	return sf
 }
 
 // NewNone - нет результата в ответе.
-func NewNone[T any]() IOption[T] {
+func NewNone[T any]() *Option[T] {
 	return &Option[T]{
 		val: nil,
 	}

+ 3 - 5
v4/lev1/option/option_test.go → v4/lev0/option/option_test.go

@@ -2,8 +2,6 @@ package option
 
 import (
 	"testing"
-
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type testerOption struct {
@@ -54,7 +52,7 @@ func (sf *testerOption) createNoneGood1() {
 	sf.assert(opt)
 }
 
-func (sf *testerOption) assert(res IOption[string]) {
+func (sf *testerOption) assert(res *Option[string]) {
 	sf.t.Log("assert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -64,7 +62,7 @@ func (sf *testerOption) assert(res IOption[string]) {
 	res.Hassert("test assert")
 }
 
-func (sf *testerOption) hassert(res IOption[string]) {
+func (sf *testerOption) hassert(res *Option[string]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -74,7 +72,7 @@ func (sf *testerOption) hassert(res IOption[string]) {
 	res.Hassert("test hassert")
 }
 
-func (sf *testerOption) unwrapErr(res IOption[string]) {
+func (sf *testerOption) unwrapErr(res *Option[string]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {

+ 30 - 0
v4/lev0/quark/quark.go

@@ -0,0 +1,30 @@
+// package quark -- кварки ядра
+package quark
+
+import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_str"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
+)
+
+// Fix -- фиксированное значение
+type Fix = quark_val.Fix
+
+// Mut -- мутабельное значение
+type Mut = quark_val.Mut
+
+// CMod -- ограничитель модификации
+type CMod = quark_val.CMod
+
+type QStr[M CMod] = quark_str.QStr[M]
+
+// NewQStr -- создает новый экземпляр QStr
+func NewQStr(val string) *QStr[Fix] {
+	val_ := quark_str.NewQStr(val)
+	return val_
+}
+
+// NewQStrMut -- создает новый экземпляр QStrMut
+func NewQStrMut(val string) *QStr[Mut] {
+	val_ := quark_str.NewQStrMut(val)
+	return val_
+}

+ 21 - 9
v4/lev0/quark/quark_base/quark_base.go

@@ -2,14 +2,16 @@
 package quark_base
 
 import (
-	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	// mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	"fmt"
+
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 )
 
 // QBase -- базовый кварк.
 type QBase[M quark_val.CMod, T any] struct {
-	mass int                    // Масса кварка
-	val  *quark_val.Field[M, T] // хранимое значение
+	mass int                  // Масса кварка
+	val  *quark_val.Val[M, T] // хранимое значение
 }
 
 // QBaseOpt -- опции для базового кварка.
@@ -25,14 +27,14 @@ func QBaseOptMass[M quark_val.CMod, T any](mass int) QBaseOpt[M, T] {
 // QBaseOptVal -- опция для значения кварка.
 func QBaseOptVal[M quark_val.Fix, T any](val T) QBaseOpt[quark_val.Fix, T] {
 	return func(qBase *QBase[quark_val.Fix, T]) {
-		qBase.val = quark_val.NewField(val)
+		qBase.val = quark_val.NewVal(val)
 	}
 }
 
 // QBaseOptValMut -- опция для изменяемого значения кварка.
 func QBaseOptValMut[M quark_val.Mut, T any](val T) QBaseOpt[quark_val.Mut, T] {
 	return func(sf *QBase[quark_val.Mut, T]) {
-		sf.val = quark_val.NewFieldMut(val)
+		sf.val = quark_val.NewValMut(val)
 	}
 }
 
@@ -42,8 +44,12 @@ func NewQBase[M quark_val.Fix, T any](opts ...QBaseOpt[M, T]) *QBase[M, T] {
 	for _, opt := range opts {
 		opt(sf)
 	}
-	mKh.Hassert(sf.mass > 0, "NewQBase(): нулевая масса запрещена!")
-	mKh.Hassert(sf.val != nil, "NewQBase(): значение не создано")
+	if sf.mass <= 0 {
+		panic(fmt.Sprintf("NewQBase(): нулевая масса запрещена! mass=%v\n", sf.mass))
+	}
+	if sf.val == nil {
+		panic("NewQBase(): значение не создано! val==nil\n")
+	}
 	return sf
 }
 
@@ -53,16 +59,22 @@ func NewQBaseMut[M quark_val.Mut, T any](opts ...QBaseOpt[M, T]) *QBase[M, T] {
 	for _, opt := range opts {
 		opt(sf)
 	}
-	mKh.Hassert(sf.mass > 0, "NewQBase(): нулевая масса запрещена!")
+	if sf.mass <= 0 {
+		panic("NewQBaseMut(): нулевая масса запрещена!\n")
+	}
 	return sf
 }
 
 // Mass -- получить массу кварка.
+//
+//go:fix inline
 func (sf *QBase[M, T]) Mass() int {
 	return sf.mass
 }
 
 // Val -- возвращает хранимое значение.
-func (sf *QBase[M, T]) Val() *quark_val.Field[M, T] {
+//
+//go:fix inline
+func (sf *QBase[M, T]) Val() *quark_val.Val[M, T] {
 	return sf.val
 }

+ 4 - 0
v4/lev0/quark/quark_bool/quark_bool.go

@@ -32,11 +32,15 @@ func NewQBoolMut(val bool) *QBool[quark_val.Mut] {
 }
 
 // Get -- Возвращает хранимое значение.
+//
+//go:fix inline
 func (sf *QBool[M]) Get() bool {
 	return sf.Val().Get()
 }
 
 // Set -- устанавливает хранимое значение.
+//
+//go:fix inline
 func Set(sf *QBool[quark_val.Mut], val bool) {
 	quark_val.Set(sf.Val(), val)
 }

+ 12 - 0
v4/lev0/quark/quark_byte/quark_byte.go

@@ -36,32 +36,44 @@ func NewQByteMut(val byte) *QByte[quark_val.Mut] {
 }
 
 // Get -- получить значение.
+//
+//go:fix inline
 func (sf *QByte[T]) Get() byte {
 	return sf.Val().Get()
 }
 
 // Set -- установить значение.
+//
+//go:fix inline
 func Set(sf *QByte[quark_val.Mut], val byte) {
 	quark_val.Set(sf.Val(), val)
 }
 
 // ToInt -- представить значение как int.
+//
+//go:fix inline
 func (sf *QByte[T]) ToInt() int {
 	return int(sf.Val().Get())
 }
 
 // ToStr -- представить значение как строку из одного байта.
+//
+//go:fix inline
 func (sf *QByte[T]) ToStr() string {
 	return fmt.Sprint(sf.Val().Get())
 }
 
 // FromInt -- установить значение из int.
+//
+//go:fix inline
 func FromInt(sf *QByte[quark_val.Mut], v int) {
 	mKh.Hassert(v >= 0 && v <= 255, "QByte.FromInt(): значение вне диапазона байта")
 	quark_val.Set(sf.Val(), byte(v))
 }
 
 // FromStr -- установить значение из строки (как из целого числа).
+//
+//go:fix inline
 func FromStr(sf *QByte[quark_val.Mut], s string) {
 	// Конвертируем строку в int и используем FromInt для всех проверок
 	v, err := strconv.Atoi(s)

+ 6 - 0
v4/lev0/quark/quark_float/quark_float.go

@@ -36,16 +36,20 @@ func NewQFloatMut(val float64) *QFloat[quark_val.Mut] {
 }
 
 // Get -- возвращает хранимое значение.
+// /go:fix inline
 func (sf *QFloat[M]) Get() float64 {
 	return sf.Val().Get()
 }
 
 // Set -- устанавливает хранимое значение.
+// /go:fix inline
 func Set(sf *QFloat[quark_val.Mut], val float64) {
 	quark_val.Set(sf.Val(), val)
 }
 
 // FromStr -- устанавливает из строки.
+//
+//go:fix inline
 func FromStr(sf *QFloat[quark_val.Mut], str string) {
 	fVal, err := strconv.ParseFloat(str, 64)
 	mKh.Hassert(err == nil, "QFloat.FromStr(): str=%q, err=\n\t%v", str, err)
@@ -53,6 +57,8 @@ func FromStr(sf *QFloat[quark_val.Mut], str string) {
 }
 
 // ToStr -- конвертирует в строку.
+//
+//go:fix inline
 func (sf *QFloat[M]) ToStr() string {
 	return fmt.Sprint(sf.Get())
 }

+ 6 - 0
v4/lev0/quark/quark_int/quark_int.go

@@ -35,16 +35,22 @@ func NewQIntMut(v int) *QInt[quark_val.Mut] {
 }
 
 // Get -- возвращает хранимое значение.
+//
+//go:fix inline
 func (sf *QInt[M]) Get() int {
 	return sf.Val().Get()
 }
 
 // Set -- установить значение.
+//
+//go:fix inline
 func Set(sf *QInt[quark_val.Mut], v int) {
 	quark_val.Set(sf.Val(), v)
 }
 
 // FromStr -- установить значение из строки.
+//
+//go:fix inline
 func FromStr(sf *QInt[quark_val.Mut], s string) {
 	iVal, err := strconv.Atoi(s)
 	mKh.Hassert(err == nil, "QInt.FromStr(): не удалось преобразовать строку(%v) в int, err=\n\t%v",

+ 4 - 0
v4/lev0/quark/quark_str/quark_str.go

@@ -32,11 +32,15 @@ func NewQStrMut(val string) *QStr[quark_val.Mut] {
 }
 
 // Get -- возвращает хранимое значение.
+//
+//go:fix inline
 func (sf *QStr[M]) Get() string {
 	return sf.Val().Get()
 }
 
 // Set -- устанавливает хранимое значение.
+//
+//go:fix inline
 func Set(sf *QStr[quark_val.Mut], val string) {
 	quark_val.Set(sf.Val(), val)
 }

+ 15 - 11
v4/lev0/quark/quark_val/quark_val.go

@@ -12,33 +12,37 @@ type CMod interface {
 	Fix | Mut
 }
 
-// Field -- кварк поля.
-type Field[M CMod, T any] struct {
+// Val -- кварк поля.
+type Val[M CMod, T any] struct {
 	val T // Значение поля
 }
 
-// NewField -- возвращает новое фиксированное значение.
-func NewField[T any](val T) *Field[Fix, T] {
-	sf := &Field[Fix, T]{
+// NewVal -- возвращает новое фиксированное значение.
+func NewVal[T any](val T) *Val[Fix, T] {
+	sf := &Val[Fix, T]{
 		val: val,
 	}
 	return sf
 }
 
-// NewFieldMut -- возвращает новое мутабельное значение.
-func NewFieldMut[T any](val T) *Field[Mut, T] {
-	sf := &Field[Mut, T]{
+// NewValMut -- возвращает новое мутабельное значение.
+func NewValMut[T any](val T) *Val[Mut, T] {
+	sf := &Val[Mut, T]{
 		val: val,
 	}
 	return sf
 }
 
-// Получить значение поля.
-func (sf *Field[M, T]) Get() T {
+// Get -- получить значение поля.
+//
+//go:fix inline
+func (sf *Val[M, T]) Get() T {
 	return sf.val
 }
 
 // Set -- установить мутабельное значение.
-func Set[T any](sf *Field[Mut, T], val T) {
+//
+//go:fix inline
+func Set[T any](sf *Val[Mut, T], val T) {
 	sf.val = val
 }

+ 2 - 2
v4/lev0/quark/quark_val/quark_val_test.go

@@ -17,7 +17,7 @@ func TestQuarkVal(t *testing.T) {
 // Создание нового мутабельного значения.
 func (sf *tester) newMut() {
 	sf.t.Log("newMut")
-	f := NewFieldMut(10)
+	f := NewValMut(10)
 	if f == nil {
 		sf.t.Fatalf("newMut(): f==nil")
 	}
@@ -33,7 +33,7 @@ func (sf *tester) newMut() {
 // Создание нового фиксированного значения.
 func (sf *tester) newFix() {
 	sf.t.Log("newFix")
-	f := NewField(10)
+	f := NewVal(10)
 	if f == nil {
 		sf.t.Fatalf("newFix(): f==nil")
 	}

+ 15 - 16
v4/lev1/result/result.go → v4/lev0/result/result.go

@@ -5,8 +5,7 @@ import (
 	"reflect"
 	"runtime"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 )
 
 // Result — обёртка вокруг результата с возможной ошибкой.
@@ -20,12 +19,12 @@ type Result[T any] struct {
 }
 
 // NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](result T) IResult[T] {
+func NewRes[T any](result T) *Result[T] {
 	// Для некоторых типов нужна дополнительная проверка через reflect
 	v := reflect.ValueOf(result)
 	switch v.Kind() {
 	case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
-		Hassert(!v.IsNil(), "NewOk(): result==nil")
+		mKh.Hassert(!v.IsNil(), "NewOk(): result==nil")
 	}
 	sf := &Result[T]{
 		val: result,
@@ -35,8 +34,8 @@ func NewRes[T any](result T) IResult[T] {
 }
 
 // NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) IResult[T] {
-	Hassert(err != nil, "NewError(): err==nil")
+func NewErr[T any](err error) *Result[T] {
+	mKh.Hassert(err != nil, "NewError(): err==nil")
 	sf := &Result[T]{
 		err:   err,
 		isErr: true,
@@ -46,9 +45,9 @@ func NewErr[T any](err error) IResult[T] {
 }
 
 // WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res IResult[T], err error) IResult[T] {
-	Hassert(res.IsErr(), "WrapErr(): result not have error")
-	Hassert(err != nil, "WrapErr(): err==nil")
+func WrapErr[T any](res *Result[T], err error) *Result[T] {
+	mKh.Hassert(res.IsErr(), "WrapErr(): result not have error")
+	mKh.Hassert(err != nil, "WrapErr(): err==nil")
 	err0 := res.Err() // Чтобы не было паники при финализации и обернуть ошибку
 	err = fmt.Errorf("%v, err=\n\t%w", err0, err)
 	sf := NewErr[T](err)
@@ -57,7 +56,7 @@ func WrapErr[T any](res IResult[T], err error) IResult[T] {
 
 func (sf *Result[T]) destroy(res *Result[T]) {
 	if !res.isCheck {
-		Hassert(false, "Result[T].destroy(): err not checked")
+		mKh.Hassert(false, "Result[T].destroy(): err not checked")
 	}
 }
 
@@ -75,7 +74,7 @@ func (sf *Result[T]) IsErr() bool {
 
 // Val -- возвращает значение, если оно есть, иначе паникует.
 func (sf *Result[T]) Val() T {
-	Hassert(!sf.isErr, "Result[T].Val(): err(%v)!=nil", sf.err)
+	mKh.Hassert(!sf.isErr, "Result[T].Val(): err(%v)!=nil", sf.err)
 	return sf.val
 }
 
@@ -90,7 +89,7 @@ func (sf *Result[T]) ValOr(defaultValue T) T {
 
 // ValOrFn -- возвращает значение, если оно есть, или результат выполнения функции.
 func (sf *Result[T]) ValOrFn(fn func() T) T {
-	Hassert(fn != nil, "Result[T].ValOrFn(): fn==nil")
+	mKh.Hassert(fn != nil, "Result[T].ValOrFn(): fn==nil")
 	sf.isCheck = true
 	if sf.isErr {
 		return fn()
@@ -100,14 +99,14 @@ func (sf *Result[T]) ValOrFn(fn func() T) T {
 
 // Err -- возвращает ошибку, если она есть.
 func (sf *Result[T]) Err() error {
-	Hassert(sf.isErr, "Result[T].Err(): err==nil")
+	mKh.Hassert(sf.isErr, "Result[T].Err(): err==nil")
 	sf.isCheck = true
 	return sf.err
 }
 
 // Error -- возвращает строковое представление ошибки, если она есть.
 func (sf *Result[T]) Error() string {
-	Hassert(sf.isErr, "Result[T].Error(): err==nil")
+	mKh.Hassert(sf.isErr, "Result[T].Error(): err==nil")
 	sf.isCheck = true
 	return sf.err.Error()
 }
@@ -119,7 +118,7 @@ func (sf *Result[T]) Hassert(msgFormat string, args ...any) T {
 		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
 	}
 	msg := fmt.Sprintf(msgFormat+strErr, args...)
-	Hassert(!sf.isErr, msg)
+	mKh.Hassert(!sf.isErr, msg)
 	sf.isCheck = true
 	return sf.val
 }
@@ -131,7 +130,7 @@ func (sf *Result[T]) Assert(msgFormat string, args ...any) T {
 		strErr = fmt.Sprintf(", err=\n\t%v", sf.err)
 	}
 	msg := fmt.Sprintf(msgFormat+strErr, args...)
-	Assert(!sf.isErr, msg)
+	mKh.Assert(!sf.isErr, msg)
 	sf.isCheck = true
 	return sf.val
 }

+ 5 - 7
v4/lev1/result/result_test.go → v4/lev0/result/result_test.go

@@ -4,8 +4,7 @@ import (
 	"fmt"
 	"runtime"
 	"testing"
-
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	// . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
@@ -38,8 +37,7 @@ func (sf *tester) notCheck() {
 	}
 	runtime.Gosched()
 	runtime.GC()
-	res_ := res.(*Result[string])
-	res_.destroy(res_)
+	res.destroy(res)
 }
 
 // Создаёт новый Result.
@@ -110,7 +108,7 @@ func (sf *tester) assert2() {
 	res.Assert("test assert2")
 }
 
-func (sf *tester) hassert2(res IResult[string]) {
+func (sf *tester) hassert2(res *Result[string]) {
 	sf.t.Log("hassert2")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -120,7 +118,7 @@ func (sf *tester) hassert2(res IResult[string]) {
 	res.Hassert("test hassert2")
 }
 
-func (sf *tester) hassert(res IResult[string]) {
+func (sf *tester) hassert(res *Result[string]) {
 	sf.t.Log("hassert")
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -130,7 +128,7 @@ func (sf *tester) hassert(res IResult[string]) {
 	res.Hassert("test hassert")
 }
 
-func (sf *tester) unwrapErr(res IResult[string]) {
+func (sf *tester) unwrapErr(res *Result[string]) {
 	sf.t.Log("unwrapErr")
 	defer func() {
 		if _panic := recover(); _panic == nil {

+ 10 - 12
v4/lev1/ctx_value/ctx_value.go

@@ -5,35 +5,33 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
-	kt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mKr "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 // CtxValue -- потокобезопасное значение локального контекста.
 type CtxValue struct {
 	sync.RWMutex
 	key       string
-	createAt  mKa.ATime
+	createAt  *alias.ATime
 	Val_      any
-	UpdateAt_ mKa.ATime
+	UpdateAt_ *alias.ATime
 	Comment_  string
 }
 
 // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
-func NewCtxValue(key string, val any, comment string) kt.IResult[*CtxValue] {
+func NewCtxValue(key string, val any, comment string) *mL0.Result[*CtxValue] {
 	if key == "" {
 		err := fmt.Errorf("NewCtxValue(): key is empty")
-		return mKr.NewErr[*CtxValue](err)
+		return mL0.NewErr[*CtxValue](err)
 	}
 	sf := &CtxValue{
 		key:      key,
-		createAt: helpers.TimeNowStr(),
+		createAt: alias.NewATime(),
 		Val_:     val,
 		Comment_: comment,
 	}
-	return mKr.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Key -- возвращает ключ значения.
@@ -49,14 +47,14 @@ func (sf *CtxValue) Val() any {
 }
 
 // UpdateAt -- возвращает время обновления значения.
-func (sf *CtxValue) UpdateAt() mKa.ATime {
+func (sf *CtxValue) UpdateAt() *alias.ATime {
 	sf.RLock()
 	defer sf.RUnlock()
 	return sf.UpdateAt_
 }
 
 // CreateAt -- возвращает время создания значения.
-func (sf *CtxValue) CreateAt() mKa.ATime {
+func (sf *CtxValue) CreateAt() *alias.ATime {
 	return sf.createAt
 }
 

+ 4 - 4
v4/lev1/ctx_value/ctx_value_test.go

@@ -3,14 +3,14 @@ package ctx_value
 import (
 	"testing"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	alias "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 type tester struct {
 	t      *testing.T
 	val    ICtxValue
-	create ATime
+	create *alias.ATime
 }
 
 func TestCtxValue(t *testing.T) {
@@ -31,7 +31,7 @@ func (sf *tester) new() {
 		sf.t.Fatalf("new(): val(%v)!=5", val)
 	}
 	create := sf.val.CreateAt()
-	if create == "" {
+	if create.Get() == "" {
 		sf.t.Fatalf("new(): create is empty")
 	}
 	sf.create = create
@@ -41,7 +41,7 @@ func (sf *tester) new() {
 	if key := sf.val.Key(); key != "test_key" {
 		sf.t.Fatalf("new(): key(%v)!='test_key'", key)
 	}
-	if update := sf.val.UpdateAt(); update != "" {
+	if update := sf.val.UpdateAt(); update.Get() != "" {
 		sf.t.Fatalf("new(): update not empty")
 	}
 }

+ 5 - 5
v4/lev1/kbus_msg/msg_pub/msg_pub.go

@@ -2,20 +2,20 @@
 package msg_pub
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 )
 
 // PublishReq -- запрос на публикацию.
 type PublishReq struct {
-	Topic_  mKa.ATopic `json:"topic"`
-	Uuid_   string     `json:"uuid"`
-	BinMsg_ []byte     `json:"msg"`
+	Topic_  *alias.ATopic `json:"topic"`
+	Uuid_   string        `json:"uuid"`
+	BinMsg_ []byte        `json:"msg"`
 }
 
 // SelfCheck -- проверяет правильность своих полей.
 func (sf *PublishReq) SelfCheck() {
-	mKh.Hassert(sf.Topic_ != "", "PublishReq.SelfCheck(): topic is empty")
+	mKh.Hassert(sf.Topic_.Get() != "", "PublishReq.SelfCheck(): topic is empty")
 	mKh.Hassert(sf.Uuid_ != "", "PublishReq.SelfCheck(): uuid is empty")
 }
 

+ 7 - 1
v4/lev1/kbus_msg/msg_pub/msg_pub_test.go

@@ -2,6 +2,8 @@ package msg_pub
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 type tester struct {
@@ -26,6 +28,10 @@ func (sf *tester) resp() {
 	resp.SelfCheck()
 }
 
+var (
+	qName = alias.NewATopic("test_topic")
+)
+
 // Кривые поля ответа.
 func (sf *tester) respBad1() {
 	sf.t.Log("respBad1")
@@ -43,7 +49,7 @@ func (sf *tester) req() {
 	sf.t.Log("req")
 	sf.reqBad1()
 	req := &PublishReq{
-		Topic_:  "test_topic",
+		Topic_:  qName,
 		Uuid_:   "test_uuid",
 		BinMsg_: []byte("test msg"),
 	}

+ 5 - 5
v4/lev1/kbus_msg/msg_serve/msg_serve.go

@@ -2,20 +2,20 @@
 package msg_serve
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 )
 
 // ServeReq -- входящий запрос на обслуживание.
 type ServeReq struct {
-	Topic_  mKa.ATopic `json:"topic"`
-	Uuid_   string     `json:"uuid"`
-	BinReq_ []byte     `json:"req"`
+	Topic_  *alias.ATopic `json:"topic"`
+	Uuid_   string        `json:"uuid"`
+	BinReq_ []byte        `json:"req"`
 }
 
 // SelfCheck -- проверяет структуру на правильность полей.
 func (sf *ServeReq) SelfCheck() {
-	mKh.Hassert(sf.Topic_ != "", "ServeReq.SelfCheck(): topic is empty")
+	mKh.Hassert(sf.Topic_.Get() != "", "ServeReq.SelfCheck(): topic is empty")
 	mKh.Hassert(sf.Uuid_ != "", "ServeReq.SelfCheck(): uuid is empty")
 }
 

+ 7 - 1
v4/lev1/kbus_msg/msg_serve/msg_serve_test.go

@@ -2,6 +2,8 @@ package msg_serve
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 type tester struct {
@@ -38,12 +40,16 @@ func (sf *tester) respBad1() {
 	resp.SelfCheck()
 }
 
+var (
+	qName = alias.NewATopic("test_topic")
+)
+
 // Работа с запросом.
 func (sf *tester) req() {
 	sf.t.Log("req")
 	sf.reqBad1()
 	req := &ServeReq{
-		Topic_:  "test_topic",
+		Topic_:  qName,
 		Uuid_:   "test_uuid",
 		BinReq_: []byte("test msg"),
 	}

+ 9 - 8
v4/lev1/kbus_msg/msg_sub/msg_sub.go

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

+ 7 - 1
v4/lev1/kbus_msg/msg_sub/msg_sub_test.go

@@ -2,6 +2,8 @@ package msg_sub
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 type tester struct {
@@ -38,12 +40,16 @@ func (sf *tester) respBad1() {
 	resp.SelfCheck()
 }
 
+var (
+	qName = alias.NewATopic("test_topic")
+)
+
 // Работа с запросом.
 func (sf *tester) req() {
 	sf.t.Log("req")
 	sf.reqBad1()
 	req := &SubscribeReq{
-		Topic_:   "test_topic",
+		Topic_:   qName,
 		Uuid_:    "test_uuid",
 		WebHook_: "test msg",
 	}

+ 4 - 4
v4/lev1/kbus_msg/msg_unsub/msg_unsub.go

@@ -2,19 +2,19 @@
 package msg_unsub
 
 import (
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 )
 
 // UnsubReq -- запрос на отписку от топика.
 type UnsubReq struct {
-	Name_ mKa.AHandlerName `json:"name"` // Уникальная метка подписки
-	Uuid_ string           `json:"uuid"`
+	Name_ *mKa.AHandlerName `json:"name"` // Уникальная метка подписки
+	Uuid_ string            `json:"uuid"`
 }
 
 // SelfCheck -- проверка запроса на правильность полей.
 func (sf *UnsubReq) SelfCheck() {
-	mKh.Hassert(sf.Name_ != "", "UnsubReq.SelfCheck(): name is empty")
+	mKh.Hassert(sf.Name_ != nil, "UnsubReq.SelfCheck(): name is empty")
 	mKh.Hassert(sf.Uuid_ != "", "UnsubReq.SelfCheck(): uuid is empty")
 }
 

+ 3 - 1
v4/lev1/kbus_msg/msg_unsub/msg_unsub_test.go

@@ -2,6 +2,8 @@ package msg_unsub
 
 import (
 	"testing"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 type tester struct {
@@ -43,7 +45,7 @@ func (sf *tester) req() {
 	sf.t.Log("req")
 	sf.reqBad1()
 	req := &UnsubReq{
-		Name_: "test_topic",
+		Name_: alias.NewAHandlerName("test_topic"),
 		Uuid_: "test_uuid",
 	}
 	req.SelfCheck()

+ 11 - 11
v4/lev1/kint/kint.go

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

+ 14 - 39
v4/lev1/lev1.go

@@ -5,14 +5,14 @@ import (
 	"context"
 	"fmt"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kint"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/local_ctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/option"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_bool_react"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/safe_int"
@@ -41,70 +41,45 @@ func OptIsTerm(isTerm bool) OptionLogBuf {
 }
 
 // NewLogBuf -- возвращает новый буферизованный лог.
-func NewLogBuf(opts ...log_buf.OptionLogBuf) ILogBuf {
+func NewLogBuf(opts ...log_buf.OptionLogBuf) mKt.ILogBuf {
 	log := log_buf.NewLogBuf(opts...)
 	return log
 }
 
 // NewSafeString -- возвращает новую потокобезопасную строку.
-func NewSafeString() ISafeString {
+func NewSafeString() mKt.ISafeString {
 	str := safe_string.NewSafeString()
 	return str
 }
 
 // NewSafeIntFromStr -- возвращает новое потокобезопасное целое из строки.
-func NewSafeIntFromStr(strVal string) IResult[ISafeInt] {
+func NewSafeIntFromStr(strVal string) *mL0.Result[mKt.ISafeInt] {
 	return safe_int.NewSafeIntFromStr(strVal)
 }
 
 // NewSafeIntGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeIntGetenv(env string) IResult[ISafeInt] {
+func NewSafeIntGetenv(env string) *mL0.Result[mKt.ISafeInt] {
 	return safe_int.NewSafeIntGetenv(env)
 }
 
 // NewSafeInt -- возвращает новую потокобезопасную целочисленную переменную.
-func NewSafeInt(val int) ISafeInt {
+func NewSafeInt(val int) mKt.ISafeInt {
 	val_ := safe_int.NewSafeInt(val)
 	return val_
 }
 
 // NewSafeBoolReact -- возвращает новую потокобезопасную реактивную булеву переменную.
-func NewSafeBoolReact() ISafeBoolReact {
+func NewSafeBoolReact() mKt.ISafeBoolReact {
 	val := safe_bool_react.NewSafeBoolReact()
 	return val
 }
 
 // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-func NewSafeBool() ISafeBool {
+func NewSafeBool() mKt.ISafeBool {
 	sb := safe_bool.NewSafeBool()
 	return sb
 }
 
-// NewRes -- возвращает успешный Result с значением.
-func NewRes[T any](res T) IResult[T] {
-	return result.NewRes(res)
-}
-
-// NewErr -- возвращает Result с ошибкой.
-func NewErr[T any](err error) IResult[T] {
-	return result.NewErr[T](err)
-}
-
-// WrapErr -- оборачивает существующий Result с ошибкой с новой ошибкой.
-func WrapErr[T any](res IResult[T], err error) IResult[T] {
-	return result.WrapErr(res, err)
-}
-
-// NewOpt -- возвращает новый не пустой результат операции.
-func NewOpt[T any](some T) IOption[T] {
-	return option.NewOpt(some)
-}
-
-// NewNone -- возвращает новый пустой результат операции.
-func NewNone[T any]() IOption[T] {
-	return option.NewNone[T]()
-}
-
 // FnHassert -- проверяет с жёстким падением условие.
 type FnHassert = helpers.FnHassert
 
@@ -127,17 +102,17 @@ func SleepMs() {
 }
 
 // NewInt -- возвращает новую целочисленную переменную.
-func NewInt(val int) Int {
+func NewInt(val int) mKt.Int {
 	val_ := kint.NewInt(val)
 	return val_
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) IResult[ILocalCtx] {
+func NewLocalCtx(ctx context.Context) *mL0.Result[mKt.ILocalCtx] {
 	resCtx := local_ctx.NewLocalCtx(ctx)
 	if resCtx.IsErr() {
 		err := fmt.Errorf("NewLocalCtx(): err=\n\t%w", resCtx.Err())
-		return NewErr[ILocalCtx](err)
+		return mL0.NewErr[mKt.ILocalCtx](err)
 	}
-	return NewRes(ILocalCtx(resCtx.Val()))
+	return mL0.NewRes(mKt.ILocalCtx(resCtx.Val()))
 }

+ 14 - 15
v4/lev1/local_ctx/local_ctx.go

@@ -6,13 +6,12 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/ctx_value"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/log_buf"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/lst_sort"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/option"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 // LocalCtx -- локальный контекст.
@@ -27,10 +26,10 @@ type LocalCtx struct {
 }
 
 // NewLocalCtx -- возвращает новый локальный контекст.
-func NewLocalCtx(ctx context.Context) IResult[*LocalCtx] {
+func NewLocalCtx(ctx context.Context) *mL0.Result[*LocalCtx] {
 	if ctx == nil {
 		err := fmt.Errorf("NewLocalCtx(): ctx==nil")
-		return NewErr[*LocalCtx](err)
+		return mL0.NewErr[*LocalCtx](err)
 	}
 	_ctx, fnCancel := context.WithCancel(ctx)
 	sf := &LocalCtx{
@@ -41,7 +40,7 @@ func NewLocalCtx(ctx context.Context) IResult[*LocalCtx] {
 		log:      log_buf.NewLogBuf(log_buf.OptIsTerm(true), log_buf.OptPrefix("LocalCtx")),
 	}
 	_ = ILocalCtx(sf)
-	return NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Ctx -- возвращает отменяемый контекст.
@@ -67,18 +66,18 @@ func (sf *LocalCtx) Log() ILogBuf {
 }
 
 // Get -- возвращает хранимое значение.
-func (sf *LocalCtx) Get(key string) IOption[ICtxValue] {
+func (sf *LocalCtx) Get(key string) *mL0.Option[ICtxValue] {
 	sf.RLock()
 	defer sf.RUnlock()
 	if key == "" {
-		return NewNone[ICtxValue]()
+		return mL0.NewNone[ICtxValue]()
 	}
 	sf.log.Debug("Get(): key='%v'", key)
 	val, isOk := sf.dictVal[key]
 	if !isOk {
-		return NewNone[ICtxValue]()
+		return mL0.NewNone[ICtxValue]()
 	}
-	return NewOpt(val)
+	return mL0.NewOpt(val)
 }
 
 // Del -- удаляет значение из контекста.
@@ -92,7 +91,7 @@ func (sf *LocalCtx) Del(key string) {
 }
 
 // Set -- добавляет значение в контекст.
-func (sf *LocalCtx) Set(key string, val any, comment string) IResult[bool] {
+func (sf *LocalCtx) Set(key string, val any, comment string) *mL0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Set(): key='%v'", key)
@@ -100,19 +99,19 @@ func (sf *LocalCtx) Set(key string, val any, comment string) IResult[bool] {
 	if isOk {
 		val0 := _val.(*ctx_value.CtxValue)
 		val0.Lock()
-		val0.UpdateAt_ = helpers.TimeNowStr()
+		val0.UpdateAt_ = alias.NewATime()
 		val0.Val_ = val
 		val0.Unlock()
-		return NewRes(true)
+		return mL0.NewRes(true)
 	}
 	resVal := ctx_value.NewCtxValue(key, val, comment)
 	if resVal.IsErr() {
-		return NewErr[bool](resVal.Err())
+		return mL0.NewErr[bool](resVal.Err())
 	}
 	_val = resVal.Val()
 	sf.dictVal[key] = _val
 	sf.lstSort.Add(_val)
-	return NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Wait -- блокирующий вызов ожидания отмены контекста.

+ 1 - 1
v4/lev1/log_buf/log_buf.go

@@ -186,7 +186,7 @@ func (sf *LogBuf) printTerm(msg ILogMsg) {
 	}
 	level := msg.Level()
 	if helpers.IsStageProd {
-		switch level {
+		switch level.Get() {
 		case "ERRO", "WARN":
 			log.Printf("%v   %v\n", level, msg.String())
 		default:

+ 7 - 7
v4/lev1/log_dict_topic/log_dict_topic.go

@@ -5,26 +5,26 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
 )
 
 type LogDictTopic struct {
 	sync.RWMutex
-	dict   map[kalias.ATopic]bool
+	dict   map[alias.ATopic]bool
 	client IBusClient
 }
 
 // NewLogDictTopic -- возвращает новый словарь топиков для логирования.
-func NewLogDictTopic(clientBus IBusClient) IResult[*LogDictTopic] {
+func NewLogDictTopic(clientBus IBusClient) *mL0.Result[*LogDictTopic] {
 	if clientBus == nil {
 		err := fmt.Errorf("NewLogDictTopic(): clientBus == nil")
-		return NewErr[*LogDictTopic](err)
+		return mL0.NewErr[*LogDictTopic](err)
 	}
 	sf := &LogDictTopic{
-		dict:   map[kalias.ATopic]bool{},
+		dict:   map[alias.ATopic]bool{},
 		client: clientBus,
 	}
-	return NewRes(sf)
+	return mL0.NewRes(sf)
 }

+ 16 - 13
v4/lev1/log_msg/log_msg.go

@@ -4,9 +4,12 @@ package log_msg
 import (
 	"fmt"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
 )
 
 const (
@@ -18,16 +21,16 @@ const (
 
 // logMsg -- сообщение логгера.
 type logMsg struct {
-	level    string
-	createAt ATime
-	msg      string
+	level    *quark.QStr[quark.Mut]
+	createAt *ATime
+	msg      *quark.QStr[quark.Fix]
 }
 
 // NewLogMsg -- возвращает новое сообщение логгера.
 func NewLogMsg(level int, msg string) ILogMsg {
 	sf := &logMsg{
-		createAt: TimeNowStr(),
-		msg:      msg,
+		createAt: alias.NewATime(),
+		msg:      quark.NewQStr(msg),
 	}
 	sf.check(level)
 	return sf
@@ -40,17 +43,17 @@ func (sf *logMsg) String() string {
 }
 
 // Msg -- возвращает хранимое сообщение.
-func (sf *logMsg) Msg() string {
+func (sf *logMsg) Msg() *quark.QStr[quark.Fix] {
 	return sf.msg
 }
 
 // Level -- возвращает уровень сообщения.
-func (sf *logMsg) Level() string {
+func (sf *logMsg) Level() *quark.QStr[quark.Mut] {
 	return sf.level
 }
 
 // CreateAt -- когда сообщение создано.
-func (sf *logMsg) CreateAt() ATime {
+func (sf *logMsg) CreateAt() *alias.ATime {
 	return sf.createAt
 }
 
@@ -58,13 +61,13 @@ func (sf *logMsg) CreateAt() ATime {
 func (sf *logMsg) check(level int) {
 	switch level {
 	case DEBUG:
-		sf.level = "DEBU"
+		quark_val.Set(sf.level.QBase.Val(), "DEBU")
 	case INFO:
-		sf.level = "INFO"
+		quark_val.Set(sf.level.QBase.Val(), "INFO")
 	case WARN:
-		sf.level = "WARN"
+		quark_val.Set(sf.level.QBase.Val(), "WARN")
 	case ERROR:
-		sf.level = "ERRO"
+		quark_val.Set(sf.level.QBase.Val(), "ERRO")
 	default:
 		Hassert(false, "logMsg.check(): unknown level(%v)", level)
 	}

+ 4 - 4
v4/lev1/log_msg/log_msg_test.go

@@ -29,14 +29,14 @@ func (sf *tester) newGood1() {
 	_ = NewLogMsg(-2, "test msg -2")
 	_ = NewLogMsg(-1, "test msg -1")
 	msg := NewLogMsg(0, "test msg 0")
-	if msg := msg.Msg(); msg != "test msg 0" {
+	if msg := msg.Msg(); msg.Get() != "test msg 0" {
 		sf.t.Fatalf("newGood1(): msg(%v)!='test msg 0'", msg)
 	}
-	if lvl := msg.Level(); lvl != "ERRO" {
+	if lvl := msg.Level(); lvl.Get() != "ERRO" {
 		sf.t.Fatalf("newGood1(): lvl(%v)!='ERRO'", lvl)
 	}
-	if create := msg.CreateAt(); create == "" {
-		sf.t.Fatalf("newGood1(): create is empty")
+	if createAt := msg.CreateAt(); createAt.Get() == "" {
+		sf.t.Fatalf("newGood1(): createAt is empty")
 	}
 	if str := msg.String(); !strings.Contains(str, "ERRO   2") {
 		sf.t.Fatalf("newGood1(): str(%v)!=`ERRO   2`", str)

+ 14 - 14
v4/lev1/safe_bool/safe_bool.go

@@ -7,8 +7,8 @@ import (
 	"strings"
 	"sync"
 
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
 // safeBool -- потокобезопасный булевый признак.
@@ -18,31 +18,31 @@ type safeBool struct {
 }
 
 // NewSafeBool -- возвращает новый потокобезопасный булевый признак.
-func NewSafeBool() ISafeBool {
+func NewSafeBool() mKt.ISafeBool {
 	sf := &safeBool{}
 	return sf
 }
 
 // NewSafeBoolFromStr -- возвращает новое потокобезопасное булево из строки.
-func NewSafeBoolFromStr(strVal string) IResult[ISafeBool] {
+func NewSafeBoolFromStr(strVal string) *mL0.Result[mKt.ISafeBool] {
 	sf := NewSafeBool()
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeBoolFromStr(): in parse str(%v), err=\n\t%w", strVal, res.Err())
-		return NewErr[ISafeBool](err)
+		return mL0.NewErr[mKt.ISafeBool](err)
 	}
-	return NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // NewSafeBoolGetenv -- возвращает новое потокобезопасное целое из окружения.
-func NewSafeBoolGetenv(env string) IResult[ISafeBool] {
+func NewSafeBoolGetenv(env string) *mL0.Result[mKt.ISafeBool] {
 	sf := NewSafeBool()
 	res := sf.Getenv(env)
 	if res.IsErr() {
 		err := fmt.Errorf("NewSafeBoolGetenv(): in parse env(%v), err=\n\t%w", env, res.Err())
-		return NewErr[ISafeBool](err)
+		return mL0.NewErr[mKt.ISafeBool](err)
 	}
-	return NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Get -- возвращает хранимый булевый признак.
@@ -67,7 +67,7 @@ func (sf *safeBool) Reset() {
 }
 
 // FromStr -- получает число из строки.
-func (sf *safeBool) FromStr(strVal string) IResult[bool] {
+func (sf *safeBool) FromStr(strVal string) *mL0.Result[bool] {
 	strVal = strings.ToLower(strVal)
 	sf.Lock()
 	defer sf.Unlock()
@@ -77,18 +77,18 @@ func (sf *safeBool) FromStr(strVal string) IResult[bool] {
 	case "false":
 		sf.val = false
 	default:
-		return NewErr[bool](fmt.Errorf("safeBool.FromStr(): val(%v) bad", strVal))
+		return mL0.NewErr[bool](fmt.Errorf("safeBool.FromStr(): val(%v) bad", strVal))
 	}
-	return NewRes(sf.val)
+	return mL0.NewRes(sf.val)
 }
 
 // Getenv -- получает значение из окружения.
-func (sf *safeBool) Getenv(env string) IResult[bool] {
+func (sf *safeBool) Getenv(env string) *mL0.Result[bool] {
 	strVal := os.Getenv(env)
 	res := sf.FromStr(strVal)
 	if res.IsErr() {
 		err := fmt.Errorf("safeBool.Getenv(): from env %v, err=\n\t%w", env, res.Err())
-		return NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	return res
 }

+ 18 - 18
v4/lev1/safe_bool_react/safe_bool_react.go

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

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

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

+ 9 - 9
v4/lev1/safe_string/safe_string.go

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

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

@@ -5,31 +5,31 @@ import (
 	"fmt"
 	"sync"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 // dictSubHook -- словарь потребителей топика по подписке.
 type dictSubHook struct {
 	ctx   mKt.IKernelCtx
-	dict  map[mKa.AHandlerName]bool // В качестве ключа -- URL веб-хука
+	dict  map[*mKa.AHandlerName]bool // В качестве ключа -- URL веб-хука
 	block sync.RWMutex
 }
 
 // NewDictSubHook -- возвращает новый словарь веб-хуков одного топика.
-func NewDictSubHook() mKt.IResult[mKt.IDictSubHook] {
+func NewDictSubHook() *mL0.Result[mKt.IDictSubHook] {
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("dictSubHook.NewDictSubHook(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[mKt.IDictSubHook](err)
+		return mL0.NewErr[mKt.IDictSubHook](err)
 	}
 	sf := &dictSubHook{
 		ctx:  resKernCtx.Val(),
-		dict: map[mKa.AHandlerName]bool{},
+		dict: map[*mKa.AHandlerName]bool{},
 	}
-	return mL1.NewRes(mKt.IDictSubHook(sf))
+	return mL0.NewRes(mKt.IDictSubHook(sf))
 }
 
 // Unsubscribe -- удаляет из словаря подписки обработчик.
@@ -42,25 +42,25 @@ func (sf *dictSubHook) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 	}
 	handlerName := handler.Name()
 	delete(sf.dict, handlerName)
-	sf.ctx.Del(string(handlerName))
+	sf.ctx.Del(handlerName.Get())
 }
 
 // Subscribe -- добавляет в словарь подписки новый обработчик.
-func (sf *dictSubHook) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool] {
+func (sf *dictSubHook) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	if handler == nil {
 		err := fmt.Errorf("dictSubHook.Subscribe(): handler==nil")
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	handlerName := handler.Name()
 	sf.dict[handlerName] = true
-	res := sf.ctx.Set(string(handlerName), handler, "subscribe handler")
+	res := sf.ctx.Set(handlerName.Get(), handler, "subscribe handler")
 	if res.IsErr() {
 		err := fmt.Errorf("dictSubHook.Subscribe(): in set subscribe handler in kernel ctx, err=\n\t%w", res.Err())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Read -- вызывает все обработчики словаря подписок.
@@ -68,9 +68,9 @@ func (sf *dictSubHook) Read(binMsg []byte) {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	for handlerName := range sf.dict {
-		optHand := sf.ctx.Get(string(handlerName))
+		optHand := sf.ctx.Get(handlerName.Get())
 		if optHand.IsNone() {
-			sf.ctx.Del(string(handlerName))
+			sf.ctx.Del(handlerName.Get())
 			continue
 		}
 		handler := optHand.Val().Val().(mKt.IBusHandlerSubscribe)

+ 8 - 2
v4/lev2/kbus/dict_sub_hook/dict_sub_hook_test.go

@@ -3,6 +3,7 @@ package dict_sub_hook
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
 
@@ -13,11 +14,16 @@ type tester struct {
 	handSub2 *mock_hand_sub_local.MockHandlerSub
 }
 
+var (
+	qTopicHand1 = alias.NewATopic("hand_topic1")
+	qTopicHand2 = alias.NewATopic("hand_topic2")
+)
+
 func TestDictSubWebHook(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub("hand_topic1", "hand_name1"),
-		handSub2: mock_hand_sub_local.NewMockHandlerSub("hand_topic2", "hand_name2"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicHand1, "hand_name1"),
+		handSub2: mock_hand_sub_local.NewMockHandlerSub(qTopicHand2, "hand_name2"),
 	}
 	sf.new()
 	sf.add()

+ 15 - 18
v4/lev2/kbus/dict_topic_serve/dict_topic_serve.go

@@ -7,9 +7,9 @@ import (
 	"sync"
 	"time"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
@@ -19,39 +19,36 @@ import (
 type dictServe struct {
 	sync.RWMutex
 	kCtx      mKt.IKernelCtx
-	dictServe map[mKa.ATopic]mKt.IBusHandlerServe
+	dictServe map[*mKa.ATopic]mKt.IBusHandlerServe
 }
 
 // NewDictServe -- возвращает потокобезопасный словарь обработчиков запросов.
-func NewDictServe() mKt.IResult[*dictServe] {
+func NewDictServe() *mL0.Result[*dictServe] {
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("NewDictServe(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[*dictServe](err)
+		return mL0.NewErr[*dictServe](err)
 	}
 	sf := &dictServe{
 		kCtx:      resKernCtx.Val(),
-		dictServe: map[mKa.ATopic]mKt.IBusHandlerServe{},
+		dictServe: map[*mKa.ATopic]mKt.IBusHandlerServe{},
 	}
-	return mL1.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Register -- регистрирует обработчик запросов.
-func (sf *dictServe) Register(handler mKt.IBusHandlerServe) mKt.IResult[bool] {
+func (sf *dictServe) Register(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
-		return mL1.NewErr[bool](fmt.Errorf("dictServe.Register(): IBusHandlerSubscribe==nil"))
+		return mL0.NewErr[bool](fmt.Errorf("dictServe.Register(): IBusHandlerSubscribe==nil"))
 	}
 	topic := handler.Topic()
-	if topic == "" {
-		return mL1.NewErr[bool](fmt.Errorf("dictServe.Register(): empty topic of handler"))
-	}
 	isTwinRegister := sf.register(handler)
 	if isTwinRegister {
-		return mL1.NewErr[bool](fmt.Errorf("dictServe.Register(): handler of topic (%v) already register", topic))
+		return mL0.NewErr[bool](fmt.Errorf("dictServe.Register(): handler of topic (%v) already register", topic))
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Unregister -- удаляет обработчик запросов из словаря.
@@ -66,16 +63,16 @@ func (sf *dictServe) Unregister(handler mKt.IBusHandlerServe) {
 }
 
 // SendRequest -- вызывает обработчик при поступлении запроса.
-func (sf *dictServe) SendRequest(topic mKa.ATopic, binReq []byte) mKt.IResult[[]byte] {
+func (sf *dictServe) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	handler, isOk := sf.dictServe[topic]
 	if !isOk {
 		err := fmt.Errorf("dictServe.SendRequest(): handler for topic (%v) not exists", topic)
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	var (
-		chRes = make(chan mKt.IResult[[]byte], 2)
+		chRes = make(chan *mL0.Result[[]byte], 2)
 	)
 	ctx, fnCancel := context.WithTimeout(sf.kCtx.Ctx(), time.Millisecond*time.Duration(TimeoutDefault))
 	defer fnCancel()
@@ -88,7 +85,7 @@ func (sf *dictServe) SendRequest(topic mKa.ATopic, binReq []byte) mKt.IResult[[]
 	select {
 	case <-ctx.Done():
 		err := fmt.Errorf("dictServe.SendRequest(): in call for topic (%v), err=\n\t%w", topic, ctx.Err())
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	case res := <-chRes:
 		return res
 	}

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

@@ -3,6 +3,7 @@ package dict_topic_serve
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
 )
@@ -13,10 +14,15 @@ type tester struct {
 	hand *mock_hand_serve.MockHandlerServe
 }
 
+var (
+	qTopicBad  = alias.NewATopic("test_bad_topic")
+	qTopicServ = alias.NewATopic("topic_hand_serv")
+)
+
 func TestDictSub(t *testing.T) {
 	sf := &tester{
 		t:    t,
-		hand: mock_hand_serve.NewMockHandlerServe("topic_dict_serve", "name_dict_serve"),
+		hand: mock_hand_serve.NewMockHandlerServe(qTopicServ, "name_dict_serve"),
 	}
 	sf.new()
 	sf.addBad1()
@@ -110,7 +116,7 @@ func (sf *tester) addBad1() {
 // Вызов несуществующего топика.
 func (sf *tester) sendBad1() {
 	sf.t.Log("sendBad1")
-	res := sf.dict.SendRequest("test_bad_topic", []byte("test"))
+	res := sf.dict.SendRequest(qTopicBad, []byte("test"))
 	if res.IsOk() {
 		sf.t.Fatalf("sendBad1(): err==nil")
 	}

+ 14 - 22
v4/lev2/kbus/dict_topic_sub/dict_topic_sub.go

@@ -5,15 +5,15 @@ import (
 	"fmt"
 	"sync"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus/dict_sub_hook"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
 type tReadReq struct {
-	topic  mKa.ATopic
+	topic  *mKa.ATopic
 	binMsg []byte
 }
 
@@ -21,32 +21,28 @@ type tReadReq struct {
 type dictTopicSub struct {
 	sync.RWMutex
 	kCtx          mKt.IKernelCtx
-	dictTopicHook map[mKa.ATopic]mKt.IDictSubHook
+	dictTopicHook map[*mKa.ATopic]mKt.IDictSubHook
 }
 
 // NewDictTopicSub -- возвращает потокобезопасный словарь подписчиков.
-func NewDictTopicSub() mKt.IResult[*dictTopicSub] {
+func NewDictTopicSub() *mL0.Result[*dictTopicSub] {
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("NewDictTopicSub(): kCtx==nil")
-		return mL1.NewErr[*dictTopicSub](err)
+		return mL0.NewErr[*dictTopicSub](err)
 	}
 	kCtx := resCtx.Val()
 	sf := &dictTopicSub{
 		kCtx:          kCtx,
-		dictTopicHook: map[mKa.ATopic]mKt.IDictSubHook{},
+		dictTopicHook: map[*mKa.ATopic]mKt.IDictSubHook{},
 	}
-	return mL1.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Read -- вызывает обработчики при поступлении события.
-func (sf *dictTopicSub) Read(topic mKa.ATopic, binMsg []byte) {
+func (sf *dictTopicSub) Read(topic *mKa.ATopic, binMsg []byte) {
 	sf.RLock()
 	defer sf.RUnlock()
-	if topic == "" {
-		sf.kCtx.Log().Err("dictTopicSub.Read(): topic is empty")
-		return
-	}
 	msg := &tReadReq{
 		topic:  topic,
 		binMsg: binMsg,
@@ -59,24 +55,20 @@ func (sf *dictTopicSub) Read(topic mKa.ATopic, binMsg []byte) {
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *dictTopicSub) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool] {
+func (sf *dictTopicSub) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	if handler == nil {
 		err := fmt.Errorf("dictTopicSub.Subscribe(): handler==nil")
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	topic := handler.Topic()
-	if topic == "" {
-		err := fmt.Errorf("dictTopicSub.Subscribe(): topic==\"\"")
-		return mL1.NewErr[bool](err)
-	}
 	dictSubHook := sf.dictTopicHook[topic]
 	if dictSubHook == nil {
 		resNewDictTopicSub := dict_sub_hook.NewDictSubHook()
 		if resNewDictTopicSub.IsErr() {
 			err := fmt.Errorf("dictTopicSub.Subscribe(): NewDictSubHook(), err=\n\t%w", resNewDictTopicSub.Err())
-			return mL1.NewErr[bool](err)
+			return mL0.NewErr[bool](err)
 		}
 		dictSubHook = resNewDictTopicSub.Val()
 		sf.dictTopicHook[topic] = dictSubHook
@@ -84,9 +76,9 @@ func (sf *dictTopicSub) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[
 	res := dictSubHook.Subscribe(handler)
 	if res.IsErr() {
 		err := fmt.Errorf("dictTopicSub.Subscribe(): in add subscribe dict handler, err=\n\t%w", res.Err())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Unsubscribe -- отписывает обработчик.

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

@@ -3,6 +3,7 @@ package dict_topic_sub
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
 )
@@ -13,10 +14,18 @@ type tester struct {
 	hand *mock_hand_sub_local.MockHandlerSub
 }
 
+var (
+	qTopicDictSub  = alias.NewATopic("topic_dict_sub")
+	qTopicDictSub1 = alias.NewATopic("topic_dict_sub1")
+	qTopicTest     = alias.NewATopic("test_test")
+	qTopicTestBad  = alias.NewATopic("test_bad_topic")
+	qTopicEmpty    = alias.NewATopic("")
+)
+
 func TestDictSub(t *testing.T) {
 	sf := &tester{
 		t:    t,
-		hand: mock_hand_sub_local.NewMockHandlerSub("topic_dict_sub", "name_dict_sub"),
+		hand: mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub, "name_dict_sub"),
 	}
 	sf.new()
 	sf.addBad1()
@@ -34,15 +43,15 @@ func TestDictSub(t *testing.T) {
 func (sf *tester) unsub1() {
 	sf.t.Log("unsub1")
 	sf.dict.Unsubscribe(sf.hand)
-	sf.dict.Read("test_test", []byte("test test"))
-	hand := mock_hand_sub_local.NewMockHandlerSub("topic_dict_sub1", "name_dict_sub")
+	sf.dict.Read(qTopicTest, []byte("test test"))
+	hand := mock_hand_sub_local.NewMockHandlerSub(qTopicDictSub1, "name_dict_sub")
 	sf.dict.Unsubscribe(hand)
 	count := 0
 	for count < 100 {
 		SleepMs()
 		count++
 	}
-	sf.dict.Read("topic_dict_sub", []byte("test test"))
+	sf.dict.Read(qTopicDictSub, []byte("test test"))
 	count = 0
 	for count < 200 {
 		SleepMs()
@@ -98,7 +107,7 @@ func (sf *tester) addBad1() {
 // Нет топика.
 func (sf *tester) callBad2() {
 	sf.t.Log("callBad2")
-	sf.dict.Read("", []byte("test_msg"))
+	sf.dict.Read(qTopicEmpty, []byte("test_msg"))
 }
 
 // Нет данных в топике.
@@ -109,7 +118,7 @@ func (sf *tester) callGood10() {
 			sf.t.Fatalf("callGood10(): panic=%v", _panic)
 		}
 	}()
-	sf.dict.Read("test_bad_topic", []byte("test"))
+	sf.dict.Read(qTopicTestBad, []byte("test"))
 }
 
 // Создание словаря подписчиков.

+ 30 - 28
v4/lev2/kbus_base/kbus_base.go

@@ -5,7 +5,9 @@ import (
 	"fmt"
 	"sync"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus/dict_topic_serve"
@@ -13,8 +15,8 @@ import (
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-const (
-	strBusBaseStream = "bus_base"
+var (
+	busBaseStreamName = alias.NewAStreamName("bus_base")
 )
 
 // KBusBase -- базовая часть шины данных.
@@ -33,32 +35,32 @@ var (
 )
 
 // GetKernelBusBase -- возвращает базовую шину сообщений.
-func GetKernelBusBase() mKt.IResult[*KBusBase] {
+func GetKernelBusBase() *mL0.Result[*KBusBase] {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return mL1.NewRes(Bus_)
+		return mL0.NewRes(Bus_)
 	}
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("GetKernelBusBase(): in get from kernCtx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[*KBusBase](err)
+		return mL0.NewErr[*KBusBase](err)
 	}
 	kCtx := resKernCtx.Val()
 	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	if resLocCtx.IsErr() {
 		err := fmt.Errorf("GetKernelBusBase(): in get from localCtx, err=\n\t%w", resLocCtx.Err())
-		return mL1.NewErr[*KBusBase](err)
+		return mL0.NewErr[*KBusBase](err)
 	}
 	resDictServe := dict_topic_serve.NewDictServe()
 	if resDictServe.IsErr() {
 		err := fmt.Errorf("GetKernelBusBase(): in get from dictServe, err=\n\t%w", resDictServe.Err())
-		return mL1.NewErr[*KBusBase](err)
+		return mL0.NewErr[*KBusBase](err)
 	}
 	resDictTopicSu := dict_topic_sub.NewDictTopicSub()
 	if resDictTopicSu.IsErr() {
 		err := fmt.Errorf("GetKernelBusBase(): in get from dictTopicSu, err=\n\t%w", resDictTopicSu.Err())
-		return mL1.NewErr[*KBusBase](err)
+		return mL0.NewErr[*KBusBase](err)
 	}
 	Bus_ = &KBusBase{
 		Ctx_:      resKernCtx.Val(),
@@ -71,15 +73,15 @@ func GetKernelBusBase() mKt.IResult[*KBusBase] {
 	go Bus_.close()
 	go Bus_.run()
 	Bus_.IsWork_.Set()
-	res := Bus_.Ctx_.Wg().Add(strBusBaseStream)
-	res.Hassert("GetKernelBusBase(): in add name stream(%v)", strBusBaseStream)
+	res := Bus_.Ctx_.Wg().Add(busBaseStreamName)
+	res.Hassert("GetKernelBusBase(): in add name stream(%v)", busBaseStreamName)
 	resSet := Bus_.Ctx_.Set("kernBusBase", Bus_, "base of data bus")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelBusBase(): in set kernel bus base to kernel ctx, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[*KBusBase](err)
+		return mL0.NewErr[*KBusBase](err)
 	}
 	_ = mKt.IKernelBus(Bus_)
-	return mL1.NewRes(Bus_)
+	return mL0.NewRes(Bus_)
 }
 
 // Log -- возвращает лог шины.
@@ -101,65 +103,65 @@ func (sf *KBusBase) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывает обработчик на топик.
-func (sf *KBusBase) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool] {
+func (sf *KBusBase) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
 	sf.log.Debug("KBusBase.Subscribe(): handler='%v'", handler.Name())
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.Subscribe():  handler='%v', bus already closed", handler.Name())
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	res := sf.dictSub.Subscribe(handler)
 	if res.IsErr() {
 		err := fmt.Errorf("KBusBase.Subscribe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // SendRequest -- отправляет запрос в шину данных.
-func (sf *KBusBase) SendRequest(topic mKa.ATopic, binReq []byte) mKt.IResult[[]byte] {
+func (sf *KBusBase) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
 	sf.log.Debug("KBusBase.SendRequest(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.SendRequest():  topic='%v', bus already closed", topic)
 		sf.log.Err(err.Error())
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	res := sf.dictServe.SendRequest(topic, binReq)
 	if res.IsErr() {
 		err := fmt.Errorf("KBusBase.SendRequest(): topic='%v', err=\n\t%w", topic, res.Err())
 		sf.log.Err(err.Error())
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	return res
 }
 
 // RegisterServe -- регистрирует обработчики входящих запросов.
-func (sf *KBusBase) RegisterServe(handler mKt.IBusHandlerServe) mKt.IResult[bool] {
+func (sf *KBusBase) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
 	if handler == nil {
-		return mL1.NewErr[bool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
+		return mL0.NewErr[bool](fmt.Errorf("KBusBase.RegisterServe(): IBusHandlerServe==nil"))
 	}
 	sf.log.Debug("KBusBase.RegisterServe(): handler='%v'", handler.Name())
 	res := sf.dictServe.Register(handler)
 	if res.IsErr() {
 		err := fmt.Errorf("KBusBase.RegisterServe(): handler='%v', err=\n\t%w", handler.Name(), res.Err())
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Publish -- публикует сообщение в шину.
-func (sf *KBusBase) Publish(topic mKa.ATopic, binMsg []byte) mKt.IResult[bool] {
+func (sf *KBusBase) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[bool] {
 	sf.log.Debug("KBusBase.Publish(): topic='%v'", topic)
 	if !sf.IsWork_.Get() {
 		err := fmt.Errorf("KBusBase.Publish(): topic='%v',bus already closed", topic)
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	// Асинхронный запуск чтения
 	go sf.dictSub.Read(topic, binMsg)
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // IsWork -- возвращает признак работы шины.
@@ -176,6 +178,6 @@ func (sf *KBusBase) close() {
 		return
 	}
 	sf.IsWork_.Reset()
-	sf.Ctx_.Wg().Done(strBusBaseStream)
+	sf.Ctx_.Wg().Done(busBaseStreamName)
 	sf.log.Debug("KBusBase.close(): done")
 }

+ 20 - 6
v4/lev2/kbus_base/kbus_base_test.go

@@ -3,6 +3,7 @@ package kbus_base
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
@@ -16,11 +17,16 @@ type tester struct {
 	handServ *mock_hand_serve.MockHandlerServe
 }
 
+var (
+	qNameSub   = alias.NewATopic("topic_hand_sub")
+	qNameServe = alias.NewATopic("topic_hand_serv")
+)
+
 func TestKernelBusLocal(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub("topic_hand_sub", "mock_hand_sub"),
-		handServ: mock_hand_serve.NewMockHandlerServe("topic_hand_serv", "mock_hand_serv"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, "mock_hand_sub"),
+		handServ: mock_hand_serve.NewMockHandlerServe(qNameServe, "mock_hand_serv"),
 	}
 	sf.new()
 	sf.subBad1()
@@ -82,10 +88,14 @@ func (sf *tester) servBad1() {
 	}
 }
 
+var (
+	qName1 = alias.NewATopic("test_topic1")
+)
+
 // Нет такого топика.
 func (sf *tester) reqBad1() {
 	sf.t.Log("reqBad1")
-	res := sf.bus.SendRequest("test_topic1", []byte("test_msg"))
+	res := sf.bus.SendRequest(qName1, []byte("test_msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("reqBad1(): err==nil")
 	}
@@ -99,7 +109,7 @@ func (sf *tester) pubGood10() {
 			sf.t.Fatalf("pubGood10(): panic=%v", _panic)
 		}
 	}()
-	res := sf.bus.Publish("test_topic1", []byte("test_msg"))
+	res := sf.bus.Publish(qName1, []byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("pubGood10(): err=%v", res.Err())
 	}
@@ -136,6 +146,10 @@ func (sf *tester) new() {
 
 }
 
+var (
+	qNameA = alias.NewATopic("test_topic")
+)
+
 // Закрытие шины.
 func (sf *tester) close() {
 	sf.t.Log("close")
@@ -150,11 +164,11 @@ func (sf *tester) close() {
 	if res.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}
-	res = sf.bus.Publish("test_topic1", []byte("test_msg"))
+	res = sf.bus.Publish(qName1, []byte("test_msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}
-	res1 := sf.bus.SendRequest("test_topic", []byte("test_msg"))
+	res1 := sf.bus.SendRequest(qNameA, []byte("test_msg"))
 	if res1.IsOk() {
 		sf.t.Fatalf("close(): err==nil")
 	}

+ 29 - 28
v4/lev2/kbus_http/client_bus_http/client_bus_http.go

@@ -10,7 +10,8 @@ import (
 
 	"github.com/google/uuid"
 
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
@@ -33,29 +34,29 @@ type ClientBusHttp struct {
 }
 
 // NewClientBusHttp - -возвращает новый клиент HTTP-шины.
-func NewClientBusHttp(urlRemote string) mKt.IResult[mKt.IBusClient] {
+func NewClientBusHttp(urlRemote string) *mL0.Result[mKt.IBusClient] {
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("ClientBusHttp"))
 	log.Debug("NewClientBusHttp()")
 	if urlRemote == "" {
 		err := fmt.Errorf("NewClientBusHttp(): urlRemote is empty")
-		return mL1.NewErr[mKt.IBusClient](err)
+		return mL0.NewErr[mKt.IBusClient](err)
 	}
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("NewClientBusHttp(): in get ctx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[mKt.IBusClient](err)
+		return mL0.NewErr[mKt.IBusClient](err)
 	}
 	kCtx := resKernCtx.Val()
 	resLocal := safe_string.NewSafeStringGetenv("LOCAL_HTTP_URL")
 	if resLocal.IsErr() {
 		err := fmt.Errorf("NewClientBusHttp(): in get env LOCAL_HTTP_URL, err=\n\t%w", resLocal.Err())
-		return mL1.NewErr[mKt.IBusClient](err)
+		return mL0.NewErr[mKt.IBusClient](err)
 	}
 	urlLocal := resLocal.Val()
 	resBus := kbus_http.GetKernelBusHttp()
 	if resBus.IsErr() {
 		err := fmt.Errorf("NewClientBusHttp(): in get bus, err=\n\t%w", resBus.Err())
-		return mL1.NewErr[mKt.IBusClient](err)
+		return mL0.NewErr[mKt.IBusClient](err)
 	}
 	kBusHttp := resBus.Val()
 	lCtx := mL1.NewLocalCtx(kCtx.Ctx())
@@ -67,7 +68,7 @@ func NewClientBusHttp(urlRemote string) mKt.IResult[mKt.IBusClient] {
 		urlRemote: strings.TrimSuffix(urlRemote, "/"),
 		urlLocal:  strings.TrimSuffix(urlLocal.Get(), "/"),
 	}
-	return mL1.NewRes(mKt.IBusClient(sf))
+	return mL0.NewRes(mKt.IBusClient(sf))
 }
 
 // Unsubscribe -- отписывается от топика в дистанционной шине.
@@ -107,7 +108,7 @@ func (sf *ClientBusHttp) Unsubscribe(handler mKt.IBusHandlerSubscribe) {
 }
 
 // Subscribe -- подписывается на топик в дистанционной шине.
-func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult[bool] {
+func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) *mL0.Result[bool] {
 	_uuid, err := uuid.NewV6()
 	mL1.Hassert()(err == nil, "ClientBusHttp.Subscribe(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_sub.SubscribeReq{
@@ -125,28 +126,28 @@ func (sf *ClientBusHttp) Subscribe(handler mKt.IBusHandlerSubscribe) mKt.IResult
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): in make request, err=\n\t%w", err)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	resp := &msg_sub.SubscribeResp{}
 	err = json.Unmarshal(binBody, resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): in unmarshal response, err=\n\t%v", err)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	if resp.Status_ != "ok" {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := fmt.Errorf("ClientBusHttp.Subscribe(): resp uuid(%v) bad", resp.Uuid_)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	res := sf.bus.Subscribe(handler)
 	return res
 }
 
 // SendRequest -- отправляет в дистанционную шину запрос.
-func (sf *ClientBusHttp) SendRequest(topic mKa.ATopic, binReq []byte) mKt.IResult[[]byte] {
+func (sf *ClientBusHttp) SendRequest(topic *mKa.ATopic, binReq []byte) *mL0.Result[[]byte] {
 	_uuid, err := uuid.NewV6()
 	mL1.Hassert()(err == nil, "ClientBusHttp.SendRequest(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_serve.ServeReq{
@@ -164,40 +165,40 @@ func (sf *ClientBusHttp) SendRequest(topic mKa.ATopic, binReq []byte) mKt.IResul
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): in make request, err=\n\t%w", err)
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	resp := &msg_serve.ServeResp{}
 	err = json.Unmarshal(binBody, resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): in unmarshal response, err=\n\t%v", err)
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	if resp.Status_ != "ok" {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := fmt.Errorf("ClientBusHttp.SendRequest(): resp uuid(%v) bad", resp.Uuid_)
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
-	return mL1.NewRes(resp.BinResp_)
+	return mL0.NewRes(resp.BinResp_)
 }
 
 // RegisterServe -- регистрирует в локальной шине обработчик.
-func (sf *ClientBusHttp) RegisterServe(handler mKt.IBusHandlerServe) mKt.IResult[bool] {
+func (sf *ClientBusHttp) RegisterServe(handler mKt.IBusHandlerServe) *mL0.Result[bool] {
 	if handler == nil {
-		return mL1.NewErr[bool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
+		return mL0.NewErr[bool](fmt.Errorf("ClientBusHttp.RegisterServe(): handler==nil"))
 	}
 	res := sf.bus.RegisterServe(handler)
 	if res.IsErr() {
 		err := fmt.Errorf("ClientBusHttp.RegisterServe(): in register serve to bus, err=\n\t%v", res.Err())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Publish -- публикует сообщение в дистанционной шину.
-func (sf *ClientBusHttp) Publish(topic mKa.ATopic, binMsg []byte) mKt.IResult[bool] {
+func (sf *ClientBusHttp) Publish(topic *mKa.ATopic, binMsg []byte) *mL0.Result[bool] {
 	_uuid, err := uuid.NewV6()
 	mL1.Hassert()(err == nil, "ClientBusHttp.Publish(): in generate UUID v6, err=\n\t%v", err)
 	req := &msg_pub.PublishReq{
@@ -215,23 +216,23 @@ func (sf *ClientBusHttp) Publish(topic mKa.ATopic, binMsg []byte) mKt.IResult[bo
 	binBody, err := sf.makePost(hReq)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Publish(): in make request, err=\n\t%w", err)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	resp := &msg_pub.PublishResp{}
 	err = json.Unmarshal(binBody, resp)
 	if err != nil {
 		err := fmt.Errorf("ClientBusHttp.Publish(): in unmarshal response, err=\n\t%v", err)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	if resp.Status_ != "ok" {
 		err := fmt.Errorf("ClientBusHttp.Publish(): resp!='ok', err=\n\t%v", resp.Status_)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	if resp.Uuid_ != req.Uuid_ {
 		err := fmt.Errorf("ClientBusHttp.Publish(): resp uuid(%v) bad", resp.Uuid_)
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Единый обработчик запросов.

+ 22 - 8
v4/lev2/kbus_http/client_bus_http/client_bus_http_test.go

@@ -6,6 +6,7 @@ import (
 	"strings"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
@@ -31,9 +32,14 @@ type tester struct {
 	bus      *kbus_base.KBusBase
 }
 
+var (
+	qNameSub  = alias.NewATopic("test_topic_sub")
+	qNameServ = alias.NewATopic("test_topic_serv")
+)
+
 func TestClientBusHttp(t *testing.T) {
-	handSub := mock_hand_sub_http.NewMockHandSubHttp("test_topic_sub", baseUrl).(*mock_hand_sub_http.MockHandSubHttp)
-	handServ := mock_hand_serve.NewMockHandlerServe("test_topic_serv", "local_hook")
+	handSub := mock_hand_sub_http.NewMockHandSubHttp(qNameSub, baseUrl).(*mock_hand_sub_http.MockHandSubHttp)
+	handServ := mock_hand_serve.NewMockHandlerServe(qNameServ, "local_hook")
 	sf := &tester{
 		t:        t,
 		me:       MakeEnv(),
@@ -73,7 +79,7 @@ func (sf *tester) send() {
 
 func (sf *tester) sendGood1() {
 	sf.t.Log("sendGood1")
-	res := sf.cl.SendRequest("test_topic_serv", []byte("test msg 456"))
+	res := sf.cl.SendRequest(qNameServ, []byte("test msg 456"))
 	if res.IsErr() {
 		sf.t.Fatalf("sendGood1(): err=%v", res.Err())
 	}
@@ -98,16 +104,20 @@ func (sf *tester) sendBad2() {
 	defer func() {
 		sf.cl.urlRemote = urlRemote
 	}()
-	res := sf.cl.SendRequest("test_topic_serv", []byte("test msg"))
+	res := sf.cl.SendRequest(qNameServ, []byte("test msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("sendBad2(): err==nil")
 	}
 }
 
+var (
+	qNameBad = alias.NewATopic("test_bad_topic")
+)
+
 // Нет такого топика.
 func (sf *tester) sendBad1() {
 	sf.t.Log("sendBad1")
-	res := sf.cl.SendRequest("test_bad_topic", []byte("test msg"))
+	res := sf.cl.SendRequest(qNameBad, []byte("test msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("sendBad1(): err==nil")
 	}
@@ -165,7 +175,7 @@ func (sf *tester) pubBad2() {
 		}
 	}()
 	sf.handSub.BinMsg_ = []byte{}
-	res := sf.cl.Publish("test_topic_sub", []byte("test_msg_456"))
+	res := sf.cl.Publish(qNameSub, []byte("test_msg_456"))
 	if res.IsOk() {
 		if strings.Contains(res.Err().Error(), "topic='test_topic_sub',bus already closed") {
 			return
@@ -182,7 +192,7 @@ func (sf *tester) pubGood1() {
 		}
 	}()
 	sf.handSub.BinMsg_ = []byte{}
-	res := sf.cl.Publish("test_topic_sub", []byte("test_msg_456"))
+	res := sf.cl.Publish(qNameSub, []byte("test_msg_456"))
 	if res.IsErr() {
 		if strings.Contains(res.Err().Error(), "topic='test_topic_sub',bus already closed") {
 			return
@@ -200,6 +210,10 @@ func (sf *tester) pubGood1() {
 	}
 }
 
+var (
+	qNameTest = alias.NewATopic("test_topic")
+)
+
 // Левый адрес.
 func (sf *tester) pubBad1() {
 	sf.t.Log("pubBad1")
@@ -213,7 +227,7 @@ func (sf *tester) pubBad1() {
 			sf.t.Fatalf("pubBad1(): panic=%v", _panic)
 		}
 	}()
-	res := sf.cl.Publish("test_topic", []byte("test_msg"))
+	res := sf.cl.Publish(qNameTest, []byte("test_msg"))
 	if res.IsOk() {
 		sf.t.Fatalf("pubBad1(): err==nil")
 	}

+ 18 - 17
v4/lev2/kbus_http/kbus_http.go

@@ -6,8 +6,9 @@ import (
 	"net/http"
 	"sync"
 
-	"github.com/gofiber/fiber/v2"
+	"github.com/gofiber/fiber/v3"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
@@ -32,24 +33,24 @@ var (
 )
 
 // GetKernelBusHttp -- возвращает шину HTTP.
-func GetKernelBusHttp() mKt.IResult[mKt.IKernelBus] {
+func GetKernelBusHttp() *mL0.Result[mKt.IKernelBus] {
 	block.Lock()
 	defer block.Unlock()
 	if Bus_ != nil {
-		return mL1.NewRes(mKt.IKernelBus(Bus_))
+		return mL0.NewRes(mKt.IKernelBus(Bus_))
 	}
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kBusHttp"))
 	log.Debug("GetKernelBusHttp(): new")
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resKernCtx.Err())
-		return mL1.NewErr[mKt.IKernelBus](err)
+		return mL0.NewErr[mKt.IKernelBus](err)
 	}
 	kCtx := resKernCtx.Val()
 	resBus := kbus_base.GetKernelBusBase()
 	if resBus.IsErr() {
 		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resBus.Err())
-		return mL1.NewErr[mKt.IKernelBus](err)
+		return mL0.NewErr[mKt.IKernelBus](err)
 	}
 	sf := &kBusHttp{
 		KBusBase: resBus.Val(),
@@ -58,7 +59,7 @@ func GetKernelBusHttp() mKt.IResult[mKt.IKernelBus] {
 	resServ := kserv_http.GetKernelServHttp()
 	if resServ.IsErr() {
 		err := fmt.Errorf("GetKernelBusHttp(): err=\n\t%v", resServ.Err())
-		return mL1.NewErr[mKt.IKernelBus](err)
+		return mL0.NewErr[mKt.IKernelBus](err)
 	}
 	serv := resServ.Val()
 	fibApp := serv.Fiber()
@@ -69,21 +70,21 @@ func GetKernelBusHttp() mKt.IResult[mKt.IKernelBus] {
 	resSet := kCtx.Set("kernBus", sf, "GetKernelBusHttp(): http data bus")
 	if resSet.IsErr() {
 		sf.log.Err("GetKernelBusHttp(): err=\n\t%v", resSet.Err())
-		return mL1.NewErr[mKt.IKernelBus](resSet.Err())
+		return mL0.NewErr[mKt.IKernelBus](resSet.Err())
 	}
 	Bus_ = sf
-	return mL1.NewRes(mKt.IKernelBus(Bus_))
+	return mL0.NewRes(mKt.IKernelBus(Bus_))
 }
 
 // Входящий запрос HTTP на подписку.
-func (sf *kBusHttp) postSub(ctx *fiber.Ctx) error {
+func (sf *kBusHttp) postSub(ctx fiber.Ctx) error {
 	sf.log.Debug("postSub()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
 	ctx.Set("Content-type", "text/json")
 	ctx.Set("Cache-Control", "no-cache")
 	sf.log.Debug("postSub()")
 	req := &msg_sub.SubscribeReq{}
-	err := ctx.BodyParser(req)
+	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &msg_sub.SubscribeResp{
 			Status_: fmt.Sprintf("kernelBusHttp.postSub(): in parse request, err=\n\t%v\n", err),
@@ -117,13 +118,13 @@ func (sf *kBusHttp) processSubscribe(req *msg_sub.SubscribeReq) *msg_sub.Subscri
 }
 
 // Входящая публикация.
-func (sf *kBusHttp) postPublish(ctx *fiber.Ctx) error {
+func (sf *kBusHttp) postPublish(ctx fiber.Ctx) error {
 	sf.log.Debug("postPublish()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
 	ctx.Set("Content-type", "text/json")
 	ctx.Set("Cache-Control", "no-cache")
 	req := &msg_pub.PublishReq{}
-	err := ctx.BodyParser(req)
+	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &msg_pub.PublishResp{
 			Status_: fmt.Sprintf("kernelBusHttp.postPublish(): in parse request, err=\n\t%v\n", err),
@@ -155,13 +156,13 @@ func (sf *kBusHttp) processPublish(req *msg_pub.PublishReq) *msg_pub.PublishResp
 }
 
 // Входящий запрос.
-func (sf *kBusHttp) postSendRequest(ctx *fiber.Ctx) error {
+func (sf *kBusHttp) postSendRequest(ctx fiber.Ctx) error {
 	sf.log.Debug("postSendRequest()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
 	ctx.Set("Content-type", "text/json")
 	ctx.Set("Cache-Control", "no-cache")
 	req := &msg_serve.ServeReq{}
-	err := ctx.BodyParser(req)
+	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &msg_serve.ServeResp{
 			Status_: fmt.Sprintf("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
@@ -194,13 +195,13 @@ func (sf *kBusHttp) processSendRequest(req *msg_serve.ServeReq) *msg_serve.Serve
 }
 
 // Входящая отписка от топика по HTTP.
-func (sf *kBusHttp) postUnsub(ctx *fiber.Ctx) error {
+func (sf *kBusHttp) postUnsub(ctx fiber.Ctx) error {
 	sf.log.Debug("postUnsub()")
 	ctx.Set("Content-type", "text/html; charset=utf8")
 	ctx.Set("Content-type", "text/json")
 	ctx.Set("Cache-Control", "no-cache")
 	req := &msg_unsub.UnsubReq{}
-	err := ctx.BodyParser(req)
+	err := ctx.Bind().Body(req)
 	if err != nil {
 		resp := &msg_serve.ServeResp{
 			Status_: fmt.Sprintf("kernelBusHttp.postSendRequest(): err=\n\t%v", err),
@@ -223,7 +224,7 @@ func (sf *kBusHttp) processUnsubRequest(req *msg_unsub.UnsubReq) *msg_unsub.Unsu
 		Status_: "ok",
 		Uuid_:   req.Uuid_,
 	}
-	optHandler := sf.Ctx_.Get(string(req.Name_))
+	optHandler := sf.Ctx_.Get(req.Name_.Get())
 	if optHandler.IsNone() {
 		resp.Status_ = fmt.Sprintf("kernelBusHttp.processUnsubRequest(): not get handler(%v) from kernel ctx",
 			req.Name_)

+ 24 - 10
v4/lev2/kbus_http/kbus_http_test.go

@@ -8,6 +8,7 @@ import (
 	"strings"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_pub"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/kbus_msg/msg_serve"
@@ -25,11 +26,16 @@ type tester struct {
 	handServ *mock_hand_serve.MockHandlerServe
 }
 
+var (
+	qNameSub  = alias.NewATopic("topic_sub")
+	qNameServ = alias.NewATopic("topic_serv")
+)
+
 func TestKernelBusHttp(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub("topic_sub", "http://localhost:18200/bus/pub"),
-		handServ: mock_hand_serve.NewMockHandlerServe("topic_serv", "name_serv"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qNameSub, "http://localhost:18200/bus/pub"),
+		handServ: mock_hand_serve.NewMockHandlerServe(qNameServ, "name_serv"),
 	}
 	ctx := kctx.GetKernelCtx().Hassert("TestKernelBusHttp()")
 	ctx.Set("monolitName", "test_monolit", "comment").Hassert("TestKernelBusHttp()")
@@ -181,7 +187,7 @@ func (sf *tester) pub() {
 func (sf *tester) pubGood2() {
 	sf.t.Log("pubGood2")
 	req := &msg_pub.PublishReq{
-		Topic_:  "topic_sub",
+		Topic_:  qNameSub,
 		Uuid_:   "test_uuid",
 		BinMsg_: []byte("http_pub"),
 	}
@@ -247,7 +253,7 @@ func (sf *tester) pubBad2() {
 	defer Bus_.IsWork_.Set()
 
 	req := &msg_pub.PublishReq{
-		Topic_:  "topic_sub",
+		Topic_:  qNameSub,
 		Uuid_:   "test_uuid",
 		BinMsg_: []byte("test_pub"),
 	}
@@ -265,7 +271,7 @@ func (sf *tester) pubGood1() {
 		sf.t.Fatalf("pubGood1(): err=%v", res.Err())
 	}
 	req := &msg_pub.PublishReq{
-		Topic_:  "topic_sub",
+		Topic_:  qNameSub,
 		Uuid_:   "test_uuid",
 		BinMsg_: []byte("test_pub"),
 	}
@@ -309,7 +315,7 @@ func (sf *tester) sub() {
 func (sf *tester) subGood2() {
 	sf.t.Log("subGood2")
 	req := &msg_sub.SubscribeReq{
-		Topic_:   "topic_serv",
+		Topic_:   qNameServ,
 		Uuid_:    "test_uuid",
 		WebHook_: "http://localhost:18200/bus/pub/",
 	}
@@ -347,7 +353,7 @@ func (sf *tester) subGood2() {
 func (sf *tester) subBad3() {
 	sf.t.Log("subBad3")
 	req := &msg_sub.SubscribeReq{
-		Topic_:   "topic_serv",
+		Topic_:   qNameServ,
 		Uuid_:    "test_uuid",
 		WebHook_: "http://localhost:18200/bus/pub/",
 	}
@@ -369,7 +375,7 @@ func (sf *tester) subBad3() {
 func (sf *tester) subGood1() {
 	sf.t.Log("subGood1")
 	req := &msg_sub.SubscribeReq{
-		Topic_:   "topic_serv",
+		Topic_:   qNameServ,
 		Uuid_:    "test_uuid",
 		WebHook_: "http://localhost:18200/bus/",
 	}
@@ -381,11 +387,15 @@ func (sf *tester) subGood1() {
 	_ = Bus_.processSubscribe(req)
 }
 
+var (
+	qNameEmpty = alias.NewATopic("")
+)
+
 // Проверка кривых полей запроса в процессе подписки.
 func (sf *tester) subBad2() {
 	sf.t.Log("subBad2")
 	req := &msg_sub.SubscribeReq{
-		Topic_: "",
+		Topic_: qNameEmpty,
 	}
 	defer func() {
 		if _panic := recover(); _panic == nil {
@@ -507,11 +517,15 @@ func (sf *tester) reqGood1() {
 	}
 }
 
+var (
+	qNameBad = alias.NewATopic("bad_topic")
+)
+
 // Нет такого топика для запросов.
 func (sf *tester) reqBad3() {
 	sf.t.Log("reqBad3")
 	req := &msg_serve.ServeReq{
-		Topic_:  "bad_topic",
+		Topic_:  qNameBad,
 		Uuid_:   "test_uuid",
 		BinReq_: []byte("test_msg"),
 	}

+ 4 - 4
v4/lev2/kbus_local/client_bus_local/client_bus_local.go

@@ -4,8 +4,8 @@ package client_bus_local
 import (
 	"fmt"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
 )
 
@@ -15,14 +15,14 @@ type ClientBusLocal struct {
 }
 
 // NewClientBusLocal -- клиент локальной шины.
-func NewClientBusLocal() mKt.IResult[mKt.IBusClient] {
+func NewClientBusLocal() *mL0.Result[mKt.IBusClient] {
 	resLocal := kbus_local.GetKernelBusLocal()
 	if resLocal.IsErr() {
 		err := fmt.Errorf("NewClientBusLocal(): err=\n\t%w", resLocal.Err())
-		return mL1.NewErr[mKt.IBusClient](err)
+		return mL0.NewErr[mKt.IBusClient](err)
 	}
 	sf := &ClientBusLocal{
 		IKernelBus: resLocal.Val(),
 	}
-	return mL1.NewRes(mKt.IBusClient(sf))
+	return mL0.NewRes(mKt.IBusClient(sf))
 }

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

@@ -3,6 +3,7 @@ package client_bus_local
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
@@ -18,6 +19,10 @@ func TestClientBusLocal(t *testing.T) {
 	sf.new()
 }
 
+var (
+	qTopicLocal = alias.NewATopic("local_topic")
+)
+
 // Создание нового клиента.
 func (sf *tester) new() {
 	sf.t.Log("new")
@@ -25,7 +30,7 @@ func (sf *tester) new() {
 	if sf.cl == nil {
 		sf.t.Fatalf("new(): client==nil")
 	}
-	res := sf.cl.Publish("local_topic", []byte("test_msg"))
+	res := sf.cl.Publish(qTopicLocal, []byte("test_msg"))
 	if res.IsErr() {
 		sf.t.Fatalf("new(): err=%v", res.Err())
 	}

+ 5 - 6
v4/lev2/kbus_local/kbus_local.go

@@ -4,8 +4,7 @@ package kbus_local
 import (
 	"fmt"
 
-	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_base"
 )
 
@@ -19,17 +18,17 @@ var (
 )
 
 // GetKernelBusLocal -- возвращает локальную шину сообщений.
-func GetKernelBusLocal() mKt.IResult[*kernelBusLocal] {
+func GetKernelBusLocal() *mL0.Result[*kernelBusLocal] {
 	if bus != nil {
-		return mL1.NewRes(bus)
+		return mL0.NewRes(bus)
 	}
 	resBus := kbus_base.GetKernelBusBase()
 	if resBus.IsErr() {
 		err := fmt.Errorf("GetKernelBusLocal(): in get kernel bus base, err=\n\t%w", resBus.Err())
-		return mL1.NewErr[*kernelBusLocal](err)
+		return mL0.NewErr[*kernelBusLocal](err)
 	}
 	bus = &kernelBusLocal{
 		KBusBase: resBus.Val(),
 	}
-	return mL1.NewRes(bus)
+	return mL0.NewRes(bus)
 }

+ 8 - 2
v4/lev2/kbus_local/kbus_local_test.go

@@ -3,6 +3,7 @@ package kbus_local
 import (
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_serve"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/mock_hand_sub_local"
@@ -15,11 +16,16 @@ type tester struct {
 	handServ *mock_hand_serve.MockHandlerServe
 }
 
+var (
+	qTopicSub  = alias.NewATopic("topic_hand_sub")
+	qTopicServ = alias.NewATopic("topic_hand_serv")
+)
+
 func TestKernelBusLocal(t *testing.T) {
 	sf := &tester{
 		t:        t,
-		handSub:  mock_hand_sub_local.NewMockHandlerSub("topic_hand_sub", "mock_hand_sub"),
-		handServ: mock_hand_serve.NewMockHandlerServe("topic_hand_serv", "mock_hand_serv"),
+		handSub:  mock_hand_sub_local.NewMockHandlerSub(qTopicSub, "mock_hand_sub"),
+		handServ: mock_hand_serve.NewMockHandlerServe(qTopicServ, "mock_hand_serv"),
 	}
 	sf.new()
 }

+ 5 - 4
v4/lev2/kctx/kctx.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"sync"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kernel_keeper"
@@ -29,11 +30,11 @@ var (
 )
 
 // GetKernelCtx -- возвращает контекст ядра.
-func GetKernelCtx() mKt.IResult[*kCtx] {
+func GetKernelCtx() *mL0.Result[*kCtx] {
 	block.Lock()
 	defer block.Unlock()
 	if kernCtx != nil {
-		return mL1.NewRes(kernCtx)
+		return mL0.NewRes(kernCtx)
 	}
 	ctxBg := context.Background()
 	ctx, fnCancel := context.WithCancel(ctxBg)
@@ -45,7 +46,7 @@ func GetKernelCtx() mKt.IResult[*kCtx] {
 	resLocal := mL1.NewLocalCtx(sf.ctx)
 	if resLocal.IsErr() {
 		err := fmt.Errorf("GetKernelCtx(): in get local ctx, err=\n\t%w", resLocal.Err())
-		return mL1.NewErr[*kCtx](err)
+		return mL0.NewErr[*kCtx](err)
 	}
 	sf.ILocalCtx = resLocal.Val()
 	sf.log = sf.Log()
@@ -57,7 +58,7 @@ func GetKernelCtx() mKt.IResult[*kCtx] {
 	}
 	sf.kernKeeper = resKeep.Val()
 	kernCtx = sf
-	return mL1.NewRes(kernCtx)
+	return mL0.NewRes(kernCtx)
 }
 
 // Keeper -- возвращает сторож системных сигналов.

+ 11 - 8
v4/lev2/kernel_keeper/kernel_keeper.go

@@ -9,6 +9,8 @@ import (
 	"sync"
 	"syscall"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 )
@@ -25,28 +27,29 @@ type kernelKeeper struct {
 var (
 	kernKeep *kernelKeeper
 	block    sync.Mutex
+	qName    = alias.NewAStreamName("kernel_keeper")
 )
 
 // GetKernelKeeper -- возвращает новый сторож системных сигналов.
 func GetKernelKeeper(ctx context.Context, fnCancel func(),
-	wg mKt.IKernelWg) mKt.IResult[*kernelKeeper] {
+	wg mKt.IKernelWg) *mL0.Result[*kernelKeeper] {
 	block.Lock()
 	defer block.Unlock()
 	if kernKeep != nil {
 		kernKeep.log.Debug("GetKernelKeeper()")
-		return mL1.NewRes(kernKeep)
+		return mL0.NewRes(kernKeep)
 	}
 	if ctx == nil {
 		err := fmt.Errorf("NewKernelCtx(): ctx==nil")
-		return mL1.NewErr[*kernelKeeper](err)
+		return mL0.NewErr[*kernelKeeper](err)
 	}
 	if wg == nil {
 		err := fmt.Errorf("NewKernelCtx(): IKernelWg==nil")
-		return mL1.NewErr[*kernelKeeper](err)
+		return mL0.NewErr[*kernelKeeper](err)
 	}
 	if fnCancel == nil {
 		err := fmt.Errorf("NewKernelCtx(): fnCancel==nil")
-		return mL1.NewErr[*kernelKeeper](err)
+		return mL0.NewErr[*kernelKeeper](err)
 	}
 	sf := &kernelKeeper{
 		ctx:      ctx,
@@ -56,13 +59,13 @@ func GetKernelKeeper(ctx context.Context, fnCancel func(),
 		chSys_:   make(chan os.Signal, 2),
 	}
 	sf.log.Debug("GetKernelKeeper(): first run")
-	res := sf.wg.Add("kernel_keeper")
+	res := sf.wg.Add(qName)
 	res.Hassert("NewKernelCtx(): in add stream kernel keeper in IKernelWg")
 
 	go sf.run(sf.chSys_)
 	kernKeep = sf
 	_ = mKt.IKernelKeeper(sf)
-	return mL1.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Log -- возвращает лог сторожа системных сигналов.
@@ -85,6 +88,6 @@ func (sf *kernelKeeper) run(chSys chan os.Signal) {
 	case <-sf.ctx.Done(): // сигнал от приложения
 		sf.log.Debug("run(): cancel app context, err=\n\t%v\n", sf.ctx.Err())
 	}
-	sf.wg.Done("kernel_keeper")
+	sf.wg.Done(qName)
 	sf.log.Debug("run(): end")
 }

+ 17 - 18
v4/lev2/kmodule/kmodule.go

@@ -5,8 +5,10 @@ import (
 	"fmt"
 	"time"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kbus_local"
@@ -18,7 +20,7 @@ import (
 type kModule struct {
 	kCtx      mKt.IKernelCtx
 	ctx       mKt.ILocalCtx
-	name      mKa.AModuleName
+	name      *mKa.AModuleName
 	bus       mKt.IKernelBus
 	timePhase mKt.ISafeInt
 	strLive   mKt.ISafeString
@@ -26,26 +28,23 @@ type kModule struct {
 }
 
 // NewKernelModule -- возвращает новый модуль на основе ядра.
-func NewKernelModule(name mKa.AModuleName) mKt.IResult[mKt.IKernelModule] {
-	if name == "" {
-		err := fmt.Errorf("NewKernelModule(): name is empty")
-		return mL1.NewErr[mKt.IKernelModule](err)
-	}
+func NewKernelModule(name *mKa.AModuleName) *mL0.Result[mKt.IKernelModule] {
+	mL0.Hassert(name != nil, "NewKernelModule(): name==nil")
 	resCtx := kctx.GetKernelCtx()
 	if resCtx.IsErr() {
 		err := fmt.Errorf("NewKernelModule(): in get kernel ctx,err=%v", resCtx.Err())
-		return mL1.NewErr[mKt.IKernelModule](err)
+		return mL0.NewErr[mKt.IKernelModule](err)
 	}
 	kCtx := resCtx.Val()
 	resLocal := kbus_local.GetKernelBusLocal()
 	if resLocal.IsErr() {
 		err := fmt.Errorf("NewKernelModule(): in get kernel bus local,err=%v", resLocal.Err())
-		return mL1.NewErr[mKt.IKernelModule](err)
+		return mL0.NewErr[mKt.IKernelModule](err)
 	}
 	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	if resLocCtx.IsErr() {
 		err := fmt.Errorf("NewKernelModule(): in new local ctx,err=%v", resLocCtx.Err())
-		return mL1.NewErr[mKt.IKernelModule](err)
+		return mL0.NewErr[mKt.IKernelModule](err)
 	}
 	sf := &kModule{
 		kCtx:      kCtx,
@@ -57,7 +56,7 @@ func NewKernelModule(name mKa.AModuleName) mKt.IResult[mKt.IKernelModule] {
 		stat:      mod_stat.NewModStat(name),
 	}
 	go sf.sigLive()
-	return mL1.NewRes(mKt.IKernelModule(sf))
+	return mL0.NewRes(mKt.IKernelModule(sf))
 }
 
 // Stat -- возвращает статистику модуля.
@@ -81,7 +80,7 @@ func (sf *kModule) Run() {
 }
 
 // Name -- возвращает уникальное имя модуля.
-func (sf *kModule) Name() mKa.AModuleName {
+func (sf *kModule) Name() *mKa.AModuleName {
 	return sf.name
 }
 
@@ -99,9 +98,9 @@ func (sf *kModule) Live() string {
 // Сигнал жизни, каждые 5 сек публикует в шину метку.
 func (sf *kModule) sigLive() {
 	var (
-		topic  = sf.name + "_live"
+		topic  = alias.NewATopic(sf.name.Get() + "_live")
 		iPhase = 0
-		res    mKt.IResult[bool]
+		res    *mL0.Result[bool]
 	)
 	fnPhase := func() {
 		time.Sleep(time.Millisecond * time.Duration(sf.timePhase.Get()))
@@ -112,16 +111,16 @@ func (sf *kModule) sigLive() {
 			switch iPhase {
 			case 0:
 				sf.strLive.Set("|")
-				res = sf.bus.Publish(mKa.ATopic(topic), sf.strLive.Byte())
+				res = sf.bus.Publish(topic, sf.strLive.Byte())
 			case 1:
 				sf.strLive.Set("/")
-				res = sf.bus.Publish(mKa.ATopic(topic), sf.strLive.Byte())
+				res = sf.bus.Publish(topic, sf.strLive.Byte())
 			case 2:
 				sf.strLive.Set("-")
-				res = sf.bus.Publish(mKa.ATopic(topic), sf.strLive.Byte())
+				res = sf.bus.Publish(topic, sf.strLive.Byte())
 			case 3:
 				sf.strLive.Set("\\")
-				res = sf.bus.Publish(mKa.ATopic(topic), sf.strLive.Byte())
+				res = sf.bus.Publish(topic, sf.strLive.Byte())
 				iPhase = -1
 			}
 			res.Hassert("kModule.sigLive(): name=%v, in publish live", sf.Name())

+ 4 - 12
v4/lev2/kmodule/kmodule_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -75,14 +76,14 @@ func (sf *tester) run() {
 // Создание нового модуля ядра.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.newBad1()
 	sf.newGood1()
 }
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	sf.mod = NewKernelModule("test_module").Hassert("newGood1()")
-	if name := sf.mod.Name(); name != "test_module" {
+	modName := alias.NewAModuleName("test_module")
+	sf.mod = NewKernelModule(modName).Hassert("newGood1()")
+	if name := sf.mod.Name(); name.Get() != "test_module" {
 		sf.t.Fatalf("newGood1(): name(%v)!='test_module'", name)
 	}
 	if ctx := sf.mod.Ctx(); ctx == nil {
@@ -94,12 +95,3 @@ func (sf *tester) newGood1() {
 	_ = sf.mod.Stat()
 	_ = sf.mod.Live()
 }
-
-// Нет имени модуля.
-func (sf *tester) newBad1() {
-	sf.t.Log("newBad1")
-	res := NewKernelModule("")
-	if res.IsOk() {
-		sf.t.Fatalf("newBad1(): err==nil")
-	}
-}

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

@@ -11,8 +11,8 @@ package mod_stat
 import (
 	"time"
 
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule/mod_stat/mod_stat_day"
@@ -25,12 +25,12 @@ type ModStat struct {
 	timeMinute mKt.ISafeInt             // Интервал ожидания минутного таймера, мсек
 	statMin    *mod_stat_day.ModStatDay // Объект статистики 60 минут
 	statDay    *mod_stat_day.ModStatDay // Объект статистики за последние 24 часа
-	name       mKa.AModuleName
+	name       *mKa.AModuleName
 }
 
 // NewModStat -- возвращает новую статистику модуля.
-func NewModStat(name mKa.AModuleName) *ModStat {
-	mKh.Hassert(name != "", "NewModuleStat(): name module is empty")
+func NewModStat(name *mKa.AModuleName) *ModStat {
+	mKh.Hassert(name != nil, "NewModuleStat(): name==nil")
 	sf := &ModStat{
 		statSec:    mod_stat_sec.NewModStatSec(),
 		statMin:    mod_stat_day.NewModStatDay(),

+ 4 - 13
v4/lev2/kmodule/mod_stat/mod_stat_test.go

@@ -3,6 +3,8 @@ package mod_stat
 import (
 	"testing"
 	"time"
+
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 )
 
 type tester struct {
@@ -27,13 +29,13 @@ func (sf *tester) event() {
 // Создание статистики модуля.
 func (sf *tester) new() {
 	sf.t.Log("new")
-	sf.newBad1()
 	sf.newGood1()
 }
 
 func (sf *tester) newGood1() {
 	sf.t.Log("newGood1")
-	sf.stat = NewModStat("test")
+	modName := alias.NewAModuleName("test")
+	sf.stat = NewModStat(modName)
 	// Обязательно установить время сразу, для покрытия тестами
 	sf.stat.timeMinute.Set(1)
 	sf.stat.Add(23)
@@ -47,14 +49,3 @@ func (sf *tester) newGood1() {
 		sf.t.Fatalf("newGood1(): svg is empty")
 	}
 }
-
-// Нет имени статистики.
-func (sf *tester) newBad1() {
-	sf.t.Log("newBad1")
-	defer func() {
-		if _panic := recover(); _panic == nil {
-			sf.t.Fatalf("newBad1(): panic==nil")
-		}
-	}()
-	_ = NewModStat("")
-}

+ 19 - 18
v4/lev2/kmonolit/kmonolit.go

@@ -4,8 +4,9 @@ package kmonolit
 import (
 	"fmt"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	mKa "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -20,7 +21,7 @@ type kMonolit struct {
 	isLocal bool
 	isWork  mKt.ISafeBool
 	isEnd   mKt.ISafeBool
-	dict    map[mKa.AModuleName]mKt.IKernelModule // Словарь модулей монолита
+	dict    map[*mKa.AModuleName]mKt.IKernelModule // Словарь модулей монолита
 }
 
 var (
@@ -28,35 +29,35 @@ var (
 )
 
 // GetMonolit -- возвращает монолит.
-func GetMonolit(name string) mKt.IResult[*kMonolit] {
+func GetMonolit(name string) *mL0.Result[*kMonolit] {
 	if mon != nil {
-		return mL1.NewRes(mon)
+		return mL0.NewRes(mon)
 	}
 	mKh.Hassert(name != "", "NewMonolit(): name is empty")
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("GetMonolit(): err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[*kMonolit](err)
+		return mL0.NewErr[*kMonolit](err)
 	}
 	kCtx := resKernCtx.Val()
 	res := kCtx.Get("isLocal")
 	if res.IsNone() {
 		err := fmt.Errorf("GetMonolit(): in get from kernCtx isLocal -- not found")
-		return mL1.NewErr[*kMonolit](err)
+		return mL0.NewErr[*kMonolit](err)
 	}
 	isLocalCtx := res.Val()
 	isLocal := isLocalCtx.Val().(bool)
 	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	if resLocCtx.IsErr() {
 		err := fmt.Errorf("GetMonolit(): in new local_ctx, err=\n\t%w", resLocCtx.Err())
-		return mL1.NewErr[*kMonolit](err)
+		return mL0.NewErr[*kMonolit](err)
 	}
 	lCtx := resLocCtx.Val()
 	sf := &kMonolit{
 		kCtx:    kCtx,
 		lCtx:    lCtx,
 		name:    name,
-		dict:    map[mKa.AModuleName]mKt.IKernelModule{},
+		dict:    map[*mKa.AModuleName]mKt.IKernelModule{},
 		isWork:  mL1.NewSafeBool(),
 		isEnd:   mL1.NewSafeBool(),
 		isLocal: isLocal,
@@ -65,16 +66,16 @@ func GetMonolit(name string) mKt.IResult[*kMonolit] {
 	resSet := sf.kCtx.Set("monolitName", name, "name of monolit")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolitName, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[*kMonolit](err)
+		return mL0.NewErr[*kMonolit](err)
 	}
 	resSet = sf.kCtx.Set("monolit", sf, "monolit-app")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetMonolit(): in set to kernCtx monolit-app, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[*kMonolit](err)
+		return mL0.NewErr[*kMonolit](err)
 	}
 	mon = sf
 	_ = mKt.IKernelMonolit(sf)
-	return mL1.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Ctx -- возвращает контекст монолита.
@@ -93,16 +94,16 @@ func (sf *kMonolit) Name() string {
 }
 
 // Add -- добавляет модуль в монолит.
-func (sf *kMonolit) Add(module mKt.IKernelModule) mKt.IResult[bool] {
+func (sf *kMonolit) Add(module mKt.IKernelModule) *mL0.Result[bool] {
 	sf.kCtx.RLock()
 	defer sf.kCtx.RUnlock()
 	if module == nil {
-		return mL1.NewErr[bool](fmt.Errorf("kMonolit.Add(): module==nil"))
+		return mL0.NewErr[bool](fmt.Errorf("kMonolit.Add(): module==nil"))
 	}
 	_, isOk := sf.dict[module.Name()]
 	if isOk {
 		err := fmt.Errorf("kMonolit.Add(): module(%v) already exists", module.Name())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
 	sf.dict[module.Name()] = module
 	sf.log.Debug("kMonolit.Add(): module='%v'", module.Name())
@@ -111,13 +112,13 @@ func (sf *kMonolit) Add(module mKt.IKernelModule) mKt.IResult[bool] {
 		sf.log.Debug("kMonolit.Add(): module='%v' is run", module.Name())
 	}
 	key := fmt.Sprintf("module_%v", len(sf.dict))
-	moduleName := string(module.Name())
-	resSet := sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName)
+	moduleName := module.Name()
+	resSet := sf.lCtx.Set(key, module, "kMonolit.Add(): module="+moduleName.Get())
 	if resSet.IsErr() {
 		err := fmt.Errorf("kMonolit.Add(): in set module(%v) to kernel ctx, err=\n\t%w", moduleName, resSet.Err())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Run -- запускает монолит в работу.

+ 7 - 4
v4/lev2/kmonolit/kmonolit_test.go

@@ -4,8 +4,9 @@ import (
 	"os"
 	"testing"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
+	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -63,7 +64,7 @@ type mod struct {
 	IKernelModule
 }
 
-func newMod(name AModuleName) IKernelModule {
+func newMod(name *AModuleName) IKernelModule {
 	sf := &mod{
 		IKernelModule: kmodule.NewKernelModule(name).Hassert("newMod()"),
 	}
@@ -74,13 +75,15 @@ func (sf *mod) Run() {}
 
 func (sf *tester) addGood1() {
 	sf.t.Log("addGood1")
-	mod := newMod("test_module")
+	modName := alias.NewAModuleName("test_module")
+	mod := newMod(modName)
 	sf.mon.Add(mod).Hassert("addGood1()")
 }
 
 func (sf *tester) run() {
 	sf.t.Log("run")
-	mod := newMod("test_mod1")
+	modName := alias.NewAModuleName("test_mod1")
+	mod := newMod(modName)
 	sf.mon.Add(mod).Hassert("run()")
 	sf.mon.Run()
 	isWork := sf.mon.IsWork()

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

@@ -10,19 +10,21 @@ import (
 	"sync"
 	"time"
 
-	"github.com/gofiber/fiber/v2"
 	"github.com/gofiber/fiber/v2/middleware/compress"
 	"github.com/gofiber/fiber/v2/middleware/filesystem"
 	"github.com/gofiber/fiber/v2/middleware/monitor"
+	"github.com/gofiber/fiber/v3"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-const (
-	streamName = "kernel_server_http" // Контрольная строка для ожидателя потока
+var (
+	streamName = alias.NewAStreamName("kernel_server_http") // Контрольная строка для ожидателя потока
 )
 
 // kServHttp -- встроенный HTTP-сервер.
@@ -58,34 +60,32 @@ func getParams() (string, mKt.ILogBuf, mKt.IKernelCtx) {
 }
 
 // GetKernelServHttp -- возвращает  встроенный HTTP-сервер.
-func GetKernelServHttp() mKt.IResult[mKt.IKernelServerHttp] {
+func GetKernelServHttp() *mL0.Result[mKt.IKernelServerHttp] {
 	block.Lock()
 	defer block.Unlock()
 	if kernServHttp != nil {
 		kernServHttp.log.Debug("GetKernelServHttp()")
-		return mL1.NewRes(mKt.IKernelServerHttp(kernServHttp))
+		return mL0.NewRes(mKt.IKernelServerHttp(kernServHttp))
 	}
 	strLocalUrl, log, kCtx := getParams()
 
 	optMonolit := kCtx.Get("monolitName")
 	if optMonolit.IsNone() {
 		err := fmt.Errorf("GetKernelServHttp(): not have monolit name from kCtx")
-		return mL1.NewErr[mKt.IKernelServerHttp](err)
+		return mL0.NewErr[mKt.IKernelServerHttp](err)
 	}
 	strMonolit := optMonolit.Val().Val().(string)
 	confFiber := fiber.Config{
-		ServerHeader:      strMonolit,
-		UnescapePath:      true,
-		ReadTimeout:       time.Second * 15,
-		WriteTimeout:      time.Second * 15,
-		AppName:           strMonolit,
-		Network:           "tcp4",
-		EnablePrintRoutes: true,
+		ServerHeader: strMonolit,
+		UnescapePath: true,
+		ReadTimeout:  time.Second * 15,
+		WriteTimeout: time.Second * 15,
+		AppName:      strMonolit,
 	}
 	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	if resLocCtx.IsErr() {
 		err := fmt.Errorf("GetKernelServHttp(): in get LocalCtx, err=\n\t%w", resLocCtx.Err())
-		return mL1.NewErr[mKt.IKernelServerHttp](err)
+		return mL0.NewErr[mKt.IKernelServerHttp](err)
 	}
 	sf := &kServHttp{
 		kCtx:     kCtx,
@@ -111,15 +111,15 @@ func GetKernelServHttp() mKt.IResult[mKt.IKernelServerHttp] {
 	resSet := kCtx.Set("fiberApp", sf.fiberApp, "GetKernelServHttp() internal fiber app")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelServHttp(): in set fiber app, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[mKt.IKernelServerHttp](err)
+		return mL0.NewErr[mKt.IKernelServerHttp](err)
 	}
 	kernServHttp = sf
 	resSet = kCtx.Set("kServHttp", kernServHttp, "kServHttp")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelServHttp(): in set kernServHttp, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[mKt.IKernelServerHttp](err)
+		return mL0.NewErr[mKt.IKernelServerHttp](err)
 	}
-	return mL1.NewRes(mKt.IKernelServerHttp(kernServHttp))
+	return mL0.NewRes(mKt.IKernelServerHttp(kernServHttp))
 }
 
 // IsWork -- возвращает признак работы.

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

@@ -7,6 +7,7 @@ import (
 	"sync"
 	"time"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -26,11 +27,11 @@ var (
 )
 
 // GetKservHttpStd -- возвращает HTTP-сервер на стандартной библиотеке.
-func GetKservHttpStd() mKt.IResult[*kServHttpStd] {
+func GetKservHttpStd() *mL0.Result[*kServHttpStd] {
 	mu.Lock()
 	defer mu.Unlock()
 	if kServ != nil {
-		return mL1.NewRes(kServ)
+		return mL0.NewRes(kServ)
 	}
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kServHttpStd"))
 	log.Debug("GetKservHttpStd()")
@@ -39,7 +40,7 @@ func GetKservHttpStd() mKt.IResult[*kServHttpStd] {
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("GetKservHttpStd(): in get KernelCtx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[*kServHttpStd](err)
+		return mL0.NewErr[*kServHttpStd](err)
 	}
 	kCtx := resKernCtx.Val()
 	sf := &kServHttpStd{
@@ -48,7 +49,7 @@ func GetKservHttpStd() mKt.IResult[*kServHttpStd] {
 		port: resPort.Val().Get(),
 	}
 	kServ = sf
-	return mL1.NewRes(sf)
+	return mL0.NewRes(sf)
 }
 
 // Run -- запускает сервер вы работу.

+ 22 - 20
v4/lev2/kstore_kv/kstore_kv.go

@@ -9,14 +9,16 @@ import (
 
 	"github.com/dgraph-io/badger/v4"
 
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
 )
 
-const (
-	storeStreamName = "kstore_kv" // Имя потока для ожидателя потоков
+var (
+	storeStreamName = alias.NewAStreamName("kstore_kv") // Имя потока для ожидателя потоков
 )
 
 // kStoreKv -- локальное хранилище ядра.
@@ -37,24 +39,24 @@ var (
 )
 
 // GetKernelStore -- возвращает новое локальное хранилище ядра.
-func GetKernelStore() mKt.IResult[*kStoreKv] {
+func GetKernelStore() *mL0.Result[*kStoreKv] {
 	block.Lock()
 	defer block.Unlock()
 	if kernStore != nil {
 		kernStore.log.Debug("GetKernelStore()")
-		return mL1.NewRes(kernStore)
+		return mL0.NewRes(kernStore)
 	}
 	resKernCtx := kctx.GetKernelCtx()
 	if resKernCtx.IsErr() {
 		err := fmt.Errorf("GetKernelStore(): in get kernel ctx, err=\n\t%w", resKernCtx.Err())
-		return mL1.NewErr[*kStoreKv](err)
+		return mL0.NewErr[*kStoreKv](err)
 	}
 	kCtx := resKernCtx.Val()
 	log := mL1.NewLogBuf(mL1.OptIsTerm(true), mL1.OptPrefix("kStoreKv"))
 	resLocCtx := mL1.NewLocalCtx(kCtx.Ctx())
 	if resLocCtx.IsErr() {
 		err := fmt.Errorf("GetKernelStore(): in get local ctx, err=\n\t%w", resLocCtx.Err())
-		return mL1.NewErr[*kStoreKv](err)
+		return mL0.NewErr[*kStoreKv](err)
 	}
 	sf := &kStoreKv{
 		kCtx:   kCtx,
@@ -68,9 +70,9 @@ func GetKernelStore() mKt.IResult[*kStoreKv] {
 	resSet := kCtx.Set("kernStoreKV", kernStore, "fast KV store on Badger")
 	if resSet.IsErr() {
 		err := fmt.Errorf("GetKernelStore(): in set kernel store KV to kernel ctx, err=\n\t%w", resSet.Err())
-		return mL1.NewErr[*kStoreKv](err)
+		return mL0.NewErr[*kStoreKv](err)
 	}
-	return mL1.NewRes(kernStore)
+	return mL0.NewRes(kernStore)
 }
 
 // Log -- возвращает локальный лог.
@@ -79,7 +81,7 @@ func (sf *kStoreKv) Log() mKt.ILogBuf {
 }
 
 // Set -- устанавливает значение по ключу.
-func (sf *kStoreKv) Set(key string, val []byte) mKt.IResult[bool] {
+func (sf *kStoreKv) Set(key string, val []byte) *mL0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Set(): key='%v'", key)
@@ -91,13 +93,13 @@ func (sf *kStoreKv) Set(key string, val []byte) mKt.IResult[bool] {
 	if err != nil {
 		err := fmt.Errorf("Set(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Get -- возвращает значение по ключу.
-func (sf *kStoreKv) Get(key string) mKt.IResult[[]byte] {
+func (sf *kStoreKv) Get(key string) *mL0.Result[[]byte] {
 	sf.RLock()
 	defer sf.RUnlock()
 	sf.log.Debug("Get(): key='%v'", key)
@@ -114,13 +116,13 @@ func (sf *kStoreKv) Get(key string) mKt.IResult[[]byte] {
 	if err != nil {
 		err := fmt.Errorf("Get(): key=%v, err=\n\t%v", key, err)
 		sf.log.Err(err.Error())
-		return mL1.NewErr[[]byte](err)
+		return mL0.NewErr[[]byte](err)
 	}
-	return mL1.NewRes(binVal)
+	return mL0.NewRes(binVal)
 }
 
 // ByPrefix -- фильтрует ключи по префиксу.
-func (sf *kStoreKv) ByPrefix(prefix string) mKt.IResult[[]string] {
+func (sf *kStoreKv) ByPrefix(prefix string) *mL0.Result[[]string] {
 	var (
 		binKey []byte
 		lstKey = []string{}
@@ -147,13 +149,13 @@ func (sf *kStoreKv) ByPrefix(prefix string) mKt.IResult[[]string] {
 	err := sf.db.View(fnPrefix)
 	if err != nil {
 		err := fmt.Errorf("ByPrefix(): in find, err=\n\t%w", err)
-		return mL1.NewErr[[]string](err)
+		return mL0.NewErr[[]string](err)
 	}
-	return mL1.NewRes(lstKey)
+	return mL0.NewRes(lstKey)
 }
 
 // Delete -- удалить ключ из хранилища.
-func (sf *kStoreKv) Delete(key string) mKt.IResult[bool] {
+func (sf *kStoreKv) Delete(key string) *mL0.Result[bool] {
 	sf.Lock()
 	defer sf.Unlock()
 	sf.log.Debug("Delete(): key='%v'", key)
@@ -165,9 +167,9 @@ func (sf *kStoreKv) Delete(key string) mKt.IResult[bool] {
 	if err != nil {
 		err := fmt.Errorf("Delete(): key=%v, err=\n\t%w", key, err)
 		sf.log.Err(err.Error())
-		return mL1.NewErr[bool](err)
+		return mL0.NewErr[bool](err)
 	}
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Открывает базу при создании.

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

@@ -5,6 +5,7 @@ import (
 	"testing"
 	"time"
 
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
@@ -107,16 +108,20 @@ func (sf *tester) set() {
 	}
 }
 
+var (
+	qName = alias.NewAStreamName("123")
+)
+
 // Закрытие хранилища.
 func (sf *tester) close() {
 	sf.t.Log("close")
-	res := sf.wg.Add("123")
+	res := sf.wg.Add(qName)
 	if res.IsErr() {
 		sf.t.Fatalf("close(): err=%v", res.Err())
 	}
 	sf.ctx.Cancel()
 	time.Sleep(time.Millisecond * 20)
-	go sf.wg.Done("123")
+	go sf.wg.Done(qName)
 	sf.wg.Wait()
 	kernStore.close()
 	res1 := kernStore.ByPrefix("test")

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

@@ -5,50 +5,50 @@ import (
 	"fmt"
 	"sync"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
-	mL1 "gitp78su.ipnodns.ru/svi/kern/v4/lev1"
 )
 
 // DictRec -- потокобезопасный словарь KV-бакета.
 type DictRec struct {
-	dict  map[kalias.AKey]mKt.IRecKv
+	dict  map[*alias.AStoreKey]mKt.IRecKv
 	block sync.RWMutex
 }
 
 // NewDictRec -- создание нового потокобезопасного словаря KV.
 func NewDictRec() *DictRec {
 	sf := &DictRec{
-		dict: map[kalias.AKey]mKt.IRecKv{},
+		dict: map[*alias.AStoreKey]mKt.IRecKv{},
 	}
 	_ = mKt.IDictRec(sf)
 	return sf
 }
 
 // Get -- получение значения по ключу.
-func (sf *DictRec) Get(key kalias.AKey) mKt.IOption[mKt.IRecKv] {
+func (sf *DictRec) Get(key *alias.AStoreKey) *mL0.Option[mKt.IRecKv] {
 	sf.block.RLock()
 	defer sf.block.RUnlock()
 	rec, isOk := sf.dict[key]
 	if !isOk {
-		return mL1.NewNone[mKt.IRecKv]()
+		return mL0.NewNone[mKt.IRecKv]()
 	}
-	return mL1.NewOpt(rec)
+	return mL0.NewOpt(rec)
 }
 
 // Set -- установка значения по ключу.
-func (sf *DictRec) Set(rec mKt.IRecKv) mKt.IResult[bool] {
+func (sf *DictRec) Set(rec mKt.IRecKv) *mL0.Result[bool] {
 	if rec == nil {
-		return mL1.NewErr[bool](fmt.Errorf("DictRec.Set(): rec is nil"))
+		return mL0.NewErr[bool](fmt.Errorf("DictRec.Set(): rec is nil"))
 	}
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	sf.dict[rec.Meta().Key()] = rec
-	return mL1.NewRes(true)
+	return mL0.NewRes(true)
 }
 
 // Del -- удаление значения по ключу.
-func (sf *DictRec) Del(key kalias.AKey) {
+func (sf *DictRec) Del(key *alias.AStoreKey) {
 	sf.block.Lock()
 	defer sf.block.Unlock()
 	delete(sf.dict, key)

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

@@ -3,7 +3,7 @@ package dict_rec
 import (
 	"testing"
 
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv_std/rec_kv"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev2/kstore_kv_std/rec_meta"
@@ -52,8 +52,9 @@ func (sf *tester) set_good1() {
 }
 
 // Возвращает новую запись для тестов.
-func (sf *tester) new_rec(key kalias.AKey) IRecKv {
-	meta := rec_meta.NewRecMeta(key)
+func (sf *tester) new_rec(key string) IRecKv {
+	_key := alias.NewAStoreKey(key)
+	meta := rec_meta.NewRecMeta(_key)
 	val := rec_val.NewRecVal(meta.Key(), []byte(key+"_val"))
 	rec := rec_kv.NewRecKv(meta, val)
 	return rec

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

@@ -2,8 +2,8 @@
 package kv_bucket_base
 
 import (
+	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
-	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/kalias"
 	"gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
 )
 
@@ -23,15 +23,15 @@ var (
 // Он должен быть разумным значением (например, до 100 МБ).
 // Как только бакет заполнится, он будет вытеснен на диск.
 type KvBucketBase struct {
-	Name_      string                        `json:"name"`       // Имя бакета
-	Level_     int                           `json:"level"`      // Уровень бакета
-	Number_    int                           `json:"num"`        // Номер бакета
-	Size_      int64                         `json:"size"`       // Размер бакета
-	SizeLimit_ int64                         `json:"size_limit"` // Лимит размера бакета
-	CreatedAt_ string                        `json:"created_at"` // Время создания бакета
-	UpdatedAt_ string                        `json:"updated_at"` // Время обновления бакета
-	Vers_      int                           `json:"vers"`       // Версия бакета
-	dictRec    map[kalias.AKey]ktypes.IRecKv // Словарь для хранения данных
+	Name_      string                            `json:"name"`       // Имя бакета
+	Level_     int                               `json:"level"`      // Уровень бакета
+	Number_    int                               `json:"num"`        // Номер бакета
+	Size_      int64                             `json:"size"`       // Размер бакета
+	SizeLimit_ int64                             `json:"size_limit"` // Лимит размера бакета
+	CreatedAt_ *alias.ATime                      `json:"created_at"` // Время создания бакета
+	UpdatedAt_ string                            `json:"updated_at"` // Время обновления бакета
+	Vers_      int                               `json:"vers"`       // Версия бакета
+	dictRec    map[alias.AStoreKey]ktypes.IRecKv // Словарь для хранения данных
 }
 
 // NewKvBucketBase -- создание нового базового бакета хранилища KV.
@@ -43,8 +43,8 @@ func NewKvBucketBase(name string, level int, number int) *KvBucketBase {
 		Name_:      name,
 		Level_:     level,
 		Number_:    number,
-		dictRec:    map[kalias.AKey]ktypes.IRecKv{},
-		CreatedAt_: string(helpers.TimeNowStr()),
+		dictRec:    map[alias.AStoreKey]ktypes.IRecKv{},
+		CreatedAt_: alias.NewATime(),
 		UpdatedAt_: "",
 	}
 	return sf

Some files were not shown because too many files changed in this diff