@voxgig/sdkgen 4.32.0 → 4.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/bin/voxgig-sdkgen +1 -1
  2. package/dist/helpers/naming.js +1 -1
  3. package/dist/helpers/naming.js.map +1 -1
  4. package/dist/tsconfig.tsbuildinfo +1 -1
  5. package/model/sdkgen.aontu +7 -1
  6. package/package.json +1 -1
  7. package/project/.sdk/model/feature/debug.aontu +3 -1
  8. package/project/.sdk/src/cmp/c/PrepareAuth_c.ts +8 -28
  9. package/project/.sdk/src/cmp/c/TestClean_c.ts +774 -0
  10. package/project/.sdk/src/cmp/c/Test_c.ts +3 -0
  11. package/project/.sdk/src/cmp/c/fragment/Entity.fragment.c +16 -5
  12. package/project/.sdk/src/cmp/c/fragment/Main.fragment.c +1 -1
  13. package/project/.sdk/src/cmp/clojure/PrepareAuth_clojure.ts +3 -0
  14. package/project/.sdk/src/cmp/clojure/TestClean_clojure.ts +473 -0
  15. package/project/.sdk/src/cmp/clojure/Test_clojure.ts +6 -0
  16. package/project/.sdk/src/cmp/clojure/fragment/Entity.fragment.clj +18 -8
  17. package/project/.sdk/src/cmp/cpp/PrepareAuth_cpp.ts +3 -0
  18. package/project/.sdk/src/cmp/cpp/TestClean_cpp.ts +782 -0
  19. package/project/.sdk/src/cmp/cpp/TestEntity_cpp.ts +1 -1
  20. package/project/.sdk/src/cmp/cpp/Test_cpp.ts +2 -0
  21. package/project/.sdk/src/cmp/csharp/PrepareAuth_csharp.ts +3 -0
  22. package/project/.sdk/src/cmp/csharp/TestClean_csharp.ts +887 -0
  23. package/project/.sdk/src/cmp/csharp/Test_csharp.ts +2 -0
  24. package/project/.sdk/src/cmp/csharp/fragment/EntityBase.fragment.cs +68 -4
  25. package/project/.sdk/src/cmp/csharp/fragment/Main.fragment.cs +8 -2
  26. package/project/.sdk/src/cmp/csharp/fragment/SdkError.fragment.cs +49 -0
  27. package/project/.sdk/src/cmp/elixir/PrepareAuth_elixir.ts +3 -0
  28. package/project/.sdk/src/cmp/elixir/Schema_elixir.ts +20 -10
  29. package/project/.sdk/src/cmp/elixir/TestClean_elixir.ts +666 -0
  30. package/project/.sdk/src/cmp/elixir/Test_elixir.ts +4 -0
  31. package/project/.sdk/src/cmp/elixir/fragment/Main.fragment.ex +1 -1
  32. package/project/.sdk/src/cmp/elixir/fragment/Pipeline.fragment.ex +14 -2
  33. package/project/.sdk/src/cmp/go/PrepareAuth_go.ts +3 -0
  34. package/project/.sdk/src/cmp/go/TestClean_go.ts +804 -0
  35. package/project/.sdk/src/cmp/go/Test_go.ts +3 -0
  36. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +54 -4
  37. package/project/.sdk/src/cmp/go/fragment/Main.fragment.go +27 -2
  38. package/project/.sdk/src/cmp/java/PrepareAuth_java.ts +3 -0
  39. package/project/.sdk/src/cmp/java/TestClean_java.ts +884 -0
  40. package/project/.sdk/src/cmp/java/Test_java.ts +2 -0
  41. package/project/.sdk/src/cmp/java/fragment/EntityBase.fragment.java +56 -11
  42. package/project/.sdk/src/cmp/java/fragment/SdkError.fragment.java +36 -3
  43. package/project/.sdk/src/cmp/js/PrepareAuth_js.ts +3 -0
  44. package/project/.sdk/src/cmp/js/TestClean_js.ts +458 -0
  45. package/project/.sdk/src/cmp/js/Test_js.ts +2 -0
  46. package/project/.sdk/src/cmp/js/fragment/EntityBase.fragment.js +5 -4
  47. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +7 -1
  48. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +7 -1
  49. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +7 -1
  50. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +7 -1
  51. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +7 -1
  52. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +11 -2
  53. package/project/.sdk/src/cmp/js/fragment/SdkError.fragment.js +17 -1
  54. package/project/.sdk/src/cmp/kotlin/Package_kotlin.ts +5 -0
  55. package/project/.sdk/src/cmp/kotlin/PrepareAuth_kotlin.ts +3 -0
  56. package/project/.sdk/src/cmp/kotlin/TestClean_kotlin.ts +654 -0
  57. package/project/.sdk/src/cmp/kotlin/Test_kotlin.ts +3 -0
  58. package/project/.sdk/src/cmp/kotlin/fragment/EntityBase.fragment.kt +44 -11
  59. package/project/.sdk/src/cmp/kotlin/fragment/SdkError.fragment.kt +31 -0
  60. package/project/.sdk/src/cmp/lua/PrepareAuth_lua.ts +3 -0
  61. package/project/.sdk/src/cmp/lua/TestClean_lua.ts +769 -0
  62. package/project/.sdk/src/cmp/lua/Test_lua.ts +3 -0
  63. package/project/.sdk/src/cmp/lua/fragment/Entity.fragment.lua +77 -1
  64. package/project/.sdk/src/cmp/lua/fragment/Main.fragment.lua +49 -2
  65. package/project/.sdk/src/cmp/ocaml/Entity_ocaml.ts +3 -2
  66. package/project/.sdk/src/cmp/ocaml/PrepareAuth_ocaml.ts +4 -25
  67. package/project/.sdk/src/cmp/ocaml/TestClean_ocaml.ts +538 -0
  68. package/project/.sdk/src/cmp/ocaml/Test_ocaml.ts +5 -0
  69. package/project/.sdk/src/cmp/ocaml/fragment/RunOp.fragment.ml +16 -4
  70. package/project/.sdk/src/cmp/perl/PrepareAuth_perl.ts +3 -0
  71. package/project/.sdk/src/cmp/perl/TestClean_perl.ts +619 -0
  72. package/project/.sdk/src/cmp/perl/Test_perl.ts +3 -0
  73. package/project/.sdk/src/cmp/perl/fragment/Entity.fragment.pm +67 -5
  74. package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +13 -1
  75. package/project/.sdk/src/cmp/php/PrepareAuth_php.ts +3 -0
  76. package/project/.sdk/src/cmp/php/TestClean_php.ts +809 -0
  77. package/project/.sdk/src/cmp/php/Test_php.ts +2 -0
  78. package/project/.sdk/src/cmp/php/fragment/Entity.fragment.php +96 -55
  79. package/project/.sdk/src/cmp/php/fragment/Main.fragment.php +15 -2
  80. package/project/.sdk/src/cmp/py/PrepareAuth_py.ts +3 -0
  81. package/project/.sdk/src/cmp/py/TestClean_py.ts +549 -0
  82. package/project/.sdk/src/cmp/py/Test_py.ts +3 -0
  83. package/project/.sdk/src/cmp/py/fragment/Entity.fragment.py +83 -55
  84. package/project/.sdk/src/cmp/py/fragment/Main.fragment.py +19 -3
  85. package/project/.sdk/src/cmp/rb/PrepareAuth_rb.ts +3 -0
  86. package/project/.sdk/src/cmp/rb/TestClean_rb.ts +535 -0
  87. package/project/.sdk/src/cmp/rb/Test_rb.ts +3 -0
  88. package/project/.sdk/src/cmp/rb/fragment/Entity.fragment.rb +108 -46
  89. package/project/.sdk/src/cmp/rb/fragment/Main.fragment.rb +12 -1
  90. package/project/.sdk/src/cmp/rust/PrepareAuth_rust.ts +9 -45
  91. package/project/.sdk/src/cmp/rust/TestClean_rust.ts +881 -0
  92. package/project/.sdk/src/cmp/rust/Test_rust.ts +3 -0
  93. package/project/.sdk/src/cmp/rust/fragment/Entity.fragment.rs +14 -6
  94. package/project/.sdk/src/cmp/rust/fragment/Main.fragment.rs +17 -1
  95. package/project/.sdk/src/cmp/rust/fragment/SdkError.fragment.rs +34 -2
  96. package/project/.sdk/src/cmp/scala/PrepareAuth_scala.ts +3 -0
  97. package/project/.sdk/src/cmp/scala/TestClean_scala.ts +608 -0
  98. package/project/.sdk/src/cmp/scala/Test_scala.ts +3 -0
  99. package/project/.sdk/src/cmp/scala/fragment/EntityBase.fragment.scala +58 -6
  100. package/project/.sdk/src/cmp/swift/PrepareAuth_swift.ts +3 -0
  101. package/project/.sdk/src/cmp/swift/TestClean_swift.ts +671 -0
  102. package/project/.sdk/src/cmp/swift/Test_swift.ts +3 -0
  103. package/project/.sdk/src/cmp/swift/fragment/EntityBase.fragment.swift +10 -0
  104. package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +16 -2
  105. package/project/.sdk/src/cmp/swift/fragment/SdkError.fragment.swift +47 -3
  106. package/project/.sdk/src/cmp/ts/PrepareAuth_ts.ts +3 -0
  107. package/project/.sdk/src/cmp/ts/TestClean_ts.ts +465 -0
  108. package/project/.sdk/src/cmp/ts/Test_ts.ts +2 -0
  109. package/project/.sdk/src/cmp/ts/fragment/EntityBase.fragment.ts +5 -4
  110. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +7 -1
  111. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +7 -1
  112. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +7 -1
  113. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +7 -1
  114. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +7 -1
  115. package/project/.sdk/src/cmp/ts/fragment/Main.fragment.ts +8 -2
  116. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +20 -2
  117. package/project/.sdk/src/cmp/zig/PrepareAuth_zig.ts +3 -0
  118. package/project/.sdk/src/cmp/zig/TestClean_zig.ts +791 -0
  119. package/project/.sdk/src/cmp/zig/Test_zig.ts +5 -0
  120. package/project/.sdk/src/cmp/zig/fragment/Build.fragment.zig +19 -0
  121. package/project/.sdk/src/cmp/zig/fragment/Entity.fragment.zig +14 -5
  122. package/project/.sdk/src/cmp/zig/fragment/Main.fragment.zig +1 -1
  123. package/project/.sdk/tm/c/core/context.c +25 -0
  124. package/project/.sdk/tm/c/core/error.c +16 -0
  125. package/project/.sdk/tm/c/core/sdk.h +22 -0
  126. package/project/.sdk/tm/c/feature/audit.c +2 -0
  127. package/project/.sdk/tm/c/feature/cost.c +1 -0
  128. package/project/.sdk/tm/c/feature/debug.c +19 -29
  129. package/project/.sdk/tm/c/feature/log.c +21 -2
  130. package/project/.sdk/tm/c/feature/proxy.c +55 -3
  131. package/project/.sdk/tm/c/feature/secrets.c +7 -0
  132. package/project/.sdk/tm/c/feature/telemetry.c +2 -0
  133. package/project/.sdk/tm/c/tests/feature_test.c +2 -2
  134. package/project/.sdk/tm/c/utility/clean.c +530 -8
  135. package/project/.sdk/tm/c/utility/done.c +28 -12
  136. package/project/.sdk/tm/c/utility/make_error.c +4 -3
  137. package/project/.sdk/tm/c/utility/make_options.c +71 -45
  138. package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +15 -0
  139. package/project/.sdk/tm/clojure/src/sdk/client.clj +20 -4
  140. package/project/.sdk/tm/clojure/src/sdk/core.clj +319 -35
  141. package/project/.sdk/tm/clojure/src/sdk/features.clj +68 -30
  142. package/project/.sdk/tm/clojure/test/sdk/test/feature.clj +4 -2
  143. package/project/.sdk/tm/clojure/test/sdk/test/pipeline.clj +47 -20
  144. package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +4 -0
  145. package/project/.sdk/tm/cpp/core/types.hpp +93 -3
  146. package/project/.sdk/tm/cpp/feature/audit.hpp +1 -0
  147. package/project/.sdk/tm/cpp/feature/cost.hpp +1 -0
  148. package/project/.sdk/tm/cpp/feature/debug.hpp +20 -12
  149. package/project/.sdk/tm/cpp/feature/log.hpp +31 -9
  150. package/project/.sdk/tm/cpp/feature/proxy.hpp +52 -6
  151. package/project/.sdk/tm/cpp/feature/secrets.hpp +13 -0
  152. package/project/.sdk/tm/cpp/feature/telemetry.hpp +4 -2
  153. package/project/.sdk/tm/cpp/test/feature_test.cpp +2 -2
  154. package/project/.sdk/tm/cpp/utility/pipeline.hpp +426 -51
  155. package/project/.sdk/tm/csharp/core/Context.cs +32 -0
  156. package/project/.sdk/tm/csharp/core/Utility.cs +2 -0
  157. package/project/.sdk/tm/csharp/feature/AuditFeature.cs +1 -0
  158. package/project/.sdk/tm/csharp/feature/CostFeature.cs +7 -5
  159. package/project/.sdk/tm/csharp/feature/DebugFeature.cs +19 -16
  160. package/project/.sdk/tm/csharp/feature/FeatureOptions.cs +16 -0
  161. package/project/.sdk/tm/csharp/feature/LogFeature.cs +4 -1
  162. package/project/.sdk/tm/csharp/feature/ProxyFeature.cs +26 -5
  163. package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +16 -0
  164. package/project/.sdk/tm/csharp/feature/TelemetryFeature.cs +4 -2
  165. package/project/.sdk/tm/csharp/test/FeatureTest.cs +2 -2
  166. package/project/.sdk/tm/csharp/utility/Clean.cs +440 -2
  167. package/project/.sdk/tm/csharp/utility/Done.cs +27 -11
  168. package/project/.sdk/tm/csharp/utility/MakeError.cs +19 -8
  169. package/project/.sdk/tm/csharp/utility/MakeOptions.cs +119 -29
  170. package/project/.sdk/tm/csharp/utility/MakeResponse.cs +21 -11
  171. package/project/.sdk/tm/csharp/utility/Register.cs +1 -0
  172. package/project/.sdk/tm/elixir/lib/projectname/context.ex +19 -0
  173. package/project/.sdk/tm/elixir/lib/projectname/entity_base.ex +22 -1
  174. package/project/.sdk/tm/elixir/lib/projectname/error.ex +24 -0
  175. package/project/.sdk/tm/elixir/lib/projectname/feature/audit.ex +2 -2
  176. package/project/.sdk/tm/elixir/lib/projectname/feature/cost.ex +2 -2
  177. package/project/.sdk/tm/elixir/lib/projectname/feature/debug.ex +13 -13
  178. package/project/.sdk/tm/elixir/lib/projectname/feature/log.ex +18 -5
  179. package/project/.sdk/tm/elixir/lib/projectname/feature/proxy.ex +19 -1
  180. package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +15 -0
  181. package/project/.sdk/tm/elixir/lib/projectname/feature/telemetry.ex +4 -2
  182. package/project/.sdk/tm/elixir/lib/projectname/feature.ex +22 -0
  183. package/project/.sdk/tm/elixir/lib/projectname/utility.ex +464 -41
  184. package/project/.sdk/tm/elixir/test/feature_test.exs +3 -2
  185. package/project/.sdk/tm/go/core/context.go +42 -0
  186. package/project/.sdk/tm/go/core/error.go +30 -10
  187. package/project/.sdk/tm/go/core/utility_type.go +2 -0
  188. package/project/.sdk/tm/go/feature/audit_feature.go +1 -0
  189. package/project/.sdk/tm/go/feature/base_feature.go +12 -0
  190. package/project/.sdk/tm/go/feature/cost_feature.go +2 -2
  191. package/project/.sdk/tm/go/feature/debug_feature.go +14 -12
  192. package/project/.sdk/tm/go/feature/log_feature.go +13 -8
  193. package/project/.sdk/tm/go/feature/proxy_feature.go +26 -6
  194. package/project/.sdk/tm/go/feature/secrets_feature.go +19 -0
  195. package/project/.sdk/tm/go/feature/telemetry_feature.go +4 -2
  196. package/project/.sdk/tm/go/test/feature_test.go +2 -2
  197. package/project/.sdk/tm/go/utility/clean.go +585 -2
  198. package/project/.sdk/tm/go/utility/done.go +29 -9
  199. package/project/.sdk/tm/go/utility/make_error.go +51 -16
  200. package/project/.sdk/tm/go/utility/make_options.go +77 -36
  201. package/project/.sdk/tm/go/utility/register.go +12 -0
  202. package/project/.sdk/tm/java/core/Context.java +29 -0
  203. package/project/.sdk/tm/java/core/SdkClient.java +4 -2
  204. package/project/.sdk/tm/java/core/Utility.java +7 -0
  205. package/project/.sdk/tm/java/feature/AuditFeature.java +6 -0
  206. package/project/.sdk/tm/java/feature/CostFeature.java +5 -0
  207. package/project/.sdk/tm/java/feature/DebugFeature.java +25 -14
  208. package/project/.sdk/tm/java/feature/LogFeature.java +11 -4
  209. package/project/.sdk/tm/java/feature/ProxyFeature.java +41 -6
  210. package/project/.sdk/tm/java/feature/SecretsFeature.java +18 -0
  211. package/project/.sdk/tm/java/feature/TelemetryFeature.java +8 -2
  212. package/project/.sdk/tm/java/test/FeatureTest.java +2 -2
  213. package/project/.sdk/tm/java/utility/Clean.java +519 -1
  214. package/project/.sdk/tm/java/utility/Done.java +1 -1
  215. package/project/.sdk/tm/java/utility/MakeError.java +5 -1
  216. package/project/.sdk/tm/java/utility/MakeOptions.java +55 -31
  217. package/project/.sdk/tm/java/utility/Register.java +4 -0
  218. package/project/.sdk/tm/js/src/Context.js +5 -1
  219. package/project/.sdk/tm/js/src/Response.js +14 -1
  220. package/project/.sdk/tm/js/src/feature/audit/AuditFeature.js +2 -2
  221. package/project/.sdk/tm/js/src/feature/cost/CostFeature.js +2 -2
  222. package/project/.sdk/tm/js/src/feature/debug/DebugFeature.js +13 -7
  223. package/project/.sdk/tm/js/src/feature/log/LogFeature.js +9 -5
  224. package/project/.sdk/tm/js/src/feature/proxy/ProxyFeature.js +19 -1
  225. package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +14 -0
  226. package/project/.sdk/tm/js/src/feature/telemetry/TelemetryFeature.js +4 -2
  227. package/project/.sdk/tm/js/src/utility/CleanUtility.js +294 -21
  228. package/project/.sdk/tm/js/src/utility/DoneUtility.js +17 -5
  229. package/project/.sdk/tm/js/src/utility/MakeErrorUtility.js +18 -2
  230. package/project/.sdk/tm/js/src/utility/MakeOptionsUtility.js +39 -15
  231. package/project/.sdk/tm/js/src/utility/Utility.js +4 -2
  232. package/project/.sdk/tm/js/test/feature/harness.js +11 -1
  233. package/project/.sdk/tm/js/test/feature.test.js +9 -2
  234. package/project/.sdk/tm/js/test/utility/PrimaryUtility.test.js +25 -0
  235. package/project/.sdk/tm/kotlin/core/Context.kt +19 -0
  236. package/project/.sdk/tm/kotlin/core/SdkClient.kt +9 -2
  237. package/project/.sdk/tm/kotlin/core/Utility.kt +2 -0
  238. package/project/.sdk/tm/kotlin/feature/AuditFeature.kt +11 -9
  239. package/project/.sdk/tm/kotlin/feature/CostFeature.kt +8 -5
  240. package/project/.sdk/tm/kotlin/feature/DebugFeature.kt +15 -22
  241. package/project/.sdk/tm/kotlin/feature/LogFeature.kt +8 -4
  242. package/project/.sdk/tm/kotlin/feature/ProxyFeature.kt +26 -2
  243. package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +11 -0
  244. package/project/.sdk/tm/kotlin/feature/TelemetryFeature.kt +4 -2
  245. package/project/.sdk/tm/kotlin/test/FeatureTest.kt +2 -2
  246. package/project/.sdk/tm/kotlin/utility/CoreUtil.kt +447 -11
  247. package/project/.sdk/tm/kotlin/utility/MakeOptions.kt +38 -31
  248. package/project/.sdk/tm/kotlin/utility/Register.kt +1 -0
  249. package/project/.sdk/tm/lua/core/context.lua +43 -0
  250. package/project/.sdk/tm/lua/core/error.lua +36 -1
  251. package/project/.sdk/tm/lua/core/utility_type.lua +4 -0
  252. package/project/.sdk/tm/lua/feature/audit_feature.lua +2 -2
  253. package/project/.sdk/tm/lua/feature/cost_feature.lua +2 -2
  254. package/project/.sdk/tm/lua/feature/debug_feature.lua +21 -17
  255. package/project/.sdk/tm/lua/feature/log_feature.lua +2 -1
  256. package/project/.sdk/tm/lua/feature/proxy_feature.lua +23 -1
  257. package/project/.sdk/tm/lua/feature/secrets_feature.lua +18 -0
  258. package/project/.sdk/tm/lua/feature/telemetry_feature.lua +4 -2
  259. package/project/.sdk/tm/lua/test/feature/secrets/secrets_feature_test.lua +3 -2
  260. package/project/.sdk/tm/lua/test/feature_test.lua +10 -3
  261. package/project/.sdk/tm/lua/utility/clean.lua +426 -2
  262. package/project/.sdk/tm/lua/utility/clean_explain.lua +34 -0
  263. package/project/.sdk/tm/lua/utility/done.lua +1 -7
  264. package/project/.sdk/tm/lua/utility/make_error.lua +3 -1
  265. package/project/.sdk/tm/lua/utility/make_options.lua +76 -30
  266. package/project/.sdk/tm/lua/utility/register.lua +4 -1
  267. package/project/.sdk/tm/ocaml/Makefile +5 -1
  268. package/project/.sdk/tm/ocaml/feature/secrets_feature.ml +12 -1
  269. package/project/.sdk/tm/ocaml/sdk_features.ml +78 -18
  270. package/project/.sdk/tm/ocaml/sdk_helpers.ml +27 -0
  271. package/project/.sdk/tm/ocaml/sdk_runtime.ml +304 -26
  272. package/project/.sdk/tm/ocaml/sdk_types.ml +1 -0
  273. package/project/.sdk/tm/ocaml/test/feature/secrets/t_secrets.ml +3 -1
  274. package/project/.sdk/tm/ocaml/test/t_feature.ml +2 -2
  275. package/project/.sdk/tm/perl/core/context.pm +27 -0
  276. package/project/.sdk/tm/perl/core/error.pm +52 -5
  277. package/project/.sdk/tm/perl/feature/audit_feature.pm +2 -2
  278. package/project/.sdk/tm/perl/feature/cost_feature.pm +2 -2
  279. package/project/.sdk/tm/perl/feature/debug_feature.pm +17 -13
  280. package/project/.sdk/tm/perl/feature/log_feature.pm +3 -1
  281. package/project/.sdk/tm/perl/feature/proxy_feature.pm +21 -1
  282. package/project/.sdk/tm/perl/feature/secrets_feature.pm +20 -1
  283. package/project/.sdk/tm/perl/feature/telemetry_feature.pm +4 -2
  284. package/project/.sdk/tm/perl/t/feature.t +4 -2
  285. package/project/.sdk/tm/perl/utility/clean.pm +345 -1
  286. package/project/.sdk/tm/perl/utility/done.pm +24 -6
  287. package/project/.sdk/tm/perl/utility/make_error.pm +17 -4
  288. package/project/.sdk/tm/perl/utility/make_options.pm +33 -14
  289. package/project/.sdk/tm/php/core/Context.php +24 -1
  290. package/project/.sdk/tm/php/core/Error.php +34 -3
  291. package/project/.sdk/tm/php/core/UtilityType.php +4 -0
  292. package/project/.sdk/tm/php/feature/AuditFeature.php +2 -2
  293. package/project/.sdk/tm/php/feature/CostFeature.php +2 -2
  294. package/project/.sdk/tm/php/feature/DebugFeature.php +18 -9
  295. package/project/.sdk/tm/php/feature/LogFeature.php +5 -2
  296. package/project/.sdk/tm/php/feature/ProxyFeature.php +20 -1
  297. package/project/.sdk/tm/php/feature/SecretsFeature.php +18 -0
  298. package/project/.sdk/tm/php/feature/TelemetryFeature.php +4 -2
  299. package/project/.sdk/tm/php/test/FeatureTest.php +2 -2
  300. package/project/.sdk/tm/php/utility/Clean.php +438 -2
  301. package/project/.sdk/tm/php/utility/Done.php +14 -7
  302. package/project/.sdk/tm/php/utility/MakeError.php +9 -7
  303. package/project/.sdk/tm/php/utility/MakeOptions.php +62 -38
  304. package/project/.sdk/tm/php/utility/Register.php +2 -0
  305. package/project/.sdk/tm/py/pkg/core/context.py +17 -0
  306. package/project/.sdk/tm/py/pkg/core/error.py +42 -1
  307. package/project/.sdk/tm/py/pkg/core/utility_type.py +4 -0
  308. package/project/.sdk/tm/py/pkg/feature/audit_feature.py +2 -2
  309. package/project/.sdk/tm/py/pkg/feature/cost_feature.py +2 -2
  310. package/project/.sdk/tm/py/pkg/feature/debug_feature.py +17 -12
  311. package/project/.sdk/tm/py/pkg/feature/log_feature.py +2 -1
  312. package/project/.sdk/tm/py/pkg/feature/proxy_feature.py +18 -1
  313. package/project/.sdk/tm/py/pkg/feature/secrets_feature.py +12 -0
  314. package/project/.sdk/tm/py/pkg/feature/telemetry_feature.py +4 -2
  315. package/project/.sdk/tm/py/pkg/utility/clean.py +311 -1
  316. package/project/.sdk/tm/py/pkg/utility/done.py +18 -5
  317. package/project/.sdk/tm/py/pkg/utility/make_error.py +9 -6
  318. package/project/.sdk/tm/py/pkg/utility/make_options.py +64 -25
  319. package/project/.sdk/tm/py/pkg/utility/make_response.py +19 -13
  320. package/project/.sdk/tm/py/pkg/utility/register.py +4 -2
  321. package/project/.sdk/tm/py/test/feature_harness.py +4 -0
  322. package/project/.sdk/tm/py/test/test_feature.py +2 -2
  323. package/project/.sdk/tm/py/test/test_primary_utility.py +1 -0
  324. package/project/.sdk/tm/rb/core/context.rb +28 -0
  325. package/project/.sdk/tm/rb/core/error.rb +30 -0
  326. package/project/.sdk/tm/rb/core/utility_type.rb +1 -1
  327. package/project/.sdk/tm/rb/feature/audit_feature.rb +2 -2
  328. package/project/.sdk/tm/rb/feature/cost_feature.rb +2 -2
  329. package/project/.sdk/tm/rb/feature/debug_feature.rb +15 -12
  330. package/project/.sdk/tm/rb/feature/log_feature.rb +3 -1
  331. package/project/.sdk/tm/rb/feature/proxy_feature.rb +25 -1
  332. package/project/.sdk/tm/rb/feature/secrets_feature.rb +17 -0
  333. package/project/.sdk/tm/rb/feature/telemetry_feature.rb +4 -2
  334. package/project/.sdk/tm/rb/test/feature_test.rb +4 -2
  335. package/project/.sdk/tm/rb/utility/clean.rb +312 -1
  336. package/project/.sdk/tm/rb/utility/done.rb +15 -5
  337. package/project/.sdk/tm/rb/utility/make_error.rb +13 -4
  338. package/project/.sdk/tm/rb/utility/make_options.rb +31 -12
  339. package/project/.sdk/tm/rb/utility/register.rb +2 -0
  340. package/project/.sdk/tm/rust/core/context.rs +55 -0
  341. package/project/.sdk/tm/rust/core/utility_type.rs +17 -0
  342. package/project/.sdk/tm/rust/feature/audit.rs +2 -0
  343. package/project/.sdk/tm/rust/feature/cost.rs +3 -2
  344. package/project/.sdk/tm/rust/feature/debug.rs +16 -16
  345. package/project/.sdk/tm/rust/feature/log.rs +42 -7
  346. package/project/.sdk/tm/rust/feature/proxy.rs +48 -2
  347. package/project/.sdk/tm/rust/feature/secrets.rs +12 -0
  348. package/project/.sdk/tm/rust/feature/telemetry.rs +2 -0
  349. package/project/.sdk/tm/rust/tests/feature_test.rs +2 -2
  350. package/project/.sdk/tm/rust/utility/clean.rs +446 -5
  351. package/project/.sdk/tm/rust/utility/done.rs +22 -12
  352. package/project/.sdk/tm/rust/utility/make_error.rs +4 -1
  353. package/project/.sdk/tm/rust/utility/make_options.rs +73 -19
  354. package/project/.sdk/tm/scala/Makefile +3 -1
  355. package/project/.sdk/tm/scala/core/Context.scala +16 -0
  356. package/project/.sdk/tm/scala/core/SdkClient.scala +14 -4
  357. package/project/.sdk/tm/scala/core/SdkError.scala +28 -0
  358. package/project/.sdk/tm/scala/core/Types.scala +3 -0
  359. package/project/.sdk/tm/scala/core/Utility.scala +2 -0
  360. package/project/.sdk/tm/scala/feature/AuditFeature.scala +16 -10
  361. package/project/.sdk/tm/scala/feature/CostFeature.scala +10 -5
  362. package/project/.sdk/tm/scala/feature/DebugFeature.scala +24 -21
  363. package/project/.sdk/tm/scala/feature/LogFeature.scala +9 -4
  364. package/project/.sdk/tm/scala/feature/ProxyFeature.scala +23 -2
  365. package/project/.sdk/tm/scala/feature/SecretsFeature.scala +14 -0
  366. package/project/.sdk/tm/scala/feature/TelemetryFeature.scala +9 -2
  367. package/project/.sdk/tm/scala/sdktest/SdkTestMain.scala +2 -2
  368. package/project/.sdk/tm/scala/utility/Make.scala +63 -20
  369. package/project/.sdk/tm/scala/utility/Misc.scala +358 -5
  370. package/project/.sdk/tm/scala/utility/Register.scala +1 -0
  371. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/core/Context.swift +29 -0
  372. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/core/Utility.swift +2 -0
  373. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/AuditFeature.swift +10 -9
  374. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/CostFeature.swift +7 -5
  375. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/DebugFeature.swift +19 -15
  376. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/FeatureOptions.swift +16 -0
  377. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/LogFeature.swift +4 -1
  378. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/ProxyFeature.swift +20 -5
  379. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +13 -0
  380. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/TelemetryFeature.swift +4 -2
  381. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeError.swift +15 -5
  382. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +58 -19
  383. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/Register.swift +1 -0
  384. package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/ResultUtil.swift +391 -4
  385. package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/FeatureTest.swift +2 -2
  386. package/project/.sdk/tm/ts/src/Context.ts +5 -1
  387. package/project/.sdk/tm/ts/src/Response.ts +14 -1
  388. package/project/.sdk/tm/ts/src/feature/audit/AuditFeature.ts +2 -2
  389. package/project/.sdk/tm/ts/src/feature/cost/CostFeature.ts +2 -2
  390. package/project/.sdk/tm/ts/src/feature/debug/DebugFeature.ts +13 -7
  391. package/project/.sdk/tm/ts/src/feature/log/LogFeature.ts +9 -5
  392. package/project/.sdk/tm/ts/src/feature/proxy/ProxyFeature.ts +19 -1
  393. package/project/.sdk/tm/ts/src/feature/secrets/SecretsFeature.ts +12 -0
  394. package/project/.sdk/tm/ts/src/feature/telemetry/TelemetryFeature.ts +4 -2
  395. package/project/.sdk/tm/ts/src/utility/CleanUtility.ts +287 -9
  396. package/project/.sdk/tm/ts/src/utility/DoneUtility.ts +18 -5
  397. package/project/.sdk/tm/ts/src/utility/MakeErrorUtility.ts +18 -8
  398. package/project/.sdk/tm/ts/src/utility/MakeOptionsUtility.ts +38 -16
  399. package/project/.sdk/tm/ts/src/utility/Utility.ts +4 -2
  400. package/project/.sdk/tm/ts/test/feature/harness.ts +11 -1
  401. package/project/.sdk/tm/ts/test/feature.test.ts +9 -2
  402. package/project/.sdk/tm/ts/test/utility/PrimaryUtility.test.ts +25 -0
  403. package/project/.sdk/tm/zig/core/context.zig +34 -0
  404. package/project/.sdk/tm/zig/core/error.zig +22 -1
  405. package/project/.sdk/tm/zig/core/utility.zig +403 -39
  406. package/project/.sdk/tm/zig/feature/audit.zig +4 -2
  407. package/project/.sdk/tm/zig/feature/cost.zig +3 -2
  408. package/project/.sdk/tm/zig/feature/debug.zig +20 -25
  409. package/project/.sdk/tm/zig/feature/log.zig +3 -1
  410. package/project/.sdk/tm/zig/feature/proxy.zig +47 -6
  411. package/project/.sdk/tm/zig/feature/secrets.zig +7 -0
  412. package/project/.sdk/tm/zig/feature/telemetry.zig +4 -2
  413. package/project/.sdk/tm/zig/test/feature_test.zig +2 -2
  414. package/project/sdkgen-package.json +1 -1
  415. package/src/helpers/naming.ts +1 -1
@@ -681,7 +681,7 @@ public class FeatureTest {
681
681
  assertEquals(1, f.entries.size(), "expected ring buffer capped at 1");
682
682
  assertEquals(2, seen.size(), "expected onEntry for both ops");
683
683
  Map<String, Object> headers = (Map<String, Object>) seen.get(0).get("headers");
684
- assertEquals("<redacted>", headers.get("authorization"),
684
+ assertEquals("[redacted]", headers.get("authorization"),
685
685
  "expected redacted authorization");
686
686
  }
687
687
 
@@ -710,7 +710,7 @@ public class FeatureTest {
710
710
  h.op(fhOp("load").headers(fhMap("x-secret", "hide", "x-ok", "show")));
711
711
  Map<String, Object> headers =
712
712
  (Map<String, Object>) f.entries.get(0).get("headers");
713
- assertEquals("<redacted>", headers.get("x-secret"), "expected x-secret redacted");
713
+ assertEquals("[redacted]", headers.get("x-secret"), "expected x-secret redacted");
714
714
  assertEquals("show", headers.get("x-ok"), "expected x-ok kept");
715
715
  }
716
716
 
@@ -1,12 +1,530 @@
1
1
  package JAVAPACKAGE.utility;
2
2
 
3
+ import java.io.PrintWriter;
4
+ import java.io.StringWriter;
5
+ import java.lang.reflect.Field;
6
+ import java.lang.reflect.Modifier;
7
+ import java.net.URLEncoder;
8
+ import java.nio.charset.StandardCharsets;
9
+ import java.util.ArrayList;
10
+ import java.util.Base64;
11
+ import java.util.Collection;
12
+ import java.util.IdentityHashMap;
13
+ import java.util.LinkedHashMap;
14
+ import java.util.List;
15
+ import java.util.Locale;
16
+ import java.util.Map;
17
+ import java.util.function.BiFunction;
18
+ import java.util.function.Consumer;
19
+ import java.util.function.Function;
20
+ import java.util.function.Supplier;
21
+
3
22
  import JAVAPACKAGE.core.Context;
23
+ import JAVAPACKAGE.core.Entity;
24
+ import JAVAPACKAGE.core.Helpers;
25
+ import JAVAPACKAGE.core.Schema;
26
+ import JAVAPACKAGE.core.SdkClient;
27
+ import JAVAPACKAGE.core.SdkError;
28
+ import JAVAPACKAGE.core.Utility;
29
+ import JAVAPACKAGE.utility.struct.Struct;
4
30
 
31
+ // Everything that leaves the pipeline passes through clean: the error, the
32
+ // explain record, the serialised context, and whatever a feature emits.
33
+ // Two layers: every registered secret VALUE (and its encoded forms) is
34
+ // replaced wherever it appears in a string, and every value under a
35
+ // sensitive KEY name is masked whatever it holds. Inside the pipeline data
36
+ // stays raw, so a hook can still read the header it must add to.
37
+ //
38
+ // The configuration is the derived block MakeOptions builds
39
+ // (`options.__derived__.clean`): active, keys, values, mask, hint, min. It
40
+ // is a plain map so the registry stays MUTABLE after construction - the
41
+ // auth step and the features register what they handle later.
42
+ @SuppressWarnings({"unchecked"})
5
43
  final class Clean {
6
44
 
45
+ private static final int MAXDEPTH = 32;
46
+ private static final String CIRCULAR = "[circular]";
47
+ private static final String DEFAULT_MASK = "[redacted]";
48
+
49
+ // A function has no place in a plain-data copy; the snapshot omits it.
50
+ private static final Object DROP = new Object();
51
+
7
52
  private Clean() {}
8
53
 
54
+ // A context without options (makeError is reached with a bare one) falls
55
+ // back to the schema defaults, so nothing leaves raw for want of a
56
+ // constructor.
57
+ static Map<String, Object> cleanConfig(Context ctx) {
58
+ Object derived = null;
59
+ if (ctx != null && ctx.options != null) {
60
+ derived = Struct.getpath(ctx.options, List.of("__derived__", "clean"));
61
+ }
62
+ if (derived instanceof Map) {
63
+ return (Map<String, Object>) derived;
64
+ }
65
+ return makeCleanConfig(Helpers.toMapAny(Schema.optspec().get("clean")));
66
+ }
67
+
68
+ static Map<String, Object> makeCleanConfig(Map<String, Object> cleanopts) {
69
+ Map<String, Object> opts = cleanopts == null ? new LinkedHashMap<>() : cleanopts;
70
+ Map<String, Object> cfg = new LinkedHashMap<>();
71
+ cfg.put("active", !Boolean.FALSE.equals(opts.get("active")));
72
+ cfg.put("keys", splitkeys(opts.get("keys")));
73
+ cfg.put("values", new ArrayList<String>());
74
+ cfg.put("mask", opts.get("mask") instanceof String ? opts.get("mask") : DEFAULT_MASK);
75
+ cfg.put("hint", count(opts.get("hint"), 0));
76
+ cfg.put("min", Math.max(1, count(opts.get("min"), 4)));
77
+ return cfg;
78
+ }
79
+
80
+ private static String normkey(Object key) {
81
+ return String.valueOf(key).toLowerCase(Locale.ROOT).replace("-", "").replace("_", "");
82
+ }
83
+
84
+ private static List<String> splitkeys(Object keys) {
85
+ List<String> out = new ArrayList<>();
86
+ for (String k : String.valueOf(keys == null ? "" : keys).split("\\s*,\\s*")) {
87
+ String nk = normkey(k);
88
+ if (!"".equals(nk)) {
89
+ out.add(nk);
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+
95
+ // The comma-separated literal values a caller registers; a list is taken
96
+ // as-is for a caller that has one.
97
+ static List<String> splitvalues(Object values) {
98
+ List<String> out = new ArrayList<>();
99
+ if (values instanceof List) {
100
+ for (Object v : (List<Object>) values) {
101
+ if (v instanceof String) {
102
+ out.add((String) v);
103
+ }
104
+ }
105
+ return out;
106
+ }
107
+ for (String v : String.valueOf(values == null ? "" : values).split("\\s*,\\s*")) {
108
+ if (!"".equals(v)) {
109
+ out.add(v);
110
+ }
111
+ }
112
+ return out;
113
+ }
114
+
115
+ // The spec carries numbers as strings, so every target reads it alike.
116
+ private static int count(Object val, int dflt) {
117
+ if (val == null) {
118
+ return dflt;
119
+ }
120
+ double d;
121
+ if (val instanceof Number) {
122
+ d = ((Number) val).doubleValue();
123
+ }
124
+ else {
125
+ String s = String.valueOf(val).trim();
126
+ if ("".equals(s)) {
127
+ return 0;
128
+ }
129
+ try {
130
+ d = Double.parseDouble(s);
131
+ }
132
+ catch (NumberFormatException e) {
133
+ return dflt;
134
+ }
135
+ }
136
+ if (Double.isNaN(d) || Double.isInfinite(d) || d < 0) {
137
+ return dflt;
138
+ }
139
+ return (int) Math.floor(d);
140
+ }
141
+
142
+ private static boolean active(Map<String, Object> cfg) {
143
+ return !Boolean.FALSE.equals(cfg.get("active"));
144
+ }
145
+
146
+ private static List<String> keys(Map<String, Object> cfg) {
147
+ return cfg.get("keys") instanceof List ? (List<String>) cfg.get("keys") : List.of();
148
+ }
149
+
150
+ private static List<String> values(Map<String, Object> cfg) {
151
+ if (!(cfg.get("values") instanceof List)) {
152
+ cfg.put("values", new ArrayList<String>());
153
+ }
154
+ return (List<String>) cfg.get("values");
155
+ }
156
+
157
+ private static String mask(Map<String, Object> cfg) {
158
+ return cfg.get("mask") instanceof String ? (String) cfg.get("mask") : DEFAULT_MASK;
159
+ }
160
+
161
+ private static int hint(Map<String, Object> cfg) {
162
+ return count(cfg.get("hint"), 0);
163
+ }
164
+
165
+ private static int min(Map<String, Object> cfg) {
166
+ return Math.max(1, count(cfg.get("min"), 4));
167
+ }
168
+
169
+ // The encoded forms a value travels in: Basic and Bearer both carry base64,
170
+ // a query credential is percent-encoded (both the wire form Struct.escurl
171
+ // sends and the JavaScript form a peer SDK sends), and a JSON dump escapes
172
+ // it.
173
+ private static List<String> forms(String value) {
174
+ List<String> out = new ArrayList<>();
175
+ out.add(value);
176
+ byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
177
+ addForm(out, Base64.getEncoder().encodeToString(bytes));
178
+ String enc = URLEncoder.encode(value, StandardCharsets.UTF_8);
179
+ addForm(out, enc.replace("+", "%20"));
180
+ addForm(out, enc.replace("+", "%20").replace("%21", "!").replace("%27", "'")
181
+ .replace("%28", "(").replace("%29", ")").replace("%7E", "~"));
182
+ String json = Struct.jsonify(value);
183
+ if (json.length() >= 2) {
184
+ addForm(out, json.substring(1, json.length() - 1));
185
+ }
186
+ return out;
187
+ }
188
+
189
+ private static void addForm(List<String> out, String form) {
190
+ if (!"".equals(form) && !out.contains(form)) {
191
+ out.add(form);
192
+ }
193
+ }
194
+
195
+ // Register a secret value. Idempotent; shorter than `min` is not a secret
196
+ // the SDK can mask without blanking ordinary text.
197
+ static void add(Map<String, Object> cfg, Object value) {
198
+ if (!(value instanceof String) || ((String) value).length() < min(cfg)) {
199
+ return;
200
+ }
201
+ List<String> values = values(cfg);
202
+ boolean changed = false;
203
+ for (String form : forms((String) value)) {
204
+ if (form.length() >= min(cfg) && !values.contains(form)) {
205
+ values.add(form);
206
+ changed = true;
207
+ }
208
+ }
209
+ if (changed) {
210
+ values.sort((a, b) -> b.length() - a.length());
211
+ }
212
+ }
213
+
214
+ static void cleanAdd(Context ctx, Object value) {
215
+ add(cleanConfig(ctx), value);
216
+ }
217
+
218
+ // Every scalar under a sensitive name in the options, at any depth and of
219
+ // any shape: a credential mistyped as a map or a number is still one, and
220
+ // a message can quote it. A key under `feature` names a feature, not a
221
+ // field, so a feature called secrets does not make its settings secret.
222
+ // Entity blocks (entity settings, seeded records) hold no credential.
223
+ static void addSensitiveOptions(Map<String, Object> cfg, Map<String, Object> opts) {
224
+ IdentityHashMap<Object, Boolean> seen = new IdentityHashMap<>();
225
+ for (Map.Entry<String, Object> e : opts.entrySet()) {
226
+ String key = e.getKey();
227
+ Object val = e.getValue();
228
+ boolean under = sensitive(cfg, key);
229
+ if ("entity".equals(key)) {
230
+ continue;
231
+ }
232
+ if ("feature".equals(key) && (val instanceof Map || val instanceof List)) {
233
+ Collection<?> fsets = val instanceof Map ? ((Map<?, ?>) val).values() : (List<?>) val;
234
+ for (Object fopts : fsets) {
235
+ addSensitive(cfg, noEntity(fopts), under, 2, seen);
236
+ }
237
+ }
238
+ else {
239
+ addSensitive(cfg, "test".equals(key) ? noEntity(val) : val, under, 1, seen);
240
+ }
241
+ }
242
+ }
243
+
244
+ private static Object noEntity(Object block) {
245
+ if (!(block instanceof Map)) {
246
+ return block;
247
+ }
248
+ Map<Object, Object> out = new LinkedHashMap<>((Map<?, ?>) block);
249
+ out.remove("entity");
250
+ return out;
251
+ }
252
+
253
+ private static void addSensitive(Map<String, Object> cfg, Object val, boolean under,
254
+ int depth, IdentityHashMap<Object, Boolean> seen) {
255
+ if (val == null || MAXDEPTH <= depth) {
256
+ return;
257
+ }
258
+ if (val instanceof String || val instanceof Number) {
259
+ if (under) {
260
+ add(cfg, String.valueOf(val));
261
+ add(cfg, Struct.stringify(val));
262
+ }
263
+ return;
264
+ }
265
+ if (seen.containsKey(val)) {
266
+ return;
267
+ }
268
+ seen.put(val, Boolean.TRUE);
269
+ if (val instanceof Map) {
270
+ for (Map.Entry<?, ?> e : ((Map<?, ?>) val).entrySet()) {
271
+ addSensitive(cfg, e.getValue(), under || sensitive(cfg, e.getKey()), depth + 1, seen);
272
+ }
273
+ }
274
+ else if (val instanceof Collection || val instanceof Object[]) {
275
+ Object[] items = val instanceof Object[] ? (Object[]) val : ((Collection<?>) val).toArray();
276
+ for (Object item : items) {
277
+ addSensitive(cfg, item, under, depth + 1, seen);
278
+ }
279
+ }
280
+ }
281
+
282
+ private static String maskValue(Map<String, Object> cfg, String value) {
283
+ int hint = hint(cfg);
284
+ if (0 < hint && value.length() > 2 * hint) {
285
+ return mask(cfg) + value.substring(value.length() - hint);
286
+ }
287
+ return mask(cfg);
288
+ }
289
+
290
+ static String cleanString(Map<String, Object> cfg, String text) {
291
+ String out = text;
292
+ for (String value : values(cfg)) {
293
+ if (out.contains(value)) {
294
+ out = out.replace(value, maskValue(cfg, value));
295
+ }
296
+ }
297
+ return out;
298
+ }
299
+
300
+ static boolean sensitive(Map<String, Object> cfg, Object key) {
301
+ if (key == null || key instanceof Number) {
302
+ return false;
303
+ }
304
+ String nk = normkey(key);
305
+ for (String k : keys(cfg)) {
306
+ if (nk.contains(k)) {
307
+ return true;
308
+ }
309
+ }
310
+ return false;
311
+ }
312
+
313
+ private static boolean isFunction(Object val) {
314
+ return val instanceof Function || val instanceof Supplier || val instanceof Consumer
315
+ || val instanceof BiFunction || val instanceof Runnable
316
+ || val instanceof Utility.CtxFn || val instanceof Utility.CleanFn
317
+ || val instanceof Utility.CleanAddFn || val instanceof Utility.MakeErrorFn
318
+ || val instanceof Utility.FeatureFn || val instanceof Utility.HookFn
319
+ || val instanceof Utility.FetcherFn || val instanceof Utility.MakeContextFn
320
+ || val instanceof Utility.ParamFn
321
+ || val.getClass().isSynthetic();
322
+ }
323
+
324
+ private static boolean isScalar(Object val) {
325
+ return val instanceof Number || val instanceof Boolean || val instanceof Character
326
+ || val instanceof Enum;
327
+ }
328
+
329
+ private static String stackOf(Throwable err) {
330
+ StringWriter sw = new StringWriter();
331
+ err.printStackTrace(new PrintWriter(sw));
332
+ return sw.toString();
333
+ }
334
+
335
+ // A plain-data copy of what is about to leave. Java has no toJSON hook, so
336
+ // the SDK's own types are read the way a serialiser would: a context as
337
+ // its record, an entity as its data, an error as its message and stack,
338
+ // and any other object through its public fields. Functions are dropped,
339
+ // cycles are cut, and no live object is shared with the copy - masking the
340
+ // copy must never mask the pipeline's own spec.
341
+ private static Object snapshot(Map<String, Object> cfg, Object val, Object key, int depth,
342
+ IdentityHashMap<Object, Boolean> seen) {
343
+ if (val == null || val == Struct.UNDEF) {
344
+ return null;
345
+ }
346
+
347
+ if (val instanceof String) {
348
+ return sensitive(cfg, key) ? maskValue(cfg, (String) val) : cleanString(cfg, (String) val);
349
+ }
350
+
351
+ if (isFunction(val) || val instanceof SdkClient || val instanceof Utility) {
352
+ return DROP;
353
+ }
354
+
355
+ if (isScalar(val)) {
356
+ return sensitive(cfg, key) ? mask(cfg) : val;
357
+ }
358
+
359
+ if (MAXDEPTH <= depth || seen.containsKey(val)) {
360
+ return CIRCULAR;
361
+ }
362
+
363
+ if (sensitive(cfg, key)) {
364
+ return mask(cfg);
365
+ }
366
+
367
+ seen.put(val, Boolean.TRUE);
368
+ try {
369
+ if (val instanceof Map) {
370
+ Map<String, Object> out = new LinkedHashMap<>();
371
+ for (Map.Entry<?, ?> e : ((Map<?, ?>) val).entrySet()) {
372
+ String k = String.valueOf(e.getKey());
373
+ Object v = snapshot(cfg, e.getValue(), k, depth + 1, seen);
374
+ if (v != DROP) {
375
+ out.put(cleanName(cfg, out, k), v);
376
+ }
377
+ }
378
+ return out;
379
+ }
380
+
381
+ if (val instanceof Collection || val instanceof Object[]) {
382
+ List<Object> out = new ArrayList<>();
383
+ Object[] items = val instanceof Object[] ? (Object[]) val : ((Collection<?>) val).toArray();
384
+ for (int i = 0; i < items.length; i++) {
385
+ Object v = snapshot(cfg, items[i], i, depth + 1, seen);
386
+ out.add(v == DROP ? null : v);
387
+ }
388
+ return out;
389
+ }
390
+
391
+ if (val instanceof Context) {
392
+ return snapshot(cfg, ((Context) val).record(), key, depth + 1, seen);
393
+ }
394
+
395
+ if (val instanceof Entity) {
396
+ Object data = ((Entity) val).data();
397
+ Map<String, Object> out = new LinkedHashMap<>();
398
+ Object v = snapshot(cfg, data, key, depth + 1, seen);
399
+ if (v instanceof Map) {
400
+ out.putAll((Map<String, Object>) v);
401
+ }
402
+ out.put("voxgig$entity", ((Entity) val).getName());
403
+ return out;
404
+ }
405
+
406
+ if (val instanceof Throwable) {
407
+ Throwable err = (Throwable) val;
408
+ Map<String, Object> out = new LinkedHashMap<>();
409
+ out.put("message", cleanString(cfg, String.valueOf(err.getMessage())));
410
+ out.put("stack", cleanString(cfg, stackOf(err)));
411
+ out.putAll(fields(cfg, val, depth, seen));
412
+ return out;
413
+ }
414
+
415
+ return fields(cfg, val, depth, seen);
416
+ }
417
+ finally {
418
+ seen.remove(val);
419
+ }
420
+ }
421
+
422
+ private static Map<String, Object> fields(Map<String, Object> cfg, Object val, int depth,
423
+ IdentityHashMap<Object, Boolean> seen) {
424
+ Map<String, Object> out = new LinkedHashMap<>();
425
+ for (Field f : val.getClass().getFields()) {
426
+ if (Modifier.isStatic(f.getModifiers())) {
427
+ continue;
428
+ }
429
+ Object fv;
430
+ try {
431
+ fv = f.get(val);
432
+ }
433
+ catch (ReflectiveOperationException | RuntimeException e) {
434
+ continue;
435
+ }
436
+ Object v = snapshot(cfg, fv, f.getName(), depth + 1, seen);
437
+ if (v != DROP) {
438
+ out.put(cleanName(cfg, out, f.getName()), v);
439
+ }
440
+ }
441
+ return out;
442
+ }
443
+
444
+ // A registered value used as a property name is masked like any other
445
+ // string; names that mask alike take a counter, so none is lost.
446
+ private static String cleanName(Map<String, Object> cfg, Map<String, Object> out, String key) {
447
+ String name = cleanString(cfg, key);
448
+ if (name.equals(key) || !out.containsKey(name)) {
449
+ return name;
450
+ }
451
+ int i = 1;
452
+ while (out.containsKey(name + "#" + i)) {
453
+ i++;
454
+ }
455
+ return name + "#" + i;
456
+ }
457
+
458
+ // Clean a value on its way out. A string is redacted; the SDK's own error
459
+ // is redacted IN PLACE (it is about to be thrown, and its identity matters
460
+ // to the caller); anything else comes back as a masked plain-data copy.
461
+ // A foreign exception's message cannot be rewritten, so it is replaced by
462
+ // an SDK error with the cleaned message and the original frames; the
463
+ // original is not attached, as a printed stack trace would show it.
464
+ static Object cleanWith(Map<String, Object> cfg, Object val) {
465
+ if (!active(cfg)) {
466
+ return val;
467
+ }
468
+
469
+ if (val instanceof String) {
470
+ return cleanString(cfg, (String) val);
471
+ }
472
+
473
+ if (val instanceof SdkError) {
474
+ SdkError err = (SdkError) val;
475
+ err.msg = cleanString(cfg, String.valueOf(err.msg));
476
+ if (err.code != null) {
477
+ err.code = cleanString(cfg, err.code);
478
+ }
479
+ err.result = cleanField(cfg, "result", err.result);
480
+ err.spec = cleanField(cfg, "spec", err.spec);
481
+ return err;
482
+ }
483
+
484
+ if (val instanceof Throwable) {
485
+ Throwable err = (Throwable) val;
486
+ String msg = err.getMessage() == null ? String.valueOf(err) : err.getMessage();
487
+ SdkError out = new SdkError("", cleanString(cfg, msg), null);
488
+ out.setStackTrace(err.getStackTrace());
489
+ return out;
490
+ }
491
+
492
+ Object out = snapshot(cfg, val, null, 0, new IdentityHashMap<>());
493
+ return out == DROP ? null : out;
494
+ }
495
+
496
+ private static Object cleanField(Map<String, Object> cfg, String key, Object val) {
497
+ if (val instanceof String) {
498
+ return sensitive(cfg, key) ? maskValue(cfg, (String) val) : cleanString(cfg, (String) val);
499
+ }
500
+ if (val == null || isScalar(val)) {
501
+ return val;
502
+ }
503
+ Object out = snapshot(cfg, val, key, 1, new IdentityHashMap<>());
504
+ return out == DROP ? null : out;
505
+ }
506
+
9
507
  static Object clean(Context ctx, Object val) {
10
- return val;
508
+ return cleanWith(cleanConfig(ctx), val);
509
+ }
510
+
511
+ // Is this key name sensitive under the context's clean configuration?
512
+ static boolean cleanKey(Context ctx, Object key) {
513
+ return sensitive(cleanConfig(ctx), key);
514
+ }
515
+
516
+ // The explain record is the caller's own map (Context keeps the instance
517
+ // it was handed), so the cleaned copy is written back into it rather than
518
+ // replacing it, or the caller would keep reading the raw one.
519
+ static void cleanExplain(Context ctx) {
520
+ Map<String, Object> explain = ctx.ctrl == null ? null : ctx.ctrl.explain;
521
+ if (explain == null) {
522
+ return;
523
+ }
524
+ Map<String, Object> cleaned = Helpers.toMapAny(clean(ctx, explain));
525
+ if (cleaned != null && cleaned != explain) {
526
+ explain.clear();
527
+ explain.putAll(cleaned);
528
+ }
11
529
  }
12
530
  }
@@ -12,7 +12,7 @@ final class Done {
12
12
 
13
13
  static Object done(Context ctx) {
14
14
  if (ctx.ctrl.explain != null) {
15
- ctx.ctrl.explain = (Map<String, Object>) Clean.clean(ctx, ctx.ctrl.explain);
15
+ Clean.cleanExplain(ctx);
16
16
  Object explainResult = ctx.ctrl.explain.get("result");
17
17
  Map<String, Object> rm = Helpers.toMapAny(explainResult);
18
18
  if (rm != null) {
@@ -47,7 +47,11 @@ final class MakeError {
47
47
 
48
48
  Spec spec = ctx.spec;
49
49
 
50
+ // Reached from runOp's catch as well as from done, and only done cleans
51
+ // the explain record, so a stage that threw would otherwise leave the
52
+ // live spec in it.
50
53
  if (ctx.ctrl.explain != null) {
54
+ Clean.cleanExplain(ctx);
51
55
  Map<String, Object> errRecord = new LinkedHashMap<>();
52
56
  errRecord.put("message", msg);
53
57
  ctx.ctrl.explain.put("err", errRecord);
@@ -55,7 +59,7 @@ final class MakeError {
55
59
 
56
60
  String code = "";
57
61
  if (err instanceof SdkError) {
58
- code = ((SdkError) err).code;
62
+ code = (String) Clean.clean(ctx, ((SdkError) err).code);
59
63
  }
60
64
 
61
65
  SdkError sdkErr = new SdkError(code, msg, ctx);