shield360 1.0.1 → 1.2.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 (424) hide show
  1. package/README.md +392 -37
  2. package/dist/__tests__/build-info.test.d.ts +1 -0
  3. package/dist/__tests__/build-info.test.js +196 -0
  4. package/dist/__tests__/build-info.test.js.map +1 -0
  5. package/dist/__tests__/code-location.test.d.ts +1 -0
  6. package/dist/__tests__/code-location.test.js +180 -0
  7. package/dist/__tests__/code-location.test.js.map +1 -0
  8. package/dist/__tests__/masking.test.d.ts +1 -0
  9. package/dist/__tests__/masking.test.js +66 -0
  10. package/dist/__tests__/masking.test.js.map +1 -0
  11. package/dist/__tests__/pricing-claude-5.test.js +3 -0
  12. package/dist/__tests__/pricing-claude-5.test.js.map +1 -1
  13. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/register.e2e.test.js +264 -0
  15. package/dist/__tests__/register.e2e.test.js.map +1 -0
  16. package/dist/__tests__/register.test.js +60 -0
  17. package/dist/__tests__/register.test.js.map +1 -1
  18. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  19. package/dist/agents/__tests__/agents.test.js +529 -0
  20. package/dist/agents/__tests__/agents.test.js.map +1 -0
  21. package/dist/agents/index.d.ts +15 -0
  22. package/dist/agents/index.js +25 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/passport.d.ts +92 -0
  25. package/dist/agents/passport.js +301 -0
  26. package/dist/agents/passport.js.map +1 -0
  27. package/dist/agents/policy.d.ts +24 -0
  28. package/dist/agents/policy.js +93 -0
  29. package/dist/agents/policy.js.map +1 -0
  30. package/dist/agents/replay.d.ts +20 -0
  31. package/dist/agents/replay.js +47 -0
  32. package/dist/agents/replay.js.map +1 -0
  33. package/dist/agents/report.d.ts +30 -0
  34. package/dist/agents/report.js +93 -0
  35. package/dist/agents/report.js.map +1 -0
  36. package/dist/agents/types.d.ts +148 -0
  37. package/dist/agents/types.js +37 -0
  38. package/dist/agents/types.js.map +1 -0
  39. package/dist/agents/verifier.d.ts +33 -0
  40. package/dist/agents/verifier.js +276 -0
  41. package/dist/agents/verifier.js.map +1 -0
  42. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/bench.test.js +50 -0
  44. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/checks.test.js +248 -0
  47. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/config.test.js +164 -0
  50. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  52. package/dist/ai-security/__tests__/detection.test.js +114 -0
  53. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  54. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  55. package/dist/ai-security/__tests__/fixtures.js +30 -0
  56. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  57. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  59. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  60. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  61. package/dist/ai-security/__tests__/stream.test.js +85 -0
  62. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  63. package/dist/ai-security/config.d.ts +94 -0
  64. package/dist/ai-security/config.js +241 -0
  65. package/dist/ai-security/config.js.map +1 -0
  66. package/dist/ai-security/context.d.ts +45 -0
  67. package/dist/ai-security/context.js +108 -0
  68. package/dist/ai-security/context.js.map +1 -0
  69. package/dist/ai-security/custom-kinds.d.ts +23 -0
  70. package/dist/ai-security/custom-kinds.js +97 -0
  71. package/dist/ai-security/custom-kinds.js.map +1 -0
  72. package/dist/ai-security/events.d.ts +77 -0
  73. package/dist/ai-security/events.js +153 -0
  74. package/dist/ai-security/events.js.map +1 -0
  75. package/dist/ai-security/hooks.d.ts +48 -0
  76. package/dist/ai-security/hooks.js +461 -0
  77. package/dist/ai-security/hooks.js.map +1 -0
  78. package/dist/ai-security/index.d.ts +209 -0
  79. package/dist/ai-security/index.js +587 -0
  80. package/dist/ai-security/index.js.map +1 -0
  81. package/dist/ai-security/injection-rules.json +1024 -0
  82. package/dist/ai-security/injection.d.ts +46 -0
  83. package/dist/ai-security/injection.js +635 -0
  84. package/dist/ai-security/injection.js.map +1 -0
  85. package/dist/ai-security/jailbreak.d.ts +38 -0
  86. package/dist/ai-security/jailbreak.js +73 -0
  87. package/dist/ai-security/jailbreak.js.map +1 -0
  88. package/dist/ai-security/limits.d.ts +84 -0
  89. package/dist/ai-security/limits.js +195 -0
  90. package/dist/ai-security/limits.js.map +1 -0
  91. package/dist/ai-security/mcp.d.ts +82 -0
  92. package/dist/ai-security/mcp.js +150 -0
  93. package/dist/ai-security/mcp.js.map +1 -0
  94. package/dist/ai-security/output.d.ts +107 -0
  95. package/dist/ai-security/output.js +390 -0
  96. package/dist/ai-security/output.js.map +1 -0
  97. package/dist/ai-security/policy.d.ts +125 -0
  98. package/dist/ai-security/policy.js +196 -0
  99. package/dist/ai-security/policy.js.map +1 -0
  100. package/dist/ai-security/rag.d.ts +70 -0
  101. package/dist/ai-security/rag.js +174 -0
  102. package/dist/ai-security/rag.js.map +1 -0
  103. package/dist/ai-security/tool-rules.json +203 -0
  104. package/dist/ai-security/tools.d.ts +46 -0
  105. package/dist/ai-security/tools.js +62 -0
  106. package/dist/ai-security/tools.js.map +1 -0
  107. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  108. package/dist/budgets/__tests__/budgets.test.js +134 -0
  109. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  110. package/dist/budgets/auto.d.ts +25 -0
  111. package/dist/budgets/auto.js +63 -0
  112. package/dist/budgets/auto.js.map +1 -0
  113. package/dist/budgets/index.d.ts +110 -0
  114. package/dist/budgets/index.js +239 -0
  115. package/dist/budgets/index.js.map +1 -0
  116. package/dist/config.js +1 -1
  117. package/dist/config.js.map +1 -1
  118. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  119. package/dist/customer/__tests__/customer.test.js +155 -0
  120. package/dist/customer/__tests__/customer.test.js.map +1 -0
  121. package/dist/customer/index.d.ts +48 -0
  122. package/dist/customer/index.js +132 -0
  123. package/dist/customer/index.js.map +1 -0
  124. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  125. package/dist/feedback/__tests__/feedback.test.js +80 -0
  126. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  127. package/dist/feedback/index.d.ts +48 -0
  128. package/dist/feedback/index.js +97 -0
  129. package/dist/feedback/index.js.map +1 -0
  130. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  131. package/dist/flags/__tests__/flags.test.js +301 -0
  132. package/dist/flags/__tests__/flags.test.js.map +1 -0
  133. package/dist/flags/client.d.ts +131 -0
  134. package/dist/flags/client.js +301 -0
  135. package/dist/flags/client.js.map +1 -0
  136. package/dist/flags/engine.d.ts +200 -0
  137. package/dist/flags/engine.js +677 -0
  138. package/dist/flags/engine.js.map +1 -0
  139. package/dist/flags/index.d.ts +4 -0
  140. package/dist/flags/index.js +16 -0
  141. package/dist/flags/index.js.map +1 -0
  142. package/dist/guard/__tests__/findings.test.js +28 -9
  143. package/dist/guard/__tests__/findings.test.js.map +1 -1
  144. package/dist/guard/__tests__/report.test.js +67 -0
  145. package/dist/guard/__tests__/report.test.js.map +1 -1
  146. package/dist/guard/base.d.ts +2 -0
  147. package/dist/guard/base.js +4 -0
  148. package/dist/guard/base.js.map +1 -1
  149. package/dist/guard/findings.d.ts +12 -2
  150. package/dist/guard/findings.js +19 -49
  151. package/dist/guard/findings.js.map +1 -1
  152. package/dist/guard/heartbeat.d.ts +34 -0
  153. package/dist/guard/heartbeat.js +83 -0
  154. package/dist/guard/heartbeat.js.map +1 -0
  155. package/dist/guard/integration.d.ts +33 -3
  156. package/dist/guard/integration.js +106 -32
  157. package/dist/guard/integration.js.map +1 -1
  158. package/dist/guard/pipeline.d.ts +10 -1
  159. package/dist/guard/pipeline.js +14 -0
  160. package/dist/guard/pipeline.js.map +1 -1
  161. package/dist/guard/report.d.ts +24 -1
  162. package/dist/guard/report.js +67 -18
  163. package/dist/guard/report.js.map +1 -1
  164. package/dist/index.d.ts +90 -0
  165. package/dist/index.js +225 -3
  166. package/dist/index.js.map +1 -1
  167. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  168. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  169. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  170. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  171. package/dist/instrumentation/mcp/wrapper.js +7 -1
  172. package/dist/instrumentation/mcp/wrapper.js.map +1 -1
  173. package/dist/instrumentation/openai/wrapper.js +6 -0
  174. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  175. package/dist/masking.d.ts +42 -0
  176. package/dist/masking.js +197 -0
  177. package/dist/masking.js.map +1 -0
  178. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  179. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  180. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  181. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  182. package/dist/otel/__tests__/app-logs.test.js +269 -0
  183. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  184. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  185. package/dist/otel/__tests__/log-auto.test.js +125 -0
  186. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  187. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  188. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  189. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  190. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  191. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  192. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  193. package/dist/otel/app-logs.d.ts +80 -0
  194. package/dist/otel/app-logs.js +195 -0
  195. package/dist/otel/app-logs.js.map +1 -0
  196. package/dist/otel/build-info.d.ts +23 -0
  197. package/dist/otel/build-info.js +176 -0
  198. package/dist/otel/build-info.js.map +1 -0
  199. package/dist/otel/code-location.d.ts +49 -0
  200. package/dist/otel/code-location.js +233 -0
  201. package/dist/otel/code-location.js.map +1 -0
  202. package/dist/otel/events.d.ts +1 -0
  203. package/dist/otel/events.js +21 -12
  204. package/dist/otel/events.js.map +1 -1
  205. package/dist/otel/log-auto.d.ts +44 -0
  206. package/dist/otel/log-auto.js +200 -0
  207. package/dist/otel/log-auto.js.map +1 -0
  208. package/dist/otel/log-bridges.d.ts +54 -0
  209. package/dist/otel/log-bridges.js +307 -0
  210. package/dist/otel/log-bridges.js.map +1 -0
  211. package/dist/otel/system-metrics.d.ts +39 -0
  212. package/dist/otel/system-metrics.js +166 -0
  213. package/dist/otel/system-metrics.js.map +1 -0
  214. package/dist/otel/tracing.js +12 -1
  215. package/dist/otel/tracing.js.map +1 -1
  216. package/dist/pricing.json +100 -42
  217. package/dist/protect/__tests__/protect.test.d.ts +1 -0
  218. package/dist/protect/__tests__/protect.test.js +210 -0
  219. package/dist/protect/__tests__/protect.test.js.map +1 -0
  220. package/dist/protect/index.d.ts +103 -0
  221. package/dist/protect/index.js +196 -0
  222. package/dist/protect/index.js.map +1 -0
  223. package/dist/protect/mcp.d.ts +13 -0
  224. package/dist/protect/mcp.js +49 -0
  225. package/dist/protect/mcp.js.map +1 -0
  226. package/dist/protect/mode.d.ts +89 -0
  227. package/dist/protect/mode.js +134 -0
  228. package/dist/protect/mode.js.map +1 -0
  229. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  231. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  232. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/baseline.test.js +86 -0
  234. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  235. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  237. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  238. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  240. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  241. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  243. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/config-client.test.js +283 -0
  246. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  247. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  248. package/dist/rasp/__tests__/corpus.js +111 -0
  249. package/dist/rasp/__tests__/corpus.js.map +1 -0
  250. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  252. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  253. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  255. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  256. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/deception.test.js +567 -0
  258. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  259. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/detect.test.js +276 -0
  261. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  262. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  264. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  265. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  267. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  268. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  270. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  271. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  272. package/dist/rasp/__tests__/hook-kit.js +139 -0
  273. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  274. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  276. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  277. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/iast.test.js +361 -0
  279. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  280. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  282. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  283. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/middleware.test.js +302 -0
  285. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  286. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  288. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  289. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/reporter.test.js +114 -0
  291. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  292. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  293. package/dist/rasp/__tests__/route.test.js +46 -0
  294. package/dist/rasp/__tests__/route.test.js.map +1 -0
  295. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  296. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  297. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  298. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  299. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  300. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  301. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  302. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  303. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  304. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  305. package/dist/rasp/__tests__/targets.test.js +82 -0
  306. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  307. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  308. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  309. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  310. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  311. package/dist/rasp/__tests__/upload.test.js +81 -0
  312. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  313. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  314. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  315. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  316. package/dist/rasp/auto-http.d.ts +6 -0
  317. package/dist/rasp/auto-http.js +194 -0
  318. package/dist/rasp/auto-http.js.map +1 -0
  319. package/dist/rasp/baseline.d.ts +35 -0
  320. package/dist/rasp/baseline.js +91 -0
  321. package/dist/rasp/baseline.js.map +1 -0
  322. package/dist/rasp/capture.d.ts +76 -0
  323. package/dist/rasp/capture.js +304 -0
  324. package/dist/rasp/capture.js.map +1 -0
  325. package/dist/rasp/config-client.d.ts +122 -0
  326. package/dist/rasp/config-client.js +337 -0
  327. package/dist/rasp/config-client.js.map +1 -0
  328. package/dist/rasp/context.d.ts +65 -0
  329. package/dist/rasp/context.js +68 -0
  330. package/dist/rasp/context.js.map +1 -0
  331. package/dist/rasp/custom-rules.d.ts +68 -0
  332. package/dist/rasp/custom-rules.js +222 -0
  333. package/dist/rasp/custom-rules.js.map +1 -0
  334. package/dist/rasp/data/default-rules.json +199 -0
  335. package/dist/rasp/data/default-sinks.json +4 -0
  336. package/dist/rasp/data/dnslog-domains.json +11 -0
  337. package/dist/rasp/deception.d.ts +70 -0
  338. package/dist/rasp/deception.js +220 -0
  339. package/dist/rasp/deception.js.map +1 -0
  340. package/dist/rasp/detect.d.ts +68 -0
  341. package/dist/rasp/detect.js +671 -0
  342. package/dist/rasp/detect.js.map +1 -0
  343. package/dist/rasp/engine.d.ts +107 -0
  344. package/dist/rasp/engine.js +330 -0
  345. package/dist/rasp/engine.js.map +1 -0
  346. package/dist/rasp/hooks/code.d.ts +20 -0
  347. package/dist/rasp/hooks/code.js +334 -0
  348. package/dist/rasp/hooks/code.js.map +1 -0
  349. package/dist/rasp/hooks/db.d.ts +48 -0
  350. package/dist/rasp/hooks/db.js +322 -0
  351. package/dist/rasp/hooks/db.js.map +1 -0
  352. package/dist/rasp/hooks/esm.d.ts +7 -0
  353. package/dist/rasp/hooks/esm.js +18 -0
  354. package/dist/rasp/hooks/esm.js.map +1 -0
  355. package/dist/rasp/hooks/fs.d.ts +3 -0
  356. package/dist/rasp/hooks/fs.js +206 -0
  357. package/dist/rasp/hooks/fs.js.map +1 -0
  358. package/dist/rasp/hooks/http.d.ts +4 -0
  359. package/dist/rasp/hooks/http.js +213 -0
  360. package/dist/rasp/hooks/http.js.map +1 -0
  361. package/dist/rasp/hooks/include.d.ts +9 -0
  362. package/dist/rasp/hooks/include.js +79 -0
  363. package/dist/rasp/hooks/include.js.map +1 -0
  364. package/dist/rasp/hooks/marks.d.ts +2 -0
  365. package/dist/rasp/hooks/marks.js +16 -0
  366. package/dist/rasp/hooks/marks.js.map +1 -0
  367. package/dist/rasp/hooks/process.d.ts +22 -0
  368. package/dist/rasp/hooks/process.js +191 -0
  369. package/dist/rasp/hooks/process.js.map +1 -0
  370. package/dist/rasp/hooks/sinks.d.ts +54 -0
  371. package/dist/rasp/hooks/sinks.js +329 -0
  372. package/dist/rasp/hooks/sinks.js.map +1 -0
  373. package/dist/rasp/hooks/template.d.ts +21 -0
  374. package/dist/rasp/hooks/template.js +152 -0
  375. package/dist/rasp/hooks/template.js.map +1 -0
  376. package/dist/rasp/iast-rules.d.ts +82 -0
  377. package/dist/rasp/iast-rules.js +240 -0
  378. package/dist/rasp/iast-rules.js.map +1 -0
  379. package/dist/rasp/iast-scope.d.ts +29 -0
  380. package/dist/rasp/iast-scope.js +54 -0
  381. package/dist/rasp/iast-scope.js.map +1 -0
  382. package/dist/rasp/iast.d.ts +81 -0
  383. package/dist/rasp/iast.js +272 -0
  384. package/dist/rasp/iast.js.map +1 -0
  385. package/dist/rasp/index.d.ts +52 -0
  386. package/dist/rasp/index.js +280 -0
  387. package/dist/rasp/index.js.map +1 -0
  388. package/dist/rasp/lexers.d.ts +32 -0
  389. package/dist/rasp/lexers.js +444 -0
  390. package/dist/rasp/lexers.js.map +1 -0
  391. package/dist/rasp/middleware.d.ts +155 -0
  392. package/dist/rasp/middleware.js +568 -0
  393. package/dist/rasp/middleware.js.map +1 -0
  394. package/dist/rasp/model-output.d.ts +14 -0
  395. package/dist/rasp/model-output.js +107 -0
  396. package/dist/rasp/model-output.js.map +1 -0
  397. package/dist/rasp/normalize.d.ts +23 -0
  398. package/dist/rasp/normalize.js +140 -0
  399. package/dist/rasp/normalize.js.map +1 -0
  400. package/dist/rasp/reporter.d.ts +60 -0
  401. package/dist/rasp/reporter.js +230 -0
  402. package/dist/rasp/reporter.js.map +1 -0
  403. package/dist/rasp/rule-expr.d.ts +236 -0
  404. package/dist/rasp/rule-expr.js +1253 -0
  405. package/dist/rasp/rule-expr.js.map +1 -0
  406. package/dist/rasp/template.d.ts +53 -0
  407. package/dist/rasp/template.js +336 -0
  408. package/dist/rasp/template.js.map +1 -0
  409. package/dist/rasp/types.d.ts +110 -0
  410. package/dist/rasp/types.js +51 -0
  411. package/dist/rasp/types.js.map +1 -0
  412. package/dist/rasp/vpatch.d.ts +55 -0
  413. package/dist/rasp/vpatch.js +120 -0
  414. package/dist/rasp/vpatch.js.map +1 -0
  415. package/dist/register.js +52 -11
  416. package/dist/register.js.map +1 -1
  417. package/dist/semantic-convention.d.ts +2 -0
  418. package/dist/semantic-convention.js +5 -0
  419. package/dist/semantic-convention.js.map +1 -1
  420. package/dist/types.d.ts +96 -0
  421. package/dist/zero-code.d.ts +8 -0
  422. package/dist/zero-code.js +38 -0
  423. package/dist/zero-code.js.map +1 -0
  424. package/package.json +18 -2
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Budget check: ask Shield360 whether this app may spend on a model call.
3
+ *
4
+ * Shield360.budgets.check({ model, estimatedCostUsd })
5
+ * -> { allowed, action: allow | warn | throttle | block, reason, ... }
6
+ *
7
+ * The answer comes from the platform's GET /api/budgets/decision, the one
8
+ * spend decision every Shield360 enforcement point uses, asked with the
9
+ * environment's API key and this app's service name. App budgets (Costs ->
10
+ * Budgets, "App") and project budgets with enforcement rules apply.
11
+ *
12
+ * It does not call the platform on every request. Like the CLI's proxy and
13
+ * hooks (cli/internal/spenddecision), a decision is reused for the
14
+ * ttlSeconds the platform sets (60 s by default) while the estimated cost of
15
+ * the calls checked with it fits in its headroomUsd, the spend left before
16
+ * any limit turns stricter. Concurrent checks share one fetch.
17
+ *
18
+ * It never throws. When no decision can be read it fails open (allowed) by
19
+ * default; closed when `failClosed` is set here or on the client, or when
20
+ * the last decision read said failClosed (a budget with a block rule that
21
+ * asks for it). A failed read is not retried for a few seconds.
22
+ *
23
+ * Must stay in sync with: sdk/python/src/shield360/budgets.py
24
+ */
25
+ export type BudgetAction = 'allow' | 'warn' | 'throttle' | 'block';
26
+ export type BudgetCheckOptions = {
27
+ /** The app's service name; defaults to the applicationName given to init(). */
28
+ app?: string;
29
+ /** The model the call will use, for model budgets. */
30
+ model?: string;
31
+ /** What the call may cost in USD, when the caller can estimate it. Held against the decision's headroom. */
32
+ estimatedCostUsd?: number;
33
+ /** Refuse when no decision can be read. Overrides the client's setting for this check. */
34
+ failClosed?: boolean;
35
+ };
36
+ export type BudgetCheckResult = {
37
+ /** Whether the call may go ahead. */
38
+ allowed: boolean;
39
+ action: BudgetAction;
40
+ /** budget_ok, budget_warn, budget_throttle, budget_block, budget_override or budget_unavailable. */
41
+ code: string;
42
+ /** What to show or log, from the platform. Empty when allowed with nothing to say. */
43
+ reason: string;
44
+ /** The limit that decided, when one did. */
45
+ limit: {
46
+ id: string;
47
+ name: string;
48
+ scope: string;
49
+ } | null;
50
+ /** Spend left before a stricter action, from the decision; null when spending cannot make it stricter. */
51
+ headroomUsd: number | null;
52
+ /** Answered from a decision already fetched. */
53
+ cached: boolean;
54
+ /** No decision could be read; `allowed` is the fail mode's. */
55
+ unavailable: boolean;
56
+ };
57
+ export type BudgetClientOptions = {
58
+ /** Shield360 URL; defaults to init()'s shield360Url or SHIELD360_URL. */
59
+ url?: string;
60
+ /** Environment API key; defaults to init()'s shield360ApiKey or SHIELD360_API_KEY. */
61
+ apiKey?: string;
62
+ /** The app's service name; defaults to init()'s applicationName. */
63
+ app?: string;
64
+ /** Refuse when no decision can be read (default false; env SHIELD360_BUDGET_FAIL_CLOSED=1). */
65
+ failClosed?: boolean;
66
+ /** One fetch's timeout. Default 3000 ms. */
67
+ timeoutMs?: number;
68
+ fetch?: typeof fetch;
69
+ now?: () => number;
70
+ };
71
+ export declare const UNAVAILABLE_REASON = "Shield360 could not check the budget for this AI call, and this app is set to wait until it can. Try again shortly. [budget_unavailable]";
72
+ /** Thrown by the automatic pre-call check (init({ budgetCheck })) when a budget refuses the call. */
73
+ export declare class BudgetExceededError extends Error {
74
+ readonly result: BudgetCheckResult;
75
+ constructor(result: BudgetCheckResult);
76
+ }
77
+ export declare class BudgetClient {
78
+ private readonly opts;
79
+ private cache;
80
+ private inflight;
81
+ private unavailableUntil;
82
+ private calls;
83
+ /** The last decision read asked to fail closed. */
84
+ private failClosedHint;
85
+ constructor(opts?: BudgetClientOptions);
86
+ private now;
87
+ private creds;
88
+ /** Forget cached decisions (after changing a budget, and in tests). */
89
+ reset(): void;
90
+ /** The decision for one call. Never throws. */
91
+ check(options?: BudgetCheckOptions): Promise<BudgetCheckResult>;
92
+ private failClosed;
93
+ private unavailable;
94
+ private checkUnsafe;
95
+ private fits;
96
+ private fetchDecision;
97
+ /** Throttle is a per-subject sliding minute, as the CLI keeps it. */
98
+ private throttled;
99
+ private result;
100
+ }
101
+ /** The process's client, built from init()'s URL, API key and applicationName. */
102
+ export declare function defaultBudgetClient(): BudgetClient;
103
+ /** Replace the process's client (init({ budgetCheck: { failClosed } }) and tests). */
104
+ export declare function configureBudgets(opts?: BudgetClientOptions): BudgetClient;
105
+ /** Shield360.budgets: check() with the process's client. */
106
+ export declare const budgets: {
107
+ check: (options?: BudgetCheckOptions) => Promise<BudgetCheckResult>;
108
+ configure: typeof configureBudgets;
109
+ reset: () => void;
110
+ };
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ /**
3
+ * Budget check: ask Shield360 whether this app may spend on a model call.
4
+ *
5
+ * Shield360.budgets.check({ model, estimatedCostUsd })
6
+ * -> { allowed, action: allow | warn | throttle | block, reason, ... }
7
+ *
8
+ * The answer comes from the platform's GET /api/budgets/decision, the one
9
+ * spend decision every Shield360 enforcement point uses, asked with the
10
+ * environment's API key and this app's service name. App budgets (Costs ->
11
+ * Budgets, "App") and project budgets with enforcement rules apply.
12
+ *
13
+ * It does not call the platform on every request. Like the CLI's proxy and
14
+ * hooks (cli/internal/spenddecision), a decision is reused for the
15
+ * ttlSeconds the platform sets (60 s by default) while the estimated cost of
16
+ * the calls checked with it fits in its headroomUsd, the spend left before
17
+ * any limit turns stricter. Concurrent checks share one fetch.
18
+ *
19
+ * It never throws. When no decision can be read it fails open (allowed) by
20
+ * default; closed when `failClosed` is set here or on the client, or when
21
+ * the last decision read said failClosed (a budget with a block rule that
22
+ * asks for it). A failed read is not retried for a few seconds.
23
+ *
24
+ * Must stay in sync with: sdk/python/src/shield360/budgets.py
25
+ */
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.budgets = exports.BudgetClient = exports.BudgetExceededError = exports.UNAVAILABLE_REASON = void 0;
31
+ exports.defaultBudgetClient = defaultBudgetClient;
32
+ exports.configureBudgets = configureBudgets;
33
+ const config_1 = __importDefault(require("../config"));
34
+ const DEFAULT_TTL_MS = 60000;
35
+ const MAX_TTL_MS = 600000;
36
+ /** How long a failed read stands before the next check tries again. */
37
+ const UNAVAILABLE_BACKOFF_MS = 5000;
38
+ const MAX_SUBJECT = 256;
39
+ const ACTIONS = ['allow', 'warn', 'throttle', 'block'];
40
+ exports.UNAVAILABLE_REASON = 'Shield360 could not check the budget for this AI call, and this app is set to wait until it can. Try again shortly. [budget_unavailable]';
41
+ function envFlag(name) {
42
+ const v = (typeof process !== 'undefined' ? process.env?.[name] : undefined)?.trim().toLowerCase();
43
+ return v === '1' || v === 'true' || v === 'yes';
44
+ }
45
+ const positive = (v) => (typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : 0);
46
+ function clean(v) {
47
+ if (typeof v !== 'string')
48
+ return undefined;
49
+ const t = v.trim();
50
+ return t && t.length <= MAX_SUBJECT ? t : undefined;
51
+ }
52
+ /** Thrown by the automatic pre-call check (init({ budgetCheck })) when a budget refuses the call. */
53
+ class BudgetExceededError extends Error {
54
+ constructor(result) {
55
+ super(result.reason || `Shield360 budget refused this AI call. [${result.code}]`);
56
+ this.name = 'BudgetExceededError';
57
+ this.result = result;
58
+ }
59
+ }
60
+ exports.BudgetExceededError = BudgetExceededError;
61
+ class BudgetClient {
62
+ constructor(opts = {}) {
63
+ this.cache = new Map();
64
+ this.inflight = new Map();
65
+ this.unavailableUntil = new Map();
66
+ this.calls = new Map();
67
+ /** The last decision read asked to fail closed. */
68
+ this.failClosedHint = false;
69
+ this.opts = opts;
70
+ }
71
+ now() {
72
+ return this.opts.now ? this.opts.now() : Date.now();
73
+ }
74
+ creds() {
75
+ const env = typeof process !== 'undefined' ? process.env : {};
76
+ return {
77
+ url: this.opts.url ?? config_1.default.shield360Url ?? env.SHIELD360_URL,
78
+ apiKey: this.opts.apiKey ?? config_1.default.shield360ApiKey ?? env.SHIELD360_API_KEY,
79
+ };
80
+ }
81
+ /** Forget cached decisions (after changing a budget, and in tests). */
82
+ reset() {
83
+ this.cache.clear();
84
+ this.inflight.clear();
85
+ this.unavailableUntil.clear();
86
+ this.calls.clear();
87
+ this.failClosedHint = false;
88
+ }
89
+ /** The decision for one call. Never throws. */
90
+ async check(options = {}) {
91
+ try {
92
+ return await this.checkUnsafe(options);
93
+ }
94
+ catch {
95
+ return this.unavailable(options);
96
+ }
97
+ }
98
+ failClosed(options) {
99
+ if (options.failClosed !== undefined)
100
+ return options.failClosed;
101
+ if (this.opts.failClosed !== undefined)
102
+ return this.opts.failClosed || this.failClosedHint;
103
+ return envFlag('SHIELD360_BUDGET_FAIL_CLOSED') || this.failClosedHint;
104
+ }
105
+ unavailable(options) {
106
+ const closed = this.failClosed(options);
107
+ return {
108
+ allowed: !closed,
109
+ action: closed ? 'block' : 'allow',
110
+ code: 'budget_unavailable',
111
+ reason: closed ? exports.UNAVAILABLE_REASON : '',
112
+ limit: null,
113
+ headroomUsd: null,
114
+ cached: false,
115
+ unavailable: true,
116
+ };
117
+ }
118
+ async checkUnsafe(options) {
119
+ const app = clean(options.app) ?? clean(this.opts.app) ?? clean(config_1.default.applicationName);
120
+ const model = clean(options.model);
121
+ const cost = positive(options.estimatedCostUsd);
122
+ const { url, apiKey } = this.creds();
123
+ if (!app || !url || !apiKey)
124
+ return this.unavailable(options);
125
+ const key = `${app}\u0000${model ?? ''}`.toLowerCase();
126
+ const now = this.now();
127
+ const hit = this.cache.get(key);
128
+ if (hit && now - hit.fetchedAt < hit.ttlMs && this.fits(hit, cost)) {
129
+ hit.spent += cost;
130
+ return this.result(key, hit.decision, true);
131
+ }
132
+ if ((this.unavailableUntil.get(key) ?? 0) > now)
133
+ return this.unavailable(options);
134
+ let pending = this.inflight.get(key);
135
+ const started = !pending;
136
+ if (!pending) {
137
+ pending = this.fetchDecision(url, apiKey, app, model, cost).finally(() => this.inflight.delete(key));
138
+ this.inflight.set(key, pending);
139
+ }
140
+ const entry = await pending;
141
+ if (!entry) {
142
+ this.unavailableUntil.set(key, this.now() + UNAVAILABLE_BACKOFF_MS);
143
+ return this.unavailable(options);
144
+ }
145
+ this.unavailableUntil.delete(key);
146
+ if (started)
147
+ this.cache.set(key, entry);
148
+ // The fetch asked with the first call's cost; every call that shares the decision counts against its headroom.
149
+ entry.spent += cost;
150
+ return this.result(key, entry.decision, !started);
151
+ }
152
+ fits(entry, cost) {
153
+ const h = entry.decision.headroomUsd;
154
+ return h === null || h === undefined || entry.spent + cost <= h;
155
+ }
156
+ async fetchDecision(url, apiKey, app, model, cost) {
157
+ const doFetch = this.opts.fetch ?? (typeof fetch === 'function' ? fetch : undefined);
158
+ if (!doFetch)
159
+ return null;
160
+ const q = new URLSearchParams({ app });
161
+ if (model)
162
+ q.set('model', model);
163
+ if (cost > 0)
164
+ q.set('cost', cost.toFixed(6));
165
+ const controller = typeof AbortController === 'function' ? new AbortController() : undefined;
166
+ const timer = setTimeout(() => controller?.abort(), this.opts.timeoutMs ?? 3000);
167
+ try {
168
+ const res = await doFetch(`${url.replace(/\/+$/, '')}/api/budgets/decision?${q.toString()}`, {
169
+ headers: { Authorization: `Bearer ${apiKey}`, Accept: 'application/json' },
170
+ signal: controller?.signal,
171
+ });
172
+ if (!res.ok)
173
+ return null;
174
+ const decision = (await res.json());
175
+ if (!decision || typeof decision !== 'object' || !ACTIONS.includes(decision.action))
176
+ return null;
177
+ this.failClosedHint = decision.failClosed === true;
178
+ const ttl = Number(decision.ttlSeconds) > 0 ? Math.min(Number(decision.ttlSeconds) * 1000, MAX_TTL_MS) : DEFAULT_TTL_MS;
179
+ return { decision, fetchedAt: this.now(), ttlMs: ttl, spent: 0 };
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ finally {
185
+ clearTimeout(timer);
186
+ }
187
+ }
188
+ /** Throttle is a per-subject sliding minute, as the CLI keeps it. */
189
+ throttled(key, rpm) {
190
+ const now = this.now();
191
+ const recent = (this.calls.get(key) ?? []).filter((t) => now - t < 60000);
192
+ if (recent.length >= rpm) {
193
+ this.calls.set(key, recent);
194
+ return true;
195
+ }
196
+ recent.push(now);
197
+ this.calls.set(key, recent);
198
+ return false;
199
+ }
200
+ result(key, d, cached) {
201
+ const action = (ACTIONS.includes(d.action) ? d.action : 'allow');
202
+ let allowed = action === 'allow' || action === 'warn';
203
+ if (action === 'throttle') {
204
+ const rpm = Math.max(1, Math.floor(Number(d.throttle?.requestsPerMinute) || 1));
205
+ allowed = !this.throttled(key, rpm);
206
+ }
207
+ const headroom = typeof d.headroomUsd === 'number' && Number.isFinite(d.headroomUsd) ? d.headroomUsd : null;
208
+ return {
209
+ allowed,
210
+ action,
211
+ code: typeof d.code === 'string' ? d.code : `budget_${action === 'allow' ? 'ok' : action}`,
212
+ reason: typeof d.reason === 'string' ? d.reason : '',
213
+ limit: d.limit && typeof d.limit === 'object' ? { id: String(d.limit.id ?? ''), name: String(d.limit.name ?? ''), scope: String(d.limit.scope ?? '') } : null,
214
+ headroomUsd: headroom,
215
+ cached,
216
+ unavailable: false,
217
+ };
218
+ }
219
+ }
220
+ exports.BudgetClient = BudgetClient;
221
+ let defaultClient = null;
222
+ /** The process's client, built from init()'s URL, API key and applicationName. */
223
+ function defaultBudgetClient() {
224
+ if (!defaultClient)
225
+ defaultClient = new BudgetClient();
226
+ return defaultClient;
227
+ }
228
+ /** Replace the process's client (init({ budgetCheck: { failClosed } }) and tests). */
229
+ function configureBudgets(opts = {}) {
230
+ defaultClient = new BudgetClient(opts);
231
+ return defaultClient;
232
+ }
233
+ /** Shield360.budgets: check() with the process's client. */
234
+ exports.budgets = {
235
+ check: (options) => defaultBudgetClient().check(options),
236
+ configure: configureBudgets,
237
+ reset: () => defaultBudgetClient().reset(),
238
+ };
239
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/budgets/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;AAqQH,kDAGC;AAGD,4CAGC;AA5QD,uDAAwC;AA6DxC,MAAM,cAAc,GAAG,KAAM,CAAC;AAC9B,MAAM,UAAU,GAAG,MAAO,CAAC;AAC3B,uEAAuE;AACvE,MAAM,sBAAsB,GAAG,IAAK,CAAC;AACrC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,OAAO,GAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAEnE,QAAA,kBAAkB,GAC7B,0IAA0I,CAAC;AAE7I,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,CAAC,GAAG,CAAC,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC;AAClD,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExG,SAAS,KAAK,CAAC,CAAU;IACvB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,qGAAqG;AACrG,MAAa,mBAAoB,SAAQ,KAAK;IAE5C,YAAY,MAAyB;QACnC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,2CAA2C,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAPD,kDAOC;AAED,MAAa,YAAY;IASvB,YAAY,OAA4B,EAAE;QAPlC,UAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;QACjC,aAAQ,GAAG,IAAI,GAAG,EAAiC,CAAC;QACpD,qBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,UAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC5C,mDAAmD;QAC3C,mBAAc,GAAG,KAAK,CAAC;QAG7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,GAAG;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACtD,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,gBAAe,CAAC,YAAY,IAAI,GAAG,CAAC,aAAa;YACvE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,gBAAe,CAAC,eAAe,IAAI,GAAG,CAAC,iBAAiB;SACrF,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,KAAK,CAAC,UAA8B,EAAE;QAC1C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAA2B;QAC5C,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,UAAU,CAAC;QAChE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,CAAC;QAC3F,OAAO,OAAO,CAAC,8BAA8B,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC;IACxE,CAAC;IAEO,WAAW,CAAC,OAA2B;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,CAAC,MAAM;YAChB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YAClC,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,0BAAkB,CAAC,CAAC,CAAC,EAAE;YACxC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAA2B;QACnD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAe,CAAC,eAAe,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,KAAK,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAElF,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACrG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC;QAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxC,+GAA+G;QAC/G,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IAEO,IAAI,CAAC,KAAY,EAAE,IAAY;QACrC,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QACrC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,MAAc,EAAE,GAAW,EAAE,KAAyB,EAAE,IAAY;QAC3G,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,CAAC;YAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,OAAO,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7F,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE;gBAC3F,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBAC1E,MAAM,EAAE,UAAU,EAAE,MAAM;aAC3B,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC;YACzB,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAa,CAAC;YAChD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAsB,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjH,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YACxH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,qEAAqE;IAC7D,SAAS,CAAC,GAAW,EAAE,GAAW;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,KAAM,CAAC,CAAC;QAC3E,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,GAAW,EAAE,CAAW,EAAE,MAAe;QACtD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAiB,CAAC;QACjG,IAAI,OAAO,GAAG,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,CAAC;QACtD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChF,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5G,OAAO;YACL,OAAO;YACP,MAAM;YACN,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YAC1F,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACpD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YAC7J,WAAW,EAAE,QAAQ;YACrB,MAAM;YACN,WAAW,EAAE,KAAK;SACnB,CAAC;IACJ,CAAC;CACF;AAhKD,oCAgKC;AAED,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C,kFAAkF;AAClF,SAAgB,mBAAmB;IACjC,IAAI,CAAC,aAAa;QAAE,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;IACvD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,sFAAsF;AACtF,SAAgB,gBAAgB,CAAC,OAA4B,EAAE;IAC7D,aAAa,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,4DAA4D;AAC/C,QAAA,OAAO,GAAG;IACrB,KAAK,EAAE,CAAC,OAA4B,EAA8B,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;IACzG,SAAS,EAAE,gBAAgB;IAC3B,KAAK,EAAE,GAAS,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE;CACjD,CAAC"}
package/dist/config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class Shield360Config {
4
- static updateConfig({ environment = 'default', applicationName = 'default', tracer, otlpEndpoint, otlpHeaders, disableBatch = false, captureMessageContent = true, pricingJson, disableMetrics = false, disableEvents = false, maxContentLength = null, customSpanAttributes = null, shield360ApiKey, shield360Url, }) {
4
+ static updateConfig({ environment = 'default', applicationName = 'default', tracer, otlpEndpoint, otlpHeaders, disableBatch = false, captureMessageContent = false, pricingJson, disableMetrics = false, disableEvents = false, maxContentLength = null, customSpanAttributes = null, shield360ApiKey, shield360Url, }) {
5
5
  this.environment = environment;
6
6
  this.applicationName = applicationName;
7
7
  this.tracer = tracer;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAGA,MAAqB,eAAe;IAkBlC,MAAM,CAAC,YAAY,CAAC,EAClB,WAAW,GAAG,SAAS,EACvB,eAAe,GAAG,SAAS,EAC3B,MAAM,EACN,YAAY,EACZ,WAAW,EACX,YAAY,GAAG,KAAK,EACpB,qBAAqB,GAAG,IAAI,EAC5B,WAAW,EACX,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,KAAK,EACrB,gBAAgB,GAAG,IAAI,EACvB,oBAAoB,GAAG,IAAI,EAC3B,eAAe,EACf,YAAY,GAQb;QACC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAA4C,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACjD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAxDD,kCAwDC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAGA,MAAqB,eAAe;IAkBlC,MAAM,CAAC,YAAY,CAAC,EAClB,WAAW,GAAG,SAAS,EACvB,eAAe,GAAG,SAAS,EAC3B,MAAM,EACN,YAAY,EACZ,WAAW,EACX,YAAY,GAAG,KAAK,EACpB,qBAAqB,GAAG,KAAK,EAC7B,WAAW,EACX,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,KAAK,EACrB,gBAAgB,GAAG,IAAI,EACvB,oBAAoB,GAAG,IAAI,EAC3B,eAAe,EACf,YAAY,GAQb;QACC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAA4C,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;QACjD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAxDD,kCAwDC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
7
+ const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
8
+ const index_1 = __importDefault(require("../../index"));
9
+ const tracing_1 = __importDefault(require("../../otel/tracing"));
10
+ const index_2 = require("../index");
11
+ const tick = () => new Promise((r) => setTimeout(r, 1));
12
+ afterEach(() => (0, index_2.setCustomer)(null));
13
+ describe('customer context', () => {
14
+ it('has no customer by default', () => {
15
+ expect((0, index_2.getCustomer)()).toBeNull();
16
+ });
17
+ it('sets and clears a process-wide default', () => {
18
+ (0, index_2.setCustomer)({ tenantId: 'acme', userId: 'u1' });
19
+ expect((0, index_2.getCustomer)()).toEqual({ tenantId: 'acme', userId: 'u1' });
20
+ (0, index_2.setCustomer)(null);
21
+ expect((0, index_2.getCustomer)()).toBeNull();
22
+ });
23
+ it('withCustomer wins over the default, nests, and restores after', () => {
24
+ (0, index_2.setCustomer)({ tenantId: 'default-co' });
25
+ const seen = (0, index_2.withCustomer)({ tenantId: 'acme', userId: 'u1' }, () => {
26
+ const outer = (0, index_2.getCustomer)();
27
+ const inner = (0, index_2.withCustomer)({ tenantId: 'globex' }, () => (0, index_2.getCustomer)());
28
+ return { outer, inner, after: (0, index_2.getCustomer)() };
29
+ });
30
+ expect(seen.outer).toEqual({ tenantId: 'acme', userId: 'u1' });
31
+ expect(seen.inner).toEqual({ tenantId: 'globex' });
32
+ expect(seen.after).toEqual({ tenantId: 'acme', userId: 'u1' });
33
+ expect((0, index_2.getCustomer)()).toEqual({ tenantId: 'default-co' });
34
+ });
35
+ it('propagates across awaits and keeps concurrent calls apart', async () => {
36
+ const run = (tenantId) => (0, index_2.withCustomer)({ tenantId }, async () => {
37
+ await tick();
38
+ await Promise.resolve();
39
+ return (0, index_2.getCustomer)()?.tenantId;
40
+ });
41
+ const results = await Promise.all([run('a'), run('b'), run('c')]);
42
+ expect(results).toEqual(['a', 'b', 'c']);
43
+ expect((0, index_2.getCustomer)()).toBeNull();
44
+ });
45
+ it('a null or invalid scoped customer means no customer, not the default', () => {
46
+ (0, index_2.setCustomer)({ tenantId: 'default-co' });
47
+ expect((0, index_2.withCustomer)(null, () => (0, index_2.getCustomer)())).toBeNull();
48
+ expect((0, index_2.withCustomer)({ tenantId: ' ' }, () => (0, index_2.getCustomer)())).toBeNull();
49
+ });
50
+ it('is exposed on the default export', () => {
51
+ expect(index_1.default.setCustomer).toBe(index_2.setCustomer);
52
+ expect(index_1.default.withCustomer).toBe(index_2.withCustomer);
53
+ expect(index_1.default.getCustomer).toBe(index_2.getCustomer);
54
+ });
55
+ it('returns a copy, so callers cannot change the customer in effect', () => {
56
+ (0, index_2.setCustomer)({ tenantId: 'acme' });
57
+ (0, index_2.getCustomer)().tenantId = 'mutated';
58
+ expect((0, index_2.getCustomer)()).toEqual({ tenantId: 'acme' });
59
+ });
60
+ });
61
+ describe('validation', () => {
62
+ it('trims strings and converts finite numbers', () => {
63
+ expect((0, index_2.normaliseCustomerId)(' acme ')).toBe('acme');
64
+ expect((0, index_2.normaliseCustomerId)(42)).toBe('42');
65
+ expect((0, index_2.normaliseCustomerId)('x'.repeat(256))).toBe('x'.repeat(256));
66
+ });
67
+ it.each([
68
+ ['empty', ''],
69
+ ['whitespace', ' \t '],
70
+ ['too long', 'x'.repeat(257)],
71
+ ['newline', 'ac\nme'],
72
+ ['NUL', 'ac\u0000me'],
73
+ ['DEL', 'ac\u007fme'],
74
+ ['C1 control', 'ac\u0085me'],
75
+ ['NaN', NaN],
76
+ ['Infinity', Infinity],
77
+ ['object', { id: 'acme' }],
78
+ ['boolean', true],
79
+ ['null', null],
80
+ ['undefined', undefined],
81
+ ])('drops %s', (_name, value) => {
82
+ expect((0, index_2.normaliseCustomerId)(value)).toBeUndefined();
83
+ });
84
+ it('drops a userId without a valid tenantId', () => {
85
+ expect((0, index_2.normaliseCustomer)({ userId: 'u1' })).toBeNull();
86
+ expect((0, index_2.normaliseCustomer)({ tenantId: '', userId: 'u1' })).toBeNull();
87
+ });
88
+ it('keeps the tenant when only the userId is invalid', () => {
89
+ expect((0, index_2.normaliseCustomer)({ tenantId: 'acme', userId: 'bad\nid' })).toEqual({ tenantId: 'acme' });
90
+ });
91
+ it('never throws on odd input', () => {
92
+ expect(() => (0, index_2.setCustomer)('acme')).not.toThrow();
93
+ expect((0, index_2.getCustomer)()).toBeNull();
94
+ const hostile = { get tenantId() { throw new Error('boom'); } };
95
+ expect(() => (0, index_2.setCustomer)(hostile)).not.toThrow();
96
+ expect((0, index_2.getCustomer)()).toBeNull();
97
+ });
98
+ it('an invalid default clears the previous one', () => {
99
+ (0, index_2.setCustomer)({ tenantId: 'acme' });
100
+ (0, index_2.setCustomer)({ tenantId: '' });
101
+ expect((0, index_2.getCustomer)()).toBeNull();
102
+ });
103
+ });
104
+ describe('CustomerSpanProcessor', () => {
105
+ let exporter;
106
+ let provider;
107
+ beforeEach(() => {
108
+ exporter = new sdk_trace_base_1.InMemorySpanExporter();
109
+ provider = new sdk_trace_node_1.NodeTracerProvider({
110
+ spanProcessors: [new index_2.CustomerSpanProcessor(), new sdk_trace_base_1.SimpleSpanProcessor(exporter)],
111
+ });
112
+ });
113
+ afterEach(async () => {
114
+ await provider.shutdown();
115
+ });
116
+ const startAndEnd = (name = 'chat gpt-4o', attributes) => provider.getTracer('test').startSpan(name, { attributes }).end();
117
+ const lastAttrs = () => {
118
+ const spans = exporter.getFinishedSpans();
119
+ return spans[spans.length - 1].attributes;
120
+ };
121
+ it('leaves spans alone when no customer is in effect', () => {
122
+ startAndEnd();
123
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_TENANT_ID]).toBeUndefined();
124
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_USER_ID]).toBeUndefined();
125
+ });
126
+ it('stamps the default customer on every span, GenAI or not', () => {
127
+ (0, index_2.setCustomer)({ tenantId: 'acme', userId: 'u1' });
128
+ startAndEnd('GET /orders', { 'http.method': 'GET' });
129
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_TENANT_ID]).toBe('acme');
130
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_USER_ID]).toBe('u1');
131
+ });
132
+ it('stamps the scoped customer, across awaits, over the default', async () => {
133
+ (0, index_2.setCustomer)({ tenantId: 'default-co' });
134
+ await (0, index_2.withCustomer)({ tenantId: 'acme', userId: 7 }, async () => {
135
+ await tick();
136
+ startAndEnd();
137
+ });
138
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_TENANT_ID]).toBe('acme');
139
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_USER_ID]).toBe('7');
140
+ startAndEnd();
141
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_TENANT_ID]).toBe('default-co');
142
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_USER_ID]).toBeUndefined();
143
+ });
144
+ it('never overwrites a tenant id the caller set on the span', () => {
145
+ (0, index_2.setCustomer)({ tenantId: 'acme', userId: 'u1' });
146
+ startAndEnd('chat', { [index_2.ATTR_CUSTOMER_TENANT_ID]: 'given' });
147
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_TENANT_ID]).toBe('given');
148
+ expect(lastAttrs()[index_2.ATTR_CUSTOMER_USER_ID]).toBeUndefined();
149
+ });
150
+ it('is registered first in the processors the SDK builds', () => {
151
+ const processors = tracing_1.default.buildSpanProcessors({ disableBatch: true });
152
+ expect(processors[0]).toBeInstanceOf(index_2.CustomerSpanProcessor);
153
+ });
154
+ });
155
+ //# sourceMappingURL=customer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer.test.js","sourceRoot":"","sources":["../../../src/customer/__tests__/customer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { Context } from '@opentelemetry/api';
2
+ import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-base';
3
+ export declare const ATTR_CUSTOMER_TENANT_ID: string;
4
+ export declare const ATTR_CUSTOMER_USER_ID: string;
5
+ /** The customer a call is attributed to. userId is only ever set with a tenantId. */
6
+ export type Customer = {
7
+ tenantId: string;
8
+ userId?: string;
9
+ };
10
+ /** What callers pass: ids may be strings or numbers; anything invalid is dropped. */
11
+ export type CustomerInput = {
12
+ tenantId?: string | number | null;
13
+ userId?: string | number | null;
14
+ };
15
+ /**
16
+ * A valid id, or undefined. Strings and finite numbers are accepted, trimmed,
17
+ * 1–256 characters, with no control characters. Never throws, never logs.
18
+ */
19
+ export declare function normaliseCustomerId(value: unknown): string | undefined;
20
+ /**
21
+ * A validated customer, or null. A user is only attributable inside a tenant,
22
+ * so a userId without a valid tenantId is dropped with it.
23
+ */
24
+ export declare function normaliseCustomer(input: CustomerInput | null | undefined): Customer | null;
25
+ /**
26
+ * Set the process-wide default customer; null clears it. An invalid tenantId
27
+ * also clears it, so calls are never attributed to the wrong customer.
28
+ */
29
+ export declare function setCustomer(customer: CustomerInput | null): void;
30
+ /**
31
+ * Run fn (sync or async) with this customer in effect for every span it
32
+ * starts. Nested calls override; the scoped customer wins over the default.
33
+ * Passing null (or an invalid tenantId) runs fn with no customer.
34
+ */
35
+ export declare function withCustomer<T>(customer: CustomerInput | null, fn: () => T): T;
36
+ /** The customer in effect here (scoped, else the default), or null. */
37
+ export declare function getCustomer(): Customer | null;
38
+ /**
39
+ * Stamps shield360.customer.tenant_id / user_id on every span started while a
40
+ * customer is in effect. A span that already carries a tenant id (set by the
41
+ * caller) is left alone, so explicit attributes are never mixed with ours.
42
+ */
43
+ export declare class CustomerSpanProcessor implements SpanProcessor {
44
+ onStart(span: Span, _parentContext: Context): void;
45
+ onEnd(_span: ReadableSpan): void;
46
+ forceFlush(): Promise<void>;
47
+ shutdown(): Promise<void>;
48
+ }