@camunda/ccma-api 0.0.1

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 (199) hide show
  1. package/dist/index.d.ts +97 -0
  2. package/dist/index.js +153 -0
  3. package/dist/index.js.map +7 -0
  4. package/dist/services/accounts/accounts.data-export.service.d.ts +13 -0
  5. package/dist/services/accounts/accounts.data-export.service.js +41 -0
  6. package/dist/services/accounts/accounts.data-export.service.js.map +7 -0
  7. package/dist/services/accounts/accounts.valuemetrics.service.d.ts +8 -0
  8. package/dist/services/accounts/accounts.valuemetrics.service.js +1 -0
  9. package/dist/services/accounts/accounts.valuemetrics.service.js.map +7 -0
  10. package/dist/services/accounts/bot.service.d.ts +21 -0
  11. package/dist/services/accounts/bot.service.js +74 -0
  12. package/dist/services/accounts/bot.service.js.map +7 -0
  13. package/dist/services/accounts/challenge.service.d.ts +296 -0
  14. package/dist/services/accounts/challenge.service.js +475 -0
  15. package/dist/services/accounts/challenge.service.js.map +7 -0
  16. package/dist/services/accounts/connections.service.d.ts +27 -0
  17. package/dist/services/accounts/connections.service.js +41 -0
  18. package/dist/services/accounts/connections.service.js.map +7 -0
  19. package/dist/services/accounts/dashboards.service.d.ts +8 -0
  20. package/dist/services/accounts/dashboards.service.js +42 -0
  21. package/dist/services/accounts/dashboards.service.js.map +7 -0
  22. package/dist/services/accounts/early-access-features.service.d.ts +34 -0
  23. package/dist/services/accounts/early-access-features.service.js +67 -0
  24. package/dist/services/accounts/early-access-features.service.js.map +7 -0
  25. package/dist/services/accounts/genericCache.service.d.ts +13 -0
  26. package/dist/services/accounts/genericCache.service.js +80 -0
  27. package/dist/services/accounts/genericCache.service.js.map +7 -0
  28. package/dist/services/accounts/hdp.service.d.ts +52 -0
  29. package/dist/services/accounts/hdp.service.js +180 -0
  30. package/dist/services/accounts/hdp.service.js.map +7 -0
  31. package/dist/services/accounts/offboarding.service.d.ts +18 -0
  32. package/dist/services/accounts/offboarding.service.js +48 -0
  33. package/dist/services/accounts/offboarding.service.js.map +7 -0
  34. package/dist/services/accounts/organization-members.service.d.ts +68 -0
  35. package/dist/services/accounts/organization-members.service.js +216 -0
  36. package/dist/services/accounts/organization-members.service.js.map +7 -0
  37. package/dist/services/accounts/orgs.service.d.ts +273 -0
  38. package/dist/services/accounts/orgs.service.js +978 -0
  39. package/dist/services/accounts/orgs.service.js.map +7 -0
  40. package/dist/services/accounts/salesplan.service.d.ts +7 -0
  41. package/dist/services/accounts/salesplan.service.js +40 -0
  42. package/dist/services/accounts/salesplan.service.js.map +7 -0
  43. package/dist/services/accounts/spam-detection.service.d.ts +8 -0
  44. package/dist/services/accounts/spam-detection.service.js +72 -0
  45. package/dist/services/accounts/spam-detection.service.js.map +7 -0
  46. package/dist/services/accounts/stats.service.d.ts +7 -0
  47. package/dist/services/accounts/stats.service.js +40 -0
  48. package/dist/services/accounts/stats.service.js.map +7 -0
  49. package/dist/services/accounts/teams.service.d.ts +85 -0
  50. package/dist/services/accounts/teams.service.js +516 -0
  51. package/dist/services/accounts/teams.service.js.map +7 -0
  52. package/dist/services/accounts/usage-alerts.service.d.ts +34 -0
  53. package/dist/services/accounts/usage-alerts.service.js +112 -0
  54. package/dist/services/accounts/usage-alerts.service.js.map +7 -0
  55. package/dist/services/accounts/users.service.d.ts +101 -0
  56. package/dist/services/accounts/users.service.js +444 -0
  57. package/dist/services/accounts/users.service.js.map +7 -0
  58. package/dist/services/alerts/alerts.service.d.ts +59 -0
  59. package/dist/services/alerts/alerts.service.js +234 -0
  60. package/dist/services/alerts/alerts.service.js.map +7 -0
  61. package/dist/services/analytic-bridge/analytic-bridge.service.d.ts +23 -0
  62. package/dist/services/analytic-bridge/analytic-bridge.service.js +86 -0
  63. package/dist/services/analytic-bridge/analytic-bridge.service.js.map +7 -0
  64. package/dist/services/audit-logger/audit-logger.service.d.ts +27 -0
  65. package/dist/services/audit-logger/audit-logger.service.js +108 -0
  66. package/dist/services/audit-logger/audit-logger.service.js.map +7 -0
  67. package/dist/services/auth0/auth0.service.d.ts +15 -0
  68. package/dist/services/auth0/auth0.service.js +40 -0
  69. package/dist/services/auth0/auth0.service.js.map +7 -0
  70. package/dist/services/comm-bridge/comm-bridge.service.d.ts +33 -0
  71. package/dist/services/comm-bridge/comm-bridge.service.js +40 -0
  72. package/dist/services/comm-bridge/comm-bridge.service.js.map +7 -0
  73. package/dist/services/console/console.admin.service.d.ts +328 -0
  74. package/dist/services/console/console.admin.service.js +1526 -0
  75. package/dist/services/console/console.admin.service.js.map +7 -0
  76. package/dist/services/console/console.alerts.service.d.ts +69 -0
  77. package/dist/services/console/console.alerts.service.js +160 -0
  78. package/dist/services/console/console.alerts.service.js.map +7 -0
  79. package/dist/services/console/console.api-clients.service.d.ts +48 -0
  80. package/dist/services/console/console.api-clients.service.js +123 -0
  81. package/dist/services/console/console.api-clients.service.js.map +7 -0
  82. package/dist/services/console/console.backup-schedule.service.d.ts +21 -0
  83. package/dist/services/console/console.backup-schedule.service.js +67 -0
  84. package/dist/services/console/console.backup-schedule.service.js.map +7 -0
  85. package/dist/services/console/console.byok-scripts.service.d.ts +12 -0
  86. package/dist/services/console/console.byok-scripts.service.js +92 -0
  87. package/dist/services/console/console.byok-scripts.service.js.map +7 -0
  88. package/dist/services/console/console.byom-monitoring.service.d.ts +58 -0
  89. package/dist/services/console/console.byom-monitoring.service.js +177 -0
  90. package/dist/services/console/console.byom-monitoring.service.js.map +7 -0
  91. package/dist/services/console/console.cluster-clients.service.d.ts +55 -0
  92. package/dist/services/console/console.cluster-clients.service.js +123 -0
  93. package/dist/services/console/console.cluster-clients.service.js.map +7 -0
  94. package/dist/services/console/console.cluster-parameters.service.d.ts +64 -0
  95. package/dist/services/console/console.cluster-parameters.service.js +39 -0
  96. package/dist/services/console/console.cluster-parameters.service.js.map +7 -0
  97. package/dist/services/console/console.cluster.service.d.ts +114 -0
  98. package/dist/services/console/console.cluster.service.js +271 -0
  99. package/dist/services/console/console.cluster.service.js.map +7 -0
  100. package/dist/services/console/console.clusterBulkOperation.service.d.ts +20 -0
  101. package/dist/services/console/console.clusterBulkOperation.service.js +199 -0
  102. package/dist/services/console/console.clusterBulkOperation.service.js.map +7 -0
  103. package/dist/services/console/console.clusterplan.modification.service.d.ts +33 -0
  104. package/dist/services/console/console.clusterplan.modification.service.js +231 -0
  105. package/dist/services/console/console.clusterplan.modification.service.js.map +7 -0
  106. package/dist/services/console/console.clusterplan.service.d.ts +21 -0
  107. package/dist/services/console/console.clusterplan.service.js +64 -0
  108. package/dist/services/console/console.clusterplan.service.js.map +7 -0
  109. package/dist/services/console/console.connector-secrets.service.d.ts +30 -0
  110. package/dist/services/console/console.connector-secrets.service.js +125 -0
  111. package/dist/services/console/console.connector-secrets.service.js.map +7 -0
  112. package/dist/services/console/console.custommetrics.service.d.ts +10 -0
  113. package/dist/services/console/console.custommetrics.service.js +43 -0
  114. package/dist/services/console/console.custommetrics.service.js.map +7 -0
  115. package/dist/services/console/console.hotbackups.service.d.ts +34 -0
  116. package/dist/services/console/console.hotbackups.service.js +120 -0
  117. package/dist/services/console/console.hotbackups.service.js.map +7 -0
  118. package/dist/services/console/console.ip-whitelist.service.d.ts +15 -0
  119. package/dist/services/console/console.ip-whitelist.service.js +36 -0
  120. package/dist/services/console/console.ip-whitelist.service.js.map +7 -0
  121. package/dist/services/console/console.jobs.saas.service.d.ts +70 -0
  122. package/dist/services/console/console.jobs.saas.service.js +139 -0
  123. package/dist/services/console/console.jobs.saas.service.js.map +7 -0
  124. package/dist/services/console/console.jobs.sm.service.d.ts +57 -0
  125. package/dist/services/console/console.jobs.sm.service.js +208 -0
  126. package/dist/services/console/console.jobs.sm.service.js.map +7 -0
  127. package/dist/services/console/console.m2m.service.d.ts +23 -0
  128. package/dist/services/console/console.m2m.service.js +94 -0
  129. package/dist/services/console/console.m2m.service.js.map +7 -0
  130. package/dist/services/console/console.secure-connectivity.service.d.ts +41 -0
  131. package/dist/services/console/console.secure-connectivity.service.js +129 -0
  132. package/dist/services/console/console.secure-connectivity.service.js.map +7 -0
  133. package/dist/services/console/console.valuemetrics.service.d.ts +17 -0
  134. package/dist/services/console/console.valuemetrics.service.js +110 -0
  135. package/dist/services/console/console.valuemetrics.service.js.map +7 -0
  136. package/dist/services/console/generation.service.d.ts +21 -0
  137. package/dist/services/console/generation.service.js +106 -0
  138. package/dist/services/console/generation.service.js.map +7 -0
  139. package/dist/services/github/github.service.d.ts +73 -0
  140. package/dist/services/github/github.service.js +272 -0
  141. package/dist/services/github/github.service.js.map +7 -0
  142. package/dist/services/hibob/hibob.service.d.ts +74 -0
  143. package/dist/services/hibob/hibob.service.js +125 -0
  144. package/dist/services/hibob/hibob.service.js.map +7 -0
  145. package/dist/services/hubspot/hubspot.service.d.ts +50 -0
  146. package/dist/services/hubspot/hubspot.service.js +119 -0
  147. package/dist/services/hubspot/hubspot.service.js.map +7 -0
  148. package/dist/services/litellm/litellm.service.d.ts +290 -0
  149. package/dist/services/litellm/litellm.service.js +392 -0
  150. package/dist/services/litellm/litellm.service.js.map +7 -0
  151. package/dist/services/login/login.service.d.ts +15 -0
  152. package/dist/services/login/login.service.js +66 -0
  153. package/dist/services/login/login.service.js.map +7 -0
  154. package/dist/services/mixpanel/mixpanel.service.d.ts +16 -0
  155. package/dist/services/mixpanel/mixpanel.service.js +86 -0
  156. package/dist/services/mixpanel/mixpanel.service.js.map +7 -0
  157. package/dist/services/notifications/notifications.service.d.ts +7 -0
  158. package/dist/services/notifications/notifications.service.js +38 -0
  159. package/dist/services/notifications/notifications.service.js.map +7 -0
  160. package/dist/services/slack/slack-blockkit.service.d.ts +28 -0
  161. package/dist/services/slack/slack-blockkit.service.js +45 -0
  162. package/dist/services/slack/slack-blockkit.service.js.map +7 -0
  163. package/dist/services/slack/slack.service.d.ts +31 -0
  164. package/dist/services/slack/slack.service.js +118 -0
  165. package/dist/services/slack/slack.service.js.map +7 -0
  166. package/dist/services/telemetry/telemetry.service.d.ts +16 -0
  167. package/dist/services/telemetry/telemetry.service.js +85 -0
  168. package/dist/services/telemetry/telemetry.service.js.map +7 -0
  169. package/dist/services/token-issuer/token-issuer.jwks.service.d.ts +13 -0
  170. package/dist/services/token-issuer/token-issuer.jwks.service.js +76 -0
  171. package/dist/services/token-issuer/token-issuer.jwks.service.js.map +7 -0
  172. package/dist/services/wordpress/wordpress.service.d.ts +15 -0
  173. package/dist/services/wordpress/wordpress.service.js +111 -0
  174. package/dist/services/wordpress/wordpress.service.js.map +7 -0
  175. package/dist/types/general.types.d.ts +61 -0
  176. package/dist/types/general.types.js +1 -0
  177. package/dist/types/general.types.js.map +7 -0
  178. package/dist/utils/api.d.ts +31 -0
  179. package/dist/utils/api.js +400 -0
  180. package/dist/utils/api.js.map +7 -0
  181. package/dist/utils/cache.d.ts +7 -0
  182. package/dist/utils/cache.js +25 -0
  183. package/dist/utils/cache.js.map +7 -0
  184. package/dist/utils/ccma-metrics.d.ts +18 -0
  185. package/dist/utils/ccma-metrics.js +37 -0
  186. package/dist/utils/ccma-metrics.js.map +7 -0
  187. package/dist/utils/environments.d.ts +11 -0
  188. package/dist/utils/environments.js +148 -0
  189. package/dist/utils/environments.js.map +7 -0
  190. package/dist/utils/errors.d.ts +5 -0
  191. package/dist/utils/errors.js +11 -0
  192. package/dist/utils/errors.js.map +7 -0
  193. package/dist/utils/frontendCache.d.ts +26 -0
  194. package/dist/utils/frontendCache.js +121 -0
  195. package/dist/utils/frontendCache.js.map +7 -0
  196. package/dist/utils/token-issuer.utils.d.ts +8 -0
  197. package/dist/utils/token-issuer.utils.js +19 -0
  198. package/dist/utils/token-issuer.utils.js.map +7 -0
  199. package/package.json +57 -0
@@ -0,0 +1,400 @@
1
+ import { getEnvParam } from "./environments.js";
2
+ import { frontendCache } from "./frontendCache.js";
3
+ function sendMetrics(payload, type, options) {
4
+ if (payload.config.metrics) {
5
+ if (payload.config.metrics.types.includes(type)) {
6
+ let durationBucket;
7
+ if (options?.duration) {
8
+ if (options.duration < 100) {
9
+ durationBucket = "0 | <100ms";
10
+ } else if (options.duration < 200) {
11
+ durationBucket = "1 | <200ms";
12
+ } else if (options.duration < 500) {
13
+ durationBucket = "2 | <500ms";
14
+ } else if (options.duration < 1e3) {
15
+ durationBucket = "3 | <1s";
16
+ } else {
17
+ durationBucket = "4 | >=1s";
18
+ }
19
+ }
20
+ let error = "other";
21
+ if (options?.error) {
22
+ try {
23
+ const errorMessage = options.error;
24
+ if (errorMessage.startsWith("<!DOCTYPE html>")) {
25
+ error = "html-response";
26
+ } else if (errorMessage.includes("UND_ERR_CONNECT_TIMEOUT")) {
27
+ error = "connect-timeout";
28
+ }
29
+ } catch (_error) {
30
+ }
31
+ } else {
32
+ error = "unset";
33
+ }
34
+ const metrics = {
35
+ ...payload.metricsDetails,
36
+ eventType: type,
37
+ durationBucket,
38
+ statusCode: options?.statusCode,
39
+ error
40
+ };
41
+ try {
42
+ payload.config.metrics.callback(metrics);
43
+ } catch (metricsCallbackError) {
44
+ log(payload, "debug", `Failed to send metrics`, {
45
+ error: metricsCallbackError,
46
+ metrics
47
+ });
48
+ }
49
+ }
50
+ }
51
+ }
52
+ function log(payload, type, message, additionalData) {
53
+ if (payload.config.logger) {
54
+ const messageParts = [];
55
+ messageParts.push(payload.metricsDetails?.method?.name);
56
+ messageParts.push(
57
+ `${payload.metricsDetails?.target?.name} (${payload.metricsDetails?.target?.type})`
58
+ );
59
+ messageParts.push(message);
60
+ let body;
61
+ if (payload.body) {
62
+ body = JSON.parse(JSON.stringify(payload.body));
63
+ for (const key of Object.keys(body)) {
64
+ if (key.toLowerCase().includes("password") || key.toLowerCase().includes("secret") || key.toLowerCase().includes("token")) {
65
+ body[key] = "********";
66
+ }
67
+ }
68
+ }
69
+ let fullUrl = "unset";
70
+ if (payload.base) {
71
+ try {
72
+ const base = getEnvParam(payload.base.id, payload.config);
73
+ fullUrl = base ? `${base}/${payload.url}` : payload.url;
74
+ } catch (_error) {
75
+ fullUrl = `failed to get base url for ${payload.base.id}`;
76
+ }
77
+ }
78
+ let url = `${payload.url}`.toLowerCase();
79
+ if (url.includes("secret") || url.includes("password")) {
80
+ url = url.split("?")[0];
81
+ }
82
+ const data = {
83
+ base: payload.base,
84
+ method: payload.method,
85
+ url,
86
+ fullUrl,
87
+ retry: payload.retry,
88
+ body,
89
+ context: payload.metricsDetails,
90
+ ...additionalData
91
+ };
92
+ payload.config.logger[type](messageParts.join(" > "), { data });
93
+ }
94
+ }
95
+ function rateLimitWaitingTime(attempt) {
96
+ const noise = Math.random() * 100;
97
+ const waitingTime = 2 ** attempt * 1e3 + noise;
98
+ return Math.floor(waitingTime);
99
+ }
100
+ async function request(payload) {
101
+ log(payload, "debug", "starting request");
102
+ sendMetrics(payload, "request");
103
+ try {
104
+ if (payload.config.frontendCaching?.enabled) {
105
+ frontendCache.configure(payload.config.frontendCaching);
106
+ }
107
+ } catch (_cacheConfigError) {
108
+ }
109
+ let token;
110
+ if (payload.config.auth) {
111
+ token = await payload.config.auth.getToken();
112
+ }
113
+ const headers = payload.headers ?? {};
114
+ if (token) {
115
+ headers.Authorization = `Bearer ${token}`;
116
+ }
117
+ const type = payload.type ?? "json";
118
+ let body;
119
+ if (type) {
120
+ switch (type) {
121
+ case "json":
122
+ headers["Content-Type"] = "application/json";
123
+ body = payload.body ? JSON.stringify(payload.body) : void 0;
124
+ break;
125
+ case "text":
126
+ headers["Content-Type"] = "text/plain";
127
+ body = payload.body ? JSON.stringify(payload.body) : void 0;
128
+ break;
129
+ case "form":
130
+ if (payload.body) {
131
+ const formData = new URLSearchParams();
132
+ Object.keys(payload.body).forEach((key) => {
133
+ formData.append(key, payload.body[key]);
134
+ });
135
+ body = formData;
136
+ }
137
+ break;
138
+ }
139
+ }
140
+ let base;
141
+ if (payload.base) {
142
+ try {
143
+ base = getEnvParam(payload.base.id, payload.config);
144
+ } catch (error) {
145
+ log(payload, "error", `Failed to get base url for ${payload.base.id}`, {
146
+ error
147
+ });
148
+ throw error;
149
+ }
150
+ }
151
+ const url = base ? `${base}/${payload.url}` : payload.url;
152
+ let serveCachedAndReturnAfterNetwork = false;
153
+ if (payload.method === "get" && payload.config.frontendCaching?.enabled) {
154
+ try {
155
+ const cached = await frontendCache.get("get", url);
156
+ if (cached) {
157
+ const fresh = frontendCache.isFresh(cached);
158
+ if (payload.onCachedResponse) {
159
+ payload.onCachedResponse(cached.payload, { fresh, source: "cache" });
160
+ if (!fresh) {
161
+ log(payload, "debug", "cache stale, refreshing in background");
162
+ serveCachedAndReturnAfterNetwork = true;
163
+ } else {
164
+ log(payload, "debug", "cache fresh, returning early");
165
+ sendMetrics(payload, "success", { duration: 0, statusCode: "200" });
166
+ return {
167
+ // eslint-disable-next-line id-length
168
+ ok: true,
169
+ status: 200,
170
+ statusText: "cached",
171
+ body: cached.payload,
172
+ meta: { duration: 0 }
173
+ };
174
+ }
175
+ } else if (fresh) {
176
+ log(payload, "debug", "cache hit, returning cached response");
177
+ sendMetrics(payload, "success", { duration: 0, statusCode: "200" });
178
+ return {
179
+ // eslint-disable-next-line id-length
180
+ ok: true,
181
+ status: 200,
182
+ statusText: "cached",
183
+ body: cached.payload,
184
+ meta: { duration: 0 }
185
+ };
186
+ } else {
187
+ log(payload, "debug", "cache stale, proceeding with network request");
188
+ }
189
+ }
190
+ } catch (_cacheGetError) {
191
+ }
192
+ }
193
+ const start = performance.now();
194
+ const proxyAgent = payload.config.proxyAgent ?? {};
195
+ try {
196
+ const fetchResponse = await fetch(url, {
197
+ signal: payload.config.timeout ? AbortSignal.timeout(payload.config.timeout) : void 0,
198
+ method: payload.method.toUpperCase(),
199
+ headers,
200
+ body,
201
+ ...proxyAgent
202
+ });
203
+ const end = performance.now();
204
+ const duration = end - start;
205
+ if ([429].includes(fetchResponse.status)) {
206
+ log(payload, "info", "rate limited");
207
+ sendMetrics(payload, "rate-limit-retry", {
208
+ duration,
209
+ statusCode: String(fetchResponse.status)
210
+ });
211
+ const remaining = payload.retry?.remaining ?? 8;
212
+ const attempts = payload.retry?.attempts ?? 1;
213
+ if (remaining > 0) {
214
+ let waitingTime = rateLimitWaitingTime(attempts);
215
+ if (fetchResponse.headers.has("x-ratelimit-reset")) {
216
+ const rateLimitHeader = fetchResponse.headers.get("x-ratelimit-reset");
217
+ log(
218
+ payload,
219
+ "debug",
220
+ `rate limited, found x-ratelimit-reset header: ${rateLimitHeader}`
221
+ );
222
+ const rateLimitHeaderNumber = Number(rateLimitHeader);
223
+ if (Number.isNaN(rateLimitHeaderNumber)) {
224
+ waitingTime = Date.parse(rateLimitHeader ?? "0") - Date.now();
225
+ } else {
226
+ waitingTime = rateLimitHeaderNumber - Date.now();
227
+ }
228
+ }
229
+ if (waitingTime < 0 || waitingTime > 18e4) {
230
+ waitingTime = rateLimitWaitingTime(attempts);
231
+ }
232
+ log(
233
+ payload,
234
+ "debug",
235
+ `rate limited, attempt ${attempts}, remaining ${remaining}, waiting ${waitingTime}ms`
236
+ );
237
+ await new Promise((resolve) => {
238
+ setTimeout(resolve, waitingTime);
239
+ });
240
+ payload.retry = {
241
+ attempts: attempts + 1,
242
+ remaining: remaining - 1
243
+ };
244
+ return request(payload);
245
+ }
246
+ log(payload, "debug", `rate limited, no more retries`);
247
+ }
248
+ const response = {
249
+ // eslint-disable-next-line id-length
250
+ ok: fetchResponse.ok,
251
+ status: fetchResponse.status,
252
+ statusText: fetchResponse.statusText,
253
+ meta: {
254
+ duration
255
+ }
256
+ };
257
+ const responseType = payload.responseType ?? type;
258
+ if (response.ok) {
259
+ log(payload, "debug", `request successful in ${Math.floor(duration)}ms`, {
260
+ baseUrl: base
261
+ });
262
+ sendMetrics(payload, "success", {
263
+ duration,
264
+ statusCode: String(fetchResponse.status)
265
+ });
266
+ switch (responseType) {
267
+ case "json":
268
+ try {
269
+ response.body = await fetchResponse.json();
270
+ } catch (_error) {
271
+ log(
272
+ payload,
273
+ "debug",
274
+ `Failed to parse json body. Returning empty object.`,
275
+ {
276
+ baseUrl: base
277
+ }
278
+ );
279
+ response.body = {};
280
+ try {
281
+ const responseBodyText = await fetchResponse.text();
282
+ log(payload, "debug", `Response body text`, {
283
+ baseUrl: base,
284
+ responseBodyText,
285
+ status: fetchResponse.status
286
+ });
287
+ } catch (textError) {
288
+ log(payload, "debug", `Failed to parse response body text.`, {
289
+ baseUrl: base,
290
+ status: fetchResponse.status,
291
+ error: textError
292
+ });
293
+ }
294
+ }
295
+ break;
296
+ case "text":
297
+ response.body = await fetchResponse.text();
298
+ break;
299
+ default:
300
+ response.body = await fetchResponse.text();
301
+ }
302
+ if (payload.method === "get" && payload.config.frontendCaching?.enabled && response.body !== void 0) {
303
+ try {
304
+ await frontendCache.set("get", url, response.body);
305
+ log(payload, "debug", "cache store successful");
306
+ } catch (_cacheSetError) {
307
+ }
308
+ }
309
+ } else {
310
+ let statusText = fetchResponse.statusText;
311
+ try {
312
+ statusText = await fetchResponse.text();
313
+ } catch (_error) {
314
+ }
315
+ response.statusText = statusText;
316
+ log(
317
+ payload,
318
+ "debug",
319
+ `request failed with status ${response.status}: ${statusText}`,
320
+ {
321
+ baseUrl: base
322
+ }
323
+ );
324
+ let type2 = "error";
325
+ const noErrorStatusCodes = [];
326
+ switch (payload.metricsDetails.target.name) {
327
+ case "auth0":
328
+ noErrorStatusCodes.push(...[400, 404, 409]);
329
+ break;
330
+ case "accounts":
331
+ case "console":
332
+ noErrorStatusCodes.push(...[404, 409]);
333
+ if (payload.metricsDetails.method.name === "createTemporaryCluster") {
334
+ noErrorStatusCodes.push(...[400, 403, 412]);
335
+ }
336
+ if ([
337
+ "ConsoleM2MService.verifyZeebeClient",
338
+ "ConsoleM2MService.verifyApiClient"
339
+ ].includes(payload.metricsDetails.method.name)) {
340
+ noErrorStatusCodes.push(...[401]);
341
+ }
342
+ if (payload.metricsDetails.method.name === "OrgsService.createAndReturnSocialLoginUser") {
343
+ noErrorStatusCodes.push(
344
+ ...[
345
+ // onboard user, user already has an org
346
+ 400,
347
+ // existing extSSO-connection
348
+ 412
349
+ ]
350
+ );
351
+ }
352
+ break;
353
+ }
354
+ if (noErrorStatusCodes.includes(response.status)) {
355
+ type2 = "success";
356
+ }
357
+ sendMetrics(payload, type2, {
358
+ duration,
359
+ statusCode: String(fetchResponse.status),
360
+ error: statusText
361
+ });
362
+ }
363
+ if (serveCachedAndReturnAfterNetwork && response.ok) {
364
+ log(payload, "debug", "stale cache updated, returning new data");
365
+ }
366
+ return response;
367
+ } catch (error) {
368
+ log(payload, "error", `request failed with no status`, {
369
+ baseUrl: base,
370
+ error
371
+ });
372
+ const duration = performance.now() - start;
373
+ let errorMessage;
374
+ if (error?.cause?.code) {
375
+ errorMessage = error?.cause?.code;
376
+ } else if (error?.message) {
377
+ errorMessage = error?.message;
378
+ }
379
+ sendMetrics(payload, "error", {
380
+ statusCode: "fetch-error",
381
+ duration,
382
+ error: errorMessage
383
+ });
384
+ const response = {
385
+ // eslint-disable-next-line id-length
386
+ ok: false,
387
+ status: 500,
388
+ statusText: "fetch error",
389
+ meta: {
390
+ duration
391
+ }
392
+ };
393
+ return response;
394
+ }
395
+ }
396
+ export {
397
+ log,
398
+ request
399
+ };
400
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/api.ts"],
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type {\n RequestBaseCustomMetricsDetailsType,\n RequestBaseMethodType,\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../types/general.types.js'\nimport { getEnvParam, type ServiceName } from './environments.js'\nimport { frontendCache } from './frontendCache.js'\n\nexport interface RequestPayload extends RequestBaseParams {\n base?: {\n id: ServiceName\n }\n url: string\n method: RequestBaseMethodType\n headers?: { [key: string]: string }\n type?: 'json' | 'text' | 'form' | 'none'\n responseType?: 'json' | 'text' | 'none'\n retry?: {\n attempts: number\n remaining: number\n }\n body?: any\n metricsDetails: RequestBaseServiceContext\n}\n\nexport interface Response<T> {\n body?: T\n status: number\n statusText?: string\n ok: boolean\n meta: {\n duration: number\n }\n}\n\nfunction sendMetrics(\n payload: RequestPayload,\n type: RequestBaseCustomMetricsDetailsType,\n options?: {\n duration?: number\n statusCode?: string\n error?: string\n },\n) {\n if (payload.config.metrics) {\n if (payload.config.metrics.types.includes(type)) {\n let durationBucket: string | undefined\n if (options?.duration) {\n if (options.duration < 100) {\n durationBucket = '0 | <100ms'\n } else if (options.duration < 200) {\n durationBucket = '1 | <200ms'\n } else if (options.duration < 500) {\n durationBucket = '2 | <500ms'\n } else if (options.duration < 1000) {\n durationBucket = '3 | <1s'\n } else {\n durationBucket = '4 | >=1s'\n }\n }\n\n // only add normalized errors as labels\n let error = 'other'\n if (options?.error) {\n try {\n const errorMessage = options.error\n if (errorMessage.startsWith('<!DOCTYPE html>')) {\n error = 'html-response'\n } else if (errorMessage.includes('UND_ERR_CONNECT_TIMEOUT')) {\n error = 'connect-timeout'\n }\n } catch (_error) {\n // ignore it\n }\n } else {\n error = 'unset'\n }\n\n const metrics: RequestBaseServiceContext = {\n ...payload.metricsDetails,\n eventType: type,\n durationBucket,\n statusCode: options?.statusCode,\n error,\n }\n try {\n payload.config.metrics.callback(metrics)\n } catch (metricsCallbackError) {\n log(payload, 'debug', `Failed to send metrics`, {\n error: metricsCallbackError,\n metrics,\n })\n }\n }\n }\n}\n\nexport function log(\n payload: RequestPayload,\n type: 'debug' | 'info' | 'error',\n message: string,\n additionalData?: any,\n) {\n if (payload.config.logger) {\n const messageParts: string[] = []\n messageParts.push(payload.metricsDetails?.method?.name)\n messageParts.push(\n `${payload.metricsDetails?.target?.name} (${payload.metricsDetails?.target?.type})`,\n )\n messageParts.push(message)\n let body: any\n if (payload.body) {\n body = JSON.parse(JSON.stringify(payload.body))\n for (const key of Object.keys(body)) {\n if (\n key.toLowerCase().includes('password') ||\n key.toLowerCase().includes('secret') ||\n key.toLowerCase().includes('token')\n ) {\n body[key] = '********'\n }\n }\n }\n\n let fullUrl = 'unset'\n\n if (payload.base) {\n try {\n const base = getEnvParam(payload.base.id, payload.config)\n fullUrl = base ? `${base}/${payload.url}` : payload.url\n } catch (_error) {\n fullUrl = `failed to get base url for ${payload.base.id}`\n }\n }\n\n let url = `${payload.url}`.toLowerCase()\n if (url.includes('secret') || url.includes('password')) {\n url = url.split('?')[0]\n }\n\n const data = {\n base: payload.base,\n method: payload.method,\n url,\n fullUrl,\n retry: payload.retry,\n body,\n context: payload.metricsDetails,\n ...additionalData,\n }\n payload.config.logger[type](messageParts.join(' > '), { data })\n }\n}\n\nfunction rateLimitWaitingTime(attempt: number): number {\n const noise = Math.random() * 100\n const waitingTime = 2 ** attempt * 1000 + noise\n return Math.floor(waitingTime)\n}\n\nexport async function request<T>(\n payload: RequestPayload,\n): Promise<Response<T>> {\n log(payload, 'debug', 'starting request')\n sendMetrics(payload, 'request')\n // configure frontend cache if enabled (browser only)\n try {\n if (payload.config.frontendCaching?.enabled) {\n frontendCache.configure(payload.config.frontendCaching)\n }\n } catch (_cacheConfigError) {\n // ignore configuration errors silently\n }\n let token\n if (payload.config.auth) {\n token = await payload.config.auth.getToken()\n }\n const headers: { [key: string]: string } = payload.headers ?? {}\n if (token) {\n headers.Authorization = `Bearer ${token}`\n }\n const type = payload.type ?? 'json'\n let body\n if (type) {\n switch (type) {\n case 'json':\n headers['Content-Type'] = 'application/json'\n body = payload.body ? JSON.stringify(payload.body) : undefined\n break\n case 'text':\n headers['Content-Type'] = 'text/plain'\n body = payload.body ? JSON.stringify(payload.body) : undefined\n break\n case 'form':\n if (payload.body) {\n const formData = new URLSearchParams()\n Object.keys(payload.body).forEach((key) => {\n formData.append(key, payload.body[key])\n })\n body = formData\n }\n break\n }\n }\n let base\n if (payload.base) {\n try {\n base = getEnvParam(payload.base.id, payload.config)\n } catch (error) {\n log(payload, 'error', `Failed to get base url for ${payload.base.id}`, {\n error,\n })\n throw error\n }\n }\n const url = base ? `${base}/${payload.url}` : payload.url\n\n // Attempt cache read for GET requests (stale-while-revalidate when callback supplied)\n let serveCachedAndReturnAfterNetwork = false\n if (payload.method === 'get' && payload.config.frontendCaching?.enabled) {\n try {\n const cached = await frontendCache.get<T>('get', url)\n if (cached) {\n const fresh = frontendCache.isFresh(cached)\n if (payload.onCachedResponse) {\n payload.onCachedResponse(cached.payload, { fresh, source: 'cache' })\n if (!fresh) {\n log(payload, 'debug', 'cache stale, refreshing in background')\n serveCachedAndReturnAfterNetwork = true\n } else {\n log(payload, 'debug', 'cache fresh, returning early')\n sendMetrics(payload, 'success', { duration: 0, statusCode: '200' })\n return {\n // eslint-disable-next-line id-length\n ok: true,\n status: 200,\n statusText: 'cached',\n body: cached.payload,\n meta: { duration: 0 },\n }\n }\n } else if (fresh) {\n // no callback but fresh -> return directly\n log(payload, 'debug', 'cache hit, returning cached response')\n sendMetrics(payload, 'success', { duration: 0, statusCode: '200' })\n return {\n // eslint-disable-next-line id-length\n ok: true,\n status: 200,\n statusText: 'cached',\n body: cached.payload,\n meta: { duration: 0 },\n }\n } else {\n log(payload, 'debug', 'cache stale, proceeding with network request')\n }\n }\n } catch (_cacheGetError) {\n // ignore cache errors\n }\n }\n const start = performance.now()\n const proxyAgent = payload.config.proxyAgent ?? {}\n try {\n const fetchResponse = await fetch(url, {\n signal: payload.config.timeout\n ? AbortSignal.timeout(payload.config.timeout)\n : undefined,\n method: payload.method.toUpperCase(),\n headers,\n body,\n ...proxyAgent,\n })\n const end = performance.now()\n const duration = end - start\n\n if ([429].includes(fetchResponse.status)) {\n // rate limiting, retry\n log(payload, 'info', 'rate limited')\n sendMetrics(payload, 'rate-limit-retry', {\n duration,\n statusCode: String(fetchResponse.status),\n })\n const remaining = payload.retry?.remaining ?? 8\n const attempts = payload.retry?.attempts ?? 1\n if (remaining > 0) {\n let waitingTime = rateLimitWaitingTime(attempts)\n if (fetchResponse.headers.has('x-ratelimit-reset')) {\n const rateLimitHeader = fetchResponse.headers.get('x-ratelimit-reset')\n log(\n payload,\n 'debug',\n `rate limited, found x-ratelimit-reset header: ${rateLimitHeader}`,\n )\n const rateLimitHeaderNumber = Number(rateLimitHeader)\n if (Number.isNaN(rateLimitHeaderNumber)) {\n waitingTime = Date.parse(rateLimitHeader ?? '0') - Date.now()\n } else {\n waitingTime = rateLimitHeaderNumber - Date.now()\n }\n }\n if (waitingTime < 0 || waitingTime > 180000) {\n waitingTime = rateLimitWaitingTime(attempts)\n }\n log(\n payload,\n 'debug',\n `rate limited, attempt ${attempts}, remaining ${remaining}, waiting ${waitingTime}ms`,\n )\n await new Promise((resolve) => {\n setTimeout(resolve, waitingTime)\n })\n // eslint-disable-next-line require-atomic-updates\n payload.retry = {\n attempts: attempts + 1,\n remaining: remaining - 1,\n }\n return request(payload)\n }\n log(payload, 'debug', `rate limited, no more retries`)\n }\n\n const response: Response<T> = {\n // eslint-disable-next-line id-length\n ok: fetchResponse.ok,\n status: fetchResponse.status,\n statusText: fetchResponse.statusText,\n meta: {\n duration,\n },\n }\n\n const responseType = payload.responseType ?? type\n\n if (response.ok) {\n log(payload, 'debug', `request successful in ${Math.floor(duration)}ms`, {\n baseUrl: base,\n })\n sendMetrics(payload, 'success', {\n duration,\n statusCode: String(fetchResponse.status),\n })\n switch (responseType) {\n case 'json':\n try {\n response.body = await fetchResponse.json()\n } catch (_error) {\n log(\n payload,\n 'debug',\n `Failed to parse json body. Returning empty object.`,\n {\n baseUrl: base,\n },\n )\n response.body = {} as T\n try {\n const responseBodyText = await fetchResponse.text()\n log(payload, 'debug', `Response body text`, {\n baseUrl: base,\n responseBodyText,\n status: fetchResponse.status,\n })\n } catch (textError) {\n // this is fine\n log(payload, 'debug', `Failed to parse response body text.`, {\n baseUrl: base,\n status: fetchResponse.status,\n error: textError,\n })\n }\n }\n break\n case 'text':\n response.body = (await fetchResponse.text()) as T\n break\n default:\n response.body = (await fetchResponse.text()) as T\n }\n // store in cache after parsing\n if (\n payload.method === 'get' &&\n payload.config.frontendCaching?.enabled &&\n response.body !== undefined\n ) {\n try {\n await frontendCache.set('get', url, response.body as any)\n log(payload, 'debug', 'cache store successful')\n } catch (_cacheSetError) {\n // ignore cache set error\n }\n }\n } else {\n let statusText = fetchResponse.statusText\n try {\n statusText = await fetchResponse.text()\n } catch (_error) {\n // this is fine\n }\n response.statusText = statusText\n log(\n payload,\n 'debug',\n `request failed with status ${response.status}: ${statusText}`,\n {\n baseUrl: base,\n },\n )\n\n // Special Handling for dedicated target systems to not count special status codes as errors\n // eslint-disable-next-line no-shadow\n let type: RequestBaseCustomMetricsDetailsType = 'error'\n const noErrorStatusCodes: number[] = []\n switch (payload.metricsDetails.target.name) {\n case 'auth0':\n noErrorStatusCodes.push(...[400, 404, 409])\n break\n case 'accounts':\n case 'console':\n noErrorStatusCodes.push(...[404, 409])\n if (payload.metricsDetails.method.name === 'createTemporaryCluster') {\n // case: cannot create temporary cluster\n noErrorStatusCodes.push(...[400, 403, 412])\n }\n if (\n [\n 'ConsoleM2MService.verifyZeebeClient',\n 'ConsoleM2MService.verifyApiClient',\n ].includes(payload.metricsDetails.method.name)\n ) {\n // case: api/zeebe client credentials are invalid\n noErrorStatusCodes.push(...[401])\n }\n if (\n payload.metricsDetails.method.name ===\n 'OrgsService.createAndReturnSocialLoginUser'\n ) {\n noErrorStatusCodes.push(\n ...[\n // onboard user, user already has an org\n 400,\n // existing extSSO-connection\n 412,\n ],\n )\n }\n break\n }\n\n if (noErrorStatusCodes.includes(response.status)) {\n type = 'success'\n }\n\n sendMetrics(payload, type, {\n duration,\n statusCode: String(fetchResponse.status),\n error: statusText,\n })\n }\n if (serveCachedAndReturnAfterNetwork && response.ok) {\n // when we served stale via callback earlier, we now also return the fresh response\n log(payload, 'debug', 'stale cache updated, returning new data')\n }\n return response\n } catch (error: any) {\n log(payload, 'error', `request failed with no status`, {\n baseUrl: base,\n error,\n })\n const duration = performance.now() - start\n let errorMessage: string | undefined\n if (error?.cause?.code) {\n errorMessage = error?.cause?.code\n } else if (error?.message) {\n errorMessage = error?.message\n }\n sendMetrics(payload, 'error', {\n statusCode: 'fetch-error',\n duration,\n error: errorMessage,\n })\n const response: Response<T> = {\n // eslint-disable-next-line id-length\n ok: false,\n status: 500,\n statusText: 'fetch error',\n meta: {\n duration,\n },\n }\n return response\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["type"]
7
+ }
@@ -0,0 +1,7 @@
1
+ export declare class Cache<K, V> {
2
+ private expirationInMilliseconds;
3
+ private data;
4
+ constructor(expirationInMilliseconds: number);
5
+ set(key: K, value: V): void;
6
+ get(key: K): V | undefined;
7
+ }
@@ -0,0 +1,25 @@
1
+ class Cache {
2
+ constructor(expirationInMilliseconds) {
3
+ this.expirationInMilliseconds = expirationInMilliseconds;
4
+ this.data = /* @__PURE__ */ new Map();
5
+ }
6
+ set(key, value) {
7
+ this.data.set(key, {
8
+ value,
9
+ expiresAt: Date.now() + this.expirationInMilliseconds
10
+ });
11
+ }
12
+ get(key) {
13
+ const cached = this.data.get(key);
14
+ if (cached && cached.expiresAt > Date.now()) {
15
+ return cached.value;
16
+ } else if (cached) {
17
+ this.data.delete(key);
18
+ }
19
+ return void 0;
20
+ }
21
+ }
22
+ export {
23
+ Cache
24
+ };
25
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/cache.ts"],
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nexport class Cache<K, V> {\n private data: Map<K, { value: V; expiresAt: number }> = new Map()\n\n constructor(private expirationInMilliseconds: number) {}\n\n public set(key: K, value: V) {\n this.data.set(key, {\n value,\n expiresAt: Date.now() + this.expirationInMilliseconds,\n })\n }\n public get(key: K): V | undefined {\n const cached = this.data.get(key)\n if (cached && cached.expiresAt > Date.now()) {\n return cached.value\n } else if (cached) {\n this.data.delete(key)\n }\n return undefined\n }\n}\n"],
5
+ "mappings": "AAMO,MAAM,MAAY;AAAA,EAGvB,YAAoB,0BAAkC;AAAlC;AAFpB,SAAQ,OAAgD,oBAAI,IAAI;AAAA,EAET;AAAA,EAEhD,IAAI,KAAQ,OAAU;AAC3B,SAAK,KAAK,IAAI,KAAK;AAAA,MACjB;AAAA,MACA,WAAW,KAAK,IAAI,IAAI,KAAK;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EACO,IAAI,KAAuB;AAChC,UAAM,SAAS,KAAK,KAAK,IAAI,GAAG;AAChC,QAAI,UAAU,OAAO,YAAY,KAAK,IAAI,GAAG;AAC3C,aAAO,OAAO;AAAA,IAChB,WAAW,QAAQ;AACjB,WAAK,KAAK,OAAO,GAAG;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ import type { RequestBaseServiceContext } from '../types/general.types.js';
2
+ export declare namespace CustomMetricsCCMA {
3
+ const PREFIX = "ccma_";
4
+ const LABEL_NAMES: string[];
5
+ function convertServiceContextToMetrics(context: RequestBaseServiceContext): {
6
+ source: string;
7
+ targetName: string;
8
+ sourceToTarget: string;
9
+ targetType: "internal" | "external";
10
+ methodName: string;
11
+ methodUrl: string;
12
+ methodType: import("../types/general.types.js").RequestBaseMethodType;
13
+ eventType: import("../types/general.types.js").RequestBaseCustomMetricsDetailsType | undefined;
14
+ durationBucket: string | undefined;
15
+ statusCode: string | undefined;
16
+ error: string | undefined;
17
+ };
18
+ }
@@ -0,0 +1,37 @@
1
+ var CustomMetricsCCMA;
2
+ ((CustomMetricsCCMA2) => {
3
+ CustomMetricsCCMA2.PREFIX = "ccma_";
4
+ CustomMetricsCCMA2.LABEL_NAMES = [
5
+ "source",
6
+ "targetName",
7
+ "sourceToTarget",
8
+ "targetType",
9
+ "methodName",
10
+ "methodUrl",
11
+ "methodType",
12
+ "eventType",
13
+ "durationBucket",
14
+ "statusCode",
15
+ "error"
16
+ ];
17
+ function convertServiceContextToMetrics(context) {
18
+ return {
19
+ source: context.source,
20
+ targetName: context.target.name,
21
+ sourceToTarget: `${context.source}-->${context.target.name}`,
22
+ targetType: context.target.type,
23
+ methodName: context.method.name,
24
+ methodUrl: context.method.normalizedUrl,
25
+ methodType: context.method.type,
26
+ eventType: context.eventType,
27
+ durationBucket: context.durationBucket,
28
+ statusCode: context.statusCode,
29
+ error: context.error
30
+ };
31
+ }
32
+ CustomMetricsCCMA2.convertServiceContextToMetrics = convertServiceContextToMetrics;
33
+ })(CustomMetricsCCMA || (CustomMetricsCCMA = {}));
34
+ export {
35
+ CustomMetricsCCMA
36
+ };
37
+ //# sourceMappingURL=ccma-metrics.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/ccma-metrics.ts"],
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { RequestBaseServiceContext } from '../types/general.types.js'\n\nexport namespace CustomMetricsCCMA {\n export const PREFIX = 'ccma_'\n\n export const LABEL_NAMES: string[] = [\n 'source',\n 'targetName',\n 'sourceToTarget',\n 'targetType',\n 'methodName',\n 'methodUrl',\n 'methodType',\n 'eventType',\n 'durationBucket',\n 'statusCode',\n 'error',\n ]\n\n export function convertServiceContextToMetrics(\n context: RequestBaseServiceContext,\n ) {\n return {\n source: context.source,\n targetName: context.target.name,\n sourceToTarget: `${context.source}-->${context.target.name}`,\n targetType: context.target.type,\n methodName: context.method.name,\n methodUrl: context.method.normalizedUrl,\n methodType: context.method.type,\n eventType: context.eventType,\n durationBucket: context.durationBucket,\n statusCode: context.statusCode,\n error: context.error,\n }\n }\n}\n"],
5
+ "mappings": "AAQO,IAAU;AAAA,CAAV,CAAUA,uBAAV;AACE,EAAMA,mBAAA,SAAS;AAEf,EAAMA,mBAAA,cAAwB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEO,WAAS,+BACd,SACA;AACA,WAAO;AAAA,MACL,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ,OAAO;AAAA,MAC3B,gBAAgB,GAAG,QAAQ,MAAM,MAAM,QAAQ,OAAO,IAAI;AAAA,MAC1D,YAAY,QAAQ,OAAO;AAAA,MAC3B,YAAY,QAAQ,OAAO;AAAA,MAC3B,WAAW,QAAQ,OAAO;AAAA,MAC1B,YAAY,QAAQ,OAAO;AAAA,MAC3B,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ;AAAA,MACxB,YAAY,QAAQ;AAAA,MACpB,OAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAhBO,EAAAA,mBAAS;AAAA,GAjBD;",
6
+ "names": ["CustomMetricsCCMA"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { RequestBaseParamsConfig } from '../types/general.types.js';
2
+ export type ServiceName = 'accounts' | 'console' | 'audit-logger' | 'notifications' | 'login' | 'login-internal' | 'comm-bridge' | 'telemetry' | 'mixpanel' | 'alert-distributor' | 'analytic-bridge' | 'wordpress-helpcenter';
3
+ export type ServiceAudience = 'camunda-cloud-audience' | 'comm-bridge-audience' | 'notification-audience' | 'analytics-audience';
4
+ export interface EnvironmentParam {
5
+ id: ServiceName | ServiceAudience;
6
+ dev: string;
7
+ devAws: string;
8
+ int: string;
9
+ prod: string;
10
+ }
11
+ export declare function getEnvParam(id: ServiceName | ServiceAudience, config: RequestBaseParamsConfig): string;