mcp-creatio 0.3.6

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 (370) hide show
  1. package/.dockerignore +12 -0
  2. package/.editorconfig +14 -0
  3. package/.eslintrc.cjs +18 -0
  4. package/.gitattributes +8 -0
  5. package/.github/workflows/docker-publish.yml +50 -0
  6. package/.prettierignore +3 -0
  7. package/.prettierrc +9 -0
  8. package/.vscode/launch.json +23 -0
  9. package/.vscode/mcp.json +13 -0
  10. package/.vscode/settings.json +16 -0
  11. package/Agent.md +187 -0
  12. package/Debug.md +32 -0
  13. package/Dockerfile +23 -0
  14. package/LICENSE +21 -0
  15. package/README.md +162 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +135 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config-builder.d.ts +3 -0
  21. package/dist/config-builder.d.ts.map +1 -0
  22. package/dist/config-builder.js +66 -0
  23. package/dist/config-builder.js.map +1 -0
  24. package/dist/consts.d.ts +2 -0
  25. package/dist/consts.d.ts.map +1 -0
  26. package/dist/consts.js +6 -0
  27. package/dist/consts.js.map +1 -0
  28. package/dist/creatio/auth/auth-manager.d.ts +9 -0
  29. package/dist/creatio/auth/auth-manager.d.ts.map +1 -0
  30. package/dist/creatio/auth/auth-manager.js +29 -0
  31. package/dist/creatio/auth/auth-manager.js.map +1 -0
  32. package/dist/creatio/auth/auth.d.ts +16 -0
  33. package/dist/creatio/auth/auth.d.ts.map +1 -0
  34. package/dist/creatio/auth/auth.js +20 -0
  35. package/dist/creatio/auth/auth.js.map +1 -0
  36. package/dist/creatio/auth/index.d.ts +4 -0
  37. package/dist/creatio/auth/index.d.ts.map +1 -0
  38. package/dist/creatio/auth/index.js +21 -0
  39. package/dist/creatio/auth/index.js.map +1 -0
  40. package/dist/creatio/auth/providers/base-oauth2-provider.d.ts +17 -0
  41. package/dist/creatio/auth/providers/base-oauth2-provider.d.ts.map +1 -0
  42. package/dist/creatio/auth/providers/base-oauth2-provider.js +49 -0
  43. package/dist/creatio/auth/providers/base-oauth2-provider.js.map +1 -0
  44. package/dist/creatio/auth/providers/base-provider.d.ts +15 -0
  45. package/dist/creatio/auth/providers/base-provider.d.ts.map +1 -0
  46. package/dist/creatio/auth/providers/base-provider.js +32 -0
  47. package/dist/creatio/auth/providers/base-provider.js.map +1 -0
  48. package/dist/creatio/auth/providers/index.d.ts +5 -0
  49. package/dist/creatio/auth/providers/index.d.ts.map +1 -0
  50. package/dist/creatio/auth/providers/index.js +21 -0
  51. package/dist/creatio/auth/providers/index.js.map +1 -0
  52. package/dist/creatio/auth/providers/legacy-provider.d.ts +10 -0
  53. package/dist/creatio/auth/providers/legacy-provider.d.ts.map +1 -0
  54. package/dist/creatio/auth/providers/legacy-provider.js +73 -0
  55. package/dist/creatio/auth/providers/legacy-provider.js.map +1 -0
  56. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts +18 -0
  57. package/dist/creatio/auth/providers/oauth2-code-provider.d.ts.map +1 -0
  58. package/dist/creatio/auth/providers/oauth2-code-provider.js +245 -0
  59. package/dist/creatio/auth/providers/oauth2-code-provider.js.map +1 -0
  60. package/dist/creatio/auth/providers/oauth2-provider.d.ts +9 -0
  61. package/dist/creatio/auth/providers/oauth2-provider.d.ts.map +1 -0
  62. package/dist/creatio/auth/providers/oauth2-provider.js +86 -0
  63. package/dist/creatio/auth/providers/oauth2-provider.js.map +1 -0
  64. package/dist/creatio/auth/providers/type.d.ts +6 -0
  65. package/dist/creatio/auth/providers/type.d.ts.map +1 -0
  66. package/dist/creatio/auth/providers/type.js +10 -0
  67. package/dist/creatio/auth/providers/type.js.map +1 -0
  68. package/dist/creatio/client-config.d.ts +29 -0
  69. package/dist/creatio/client-config.d.ts.map +1 -0
  70. package/dist/creatio/client-config.js +3 -0
  71. package/dist/creatio/client-config.js.map +1 -0
  72. package/dist/creatio/engines/crud/crud-engine.d.ts +15 -0
  73. package/dist/creatio/engines/crud/crud-engine.d.ts.map +1 -0
  74. package/dist/creatio/engines/crud/crud-engine.js +33 -0
  75. package/dist/creatio/engines/crud/crud-engine.js.map +1 -0
  76. package/dist/creatio/engines/engine-manager.d.ts +33 -0
  77. package/dist/creatio/engines/engine-manager.d.ts.map +1 -0
  78. package/dist/creatio/engines/engine-manager.js +54 -0
  79. package/dist/creatio/engines/engine-manager.js.map +1 -0
  80. package/dist/creatio/engines/engine-registry.d.ts +15 -0
  81. package/dist/creatio/engines/engine-registry.d.ts.map +1 -0
  82. package/dist/creatio/engines/engine-registry.js +35 -0
  83. package/dist/creatio/engines/engine-registry.js.map +1 -0
  84. package/dist/creatio/engines/engine.d.ts +4 -0
  85. package/dist/creatio/engines/engine.d.ts.map +1 -0
  86. package/dist/creatio/engines/engine.js +3 -0
  87. package/dist/creatio/engines/engine.js.map +1 -0
  88. package/dist/creatio/engines/index.d.ts +8 -0
  89. package/dist/creatio/engines/index.d.ts.map +1 -0
  90. package/dist/creatio/engines/index.js +24 -0
  91. package/dist/creatio/engines/index.js.map +1 -0
  92. package/dist/creatio/engines/process/process-engine.d.ts +10 -0
  93. package/dist/creatio/engines/process/process-engine.d.ts.map +1 -0
  94. package/dist/creatio/engines/process/process-engine.js +18 -0
  95. package/dist/creatio/engines/process/process-engine.js.map +1 -0
  96. package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts +13 -0
  97. package/dist/creatio/engines/sys-settings/sys-settings-engine.d.ts.map +1 -0
  98. package/dist/creatio/engines/sys-settings/sys-settings-engine.js +27 -0
  99. package/dist/creatio/engines/sys-settings/sys-settings-engine.js.map +1 -0
  100. package/dist/creatio/engines/user/user-engine.d.ts +10 -0
  101. package/dist/creatio/engines/user/user-engine.d.ts.map +1 -0
  102. package/dist/creatio/engines/user/user-engine.js +18 -0
  103. package/dist/creatio/engines/user/user-engine.js.map +1 -0
  104. package/dist/creatio/index.d.ts +7 -0
  105. package/dist/creatio/index.d.ts.map +1 -0
  106. package/dist/creatio/index.js +23 -0
  107. package/dist/creatio/index.js.map +1 -0
  108. package/dist/creatio/provider-context.d.ts +10 -0
  109. package/dist/creatio/provider-context.d.ts.map +1 -0
  110. package/dist/creatio/provider-context.js +3 -0
  111. package/dist/creatio/provider-context.js.map +1 -0
  112. package/dist/creatio/providers/crud-provider.d.ts +40 -0
  113. package/dist/creatio/providers/crud-provider.d.ts.map +1 -0
  114. package/dist/creatio/providers/crud-provider.js +3 -0
  115. package/dist/creatio/providers/crud-provider.js.map +1 -0
  116. package/dist/creatio/providers/index.d.ts +5 -0
  117. package/dist/creatio/providers/index.d.ts.map +1 -0
  118. package/dist/creatio/providers/index.js +21 -0
  119. package/dist/creatio/providers/index.js.map +1 -0
  120. package/dist/creatio/providers/process-provider.d.ts +14 -0
  121. package/dist/creatio/providers/process-provider.d.ts.map +1 -0
  122. package/dist/creatio/providers/process-provider.js +3 -0
  123. package/dist/creatio/providers/process-provider.js.map +1 -0
  124. package/dist/creatio/providers/sys-settings-provider.d.ts +58 -0
  125. package/dist/creatio/providers/sys-settings-provider.d.ts.map +1 -0
  126. package/dist/creatio/providers/sys-settings-provider.js +3 -0
  127. package/dist/creatio/providers/sys-settings-provider.js.map +1 -0
  128. package/dist/creatio/providers/user-provider.d.ts +12 -0
  129. package/dist/creatio/providers/user-provider.d.ts.map +1 -0
  130. package/dist/creatio/providers/user-provider.js +3 -0
  131. package/dist/creatio/providers/user-provider.js.map +1 -0
  132. package/dist/creatio/services/creatio-service-context.d.ts +17 -0
  133. package/dist/creatio/services/creatio-service-context.d.ts.map +1 -0
  134. package/dist/creatio/services/creatio-service-context.js +35 -0
  135. package/dist/creatio/services/creatio-service-context.js.map +1 -0
  136. package/dist/creatio/services/http-client.d.ts +29 -0
  137. package/dist/creatio/services/http-client.d.ts.map +1 -0
  138. package/dist/creatio/services/http-client.js +136 -0
  139. package/dist/creatio/services/http-client.js.map +1 -0
  140. package/dist/creatio/services/index.d.ts +8 -0
  141. package/dist/creatio/services/index.d.ts.map +1 -0
  142. package/dist/creatio/services/index.js +24 -0
  143. package/dist/creatio/services/index.js.map +1 -0
  144. package/dist/creatio/services/metadata-store.d.ts +20 -0
  145. package/dist/creatio/services/metadata-store.d.ts.map +1 -0
  146. package/dist/creatio/services/metadata-store.js +162 -0
  147. package/dist/creatio/services/metadata-store.js.map +1 -0
  148. package/dist/creatio/services/odata-crud-provider.d.ts +21 -0
  149. package/dist/creatio/services/odata-crud-provider.d.ts.map +1 -0
  150. package/dist/creatio/services/odata-crud-provider.js +145 -0
  151. package/dist/creatio/services/odata-crud-provider.js.map +1 -0
  152. package/dist/creatio/services/process-service-provider.d.ts +11 -0
  153. package/dist/creatio/services/process-service-provider.d.ts.map +1 -0
  154. package/dist/creatio/services/process-service-provider.js +52 -0
  155. package/dist/creatio/services/process-service-provider.js.map +1 -0
  156. package/dist/creatio/services/sys-settings-service-provider.d.ts +19 -0
  157. package/dist/creatio/services/sys-settings-service-provider.d.ts.map +1 -0
  158. package/dist/creatio/services/sys-settings-service-provider.js +107 -0
  159. package/dist/creatio/services/sys-settings-service-provider.js.map +1 -0
  160. package/dist/creatio/services/user-info-provider.d.ts +10 -0
  161. package/dist/creatio/services/user-info-provider.d.ts.map +1 -0
  162. package/dist/creatio/services/user-info-provider.js +26 -0
  163. package/dist/creatio/services/user-info-provider.js.map +1 -0
  164. package/dist/index.d.ts +2 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +46 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/log.d.ts +51 -0
  169. package/dist/log.d.ts.map +1 -0
  170. package/dist/log.js +137 -0
  171. package/dist/log.js.map +1 -0
  172. package/dist/server/http/creatio-oauth-handlers.d.ts +14 -0
  173. package/dist/server/http/creatio-oauth-handlers.d.ts.map +1 -0
  174. package/dist/server/http/creatio-oauth-handlers.js +137 -0
  175. package/dist/server/http/creatio-oauth-handlers.js.map +1 -0
  176. package/dist/server/http/httpServer.d.ts +23 -0
  177. package/dist/server/http/httpServer.d.ts.map +1 -0
  178. package/dist/server/http/httpServer.js +131 -0
  179. package/dist/server/http/httpServer.js.map +1 -0
  180. package/dist/server/http/index.d.ts +6 -0
  181. package/dist/server/http/index.d.ts.map +1 -0
  182. package/dist/server/http/index.js +22 -0
  183. package/dist/server/http/index.js.map +1 -0
  184. package/dist/server/http/mcp-handlers.d.ts +10 -0
  185. package/dist/server/http/mcp-handlers.d.ts.map +1 -0
  186. package/dist/server/http/mcp-handlers.js +82 -0
  187. package/dist/server/http/mcp-handlers.js.map +1 -0
  188. package/dist/server/http/mcp-oauth-handlers.d.ts +11 -0
  189. package/dist/server/http/mcp-oauth-handlers.d.ts.map +1 -0
  190. package/dist/server/http/mcp-oauth-handlers.js +106 -0
  191. package/dist/server/http/mcp-oauth-handlers.js.map +1 -0
  192. package/dist/server/http/middleware.d.ts +11 -0
  193. package/dist/server/http/middleware.d.ts.map +1 -0
  194. package/dist/server/http/middleware.js +88 -0
  195. package/dist/server/http/middleware.js.map +1 -0
  196. package/dist/server/index.d.ts +3 -0
  197. package/dist/server/index.d.ts.map +1 -0
  198. package/dist/server/index.js +19 -0
  199. package/dist/server/index.js.map +1 -0
  200. package/dist/server/mcp/filters.d.ts +2 -0
  201. package/dist/server/mcp/filters.d.ts.map +1 -0
  202. package/dist/server/mcp/filters.js +94 -0
  203. package/dist/server/mcp/filters.js.map +1 -0
  204. package/dist/server/mcp/index.d.ts +2 -0
  205. package/dist/server/mcp/index.d.ts.map +1 -0
  206. package/dist/server/mcp/index.js +18 -0
  207. package/dist/server/mcp/index.js.map +1 -0
  208. package/dist/server/mcp/prompts-data.d.ts +147 -0
  209. package/dist/server/mcp/prompts-data.d.ts.map +1 -0
  210. package/dist/server/mcp/prompts-data.js +884 -0
  211. package/dist/server/mcp/prompts-data.js.map +1 -0
  212. package/dist/server/mcp/server.d.ts +25 -0
  213. package/dist/server/mcp/server.d.ts.map +1 -0
  214. package/dist/server/mcp/server.js +233 -0
  215. package/dist/server/mcp/server.js.map +1 -0
  216. package/dist/server/mcp/tools-data.d.ts +165 -0
  217. package/dist/server/mcp/tools-data.d.ts.map +1 -0
  218. package/dist/server/mcp/tools-data.js +466 -0
  219. package/dist/server/mcp/tools-data.js.map +1 -0
  220. package/dist/server/oauth/client-manager.d.ts +6 -0
  221. package/dist/server/oauth/client-manager.d.ts.map +1 -0
  222. package/dist/server/oauth/client-manager.js +52 -0
  223. package/dist/server/oauth/client-manager.js.map +1 -0
  224. package/dist/server/oauth/index.d.ts +7 -0
  225. package/dist/server/oauth/index.d.ts.map +1 -0
  226. package/dist/server/oauth/index.js +23 -0
  227. package/dist/server/oauth/index.js.map +1 -0
  228. package/dist/server/oauth/oauth-server.d.ts +21 -0
  229. package/dist/server/oauth/oauth-server.d.ts.map +1 -0
  230. package/dist/server/oauth/oauth-server.js +146 -0
  231. package/dist/server/oauth/oauth-server.js.map +1 -0
  232. package/dist/server/oauth/storage.d.ts +31 -0
  233. package/dist/server/oauth/storage.d.ts.map +1 -0
  234. package/dist/server/oauth/storage.js +73 -0
  235. package/dist/server/oauth/storage.js.map +1 -0
  236. package/dist/server/oauth/token-manager.d.ts +13 -0
  237. package/dist/server/oauth/token-manager.d.ts.map +1 -0
  238. package/dist/server/oauth/token-manager.js +69 -0
  239. package/dist/server/oauth/token-manager.js.map +1 -0
  240. package/dist/server/oauth/types.d.ts +51 -0
  241. package/dist/server/oauth/types.d.ts.map +1 -0
  242. package/dist/server/oauth/types.js +3 -0
  243. package/dist/server/oauth/types.js.map +1 -0
  244. package/dist/server/oauth/validators.d.ts +7 -0
  245. package/dist/server/oauth/validators.d.ts.map +1 -0
  246. package/dist/server/oauth/validators.js +51 -0
  247. package/dist/server/oauth/validators.js.map +1 -0
  248. package/dist/services/index.d.ts +3 -0
  249. package/dist/services/index.d.ts.map +1 -0
  250. package/dist/services/index.js +19 -0
  251. package/dist/services/index.js.map +1 -0
  252. package/dist/services/session-context.d.ts +57 -0
  253. package/dist/services/session-context.d.ts.map +1 -0
  254. package/dist/services/session-context.js +182 -0
  255. package/dist/services/session-context.js.map +1 -0
  256. package/dist/services/token-refresh-scheduler.d.ts +16 -0
  257. package/dist/services/token-refresh-scheduler.d.ts.map +1 -0
  258. package/dist/services/token-refresh-scheduler.js +66 -0
  259. package/dist/services/token-refresh-scheduler.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.d.ts.map +1 -0
  262. package/dist/types/index.js +18 -0
  263. package/dist/types/index.js.map +1 -0
  264. package/dist/types/network.d.ts +7 -0
  265. package/dist/types/network.d.ts.map +1 -0
  266. package/dist/types/network.js +6 -0
  267. package/dist/types/network.js.map +1 -0
  268. package/dist/utils/context.d.ts +10 -0
  269. package/dist/utils/context.d.ts.map +1 -0
  270. package/dist/utils/context.js +44 -0
  271. package/dist/utils/context.js.map +1 -0
  272. package/dist/utils/env.d.ts +3 -0
  273. package/dist/utils/env.d.ts.map +1 -0
  274. package/dist/utils/env.js +16 -0
  275. package/dist/utils/env.js.map +1 -0
  276. package/dist/utils/index.d.ts +6 -0
  277. package/dist/utils/index.d.ts.map +1 -0
  278. package/dist/utils/index.js +22 -0
  279. package/dist/utils/index.js.map +1 -0
  280. package/dist/utils/mcp.d.ts +3 -0
  281. package/dist/utils/mcp.d.ts.map +1 -0
  282. package/dist/utils/mcp.js +7 -0
  283. package/dist/utils/mcp.js.map +1 -0
  284. package/dist/utils/network.d.ts +7 -0
  285. package/dist/utils/network.d.ts.map +1 -0
  286. package/dist/utils/network.js +63 -0
  287. package/dist/utils/network.js.map +1 -0
  288. package/dist/utils/pkce.d.ts +7 -0
  289. package/dist/utils/pkce.d.ts.map +1 -0
  290. package/dist/utils/pkce.js +43 -0
  291. package/dist/utils/pkce.js.map +1 -0
  292. package/dist/version.d.ts +3 -0
  293. package/dist/version.d.ts.map +1 -0
  294. package/dist/version.js +10 -0
  295. package/dist/version.js.map +1 -0
  296. package/docs/coding-style.md +30 -0
  297. package/ecosystem.config.json +17 -0
  298. package/eslint.config.cjs +95 -0
  299. package/package.json +54 -0
  300. package/src/cli.ts +158 -0
  301. package/src/config-builder.ts +76 -0
  302. package/src/consts.ts +3 -0
  303. package/src/creatio/auth/auth-manager.ts +27 -0
  304. package/src/creatio/auth/auth.ts +31 -0
  305. package/src/creatio/auth/index.ts +3 -0
  306. package/src/creatio/auth/providers/base-oauth2-provider.ts +62 -0
  307. package/src/creatio/auth/providers/base-provider.ts +42 -0
  308. package/src/creatio/auth/providers/index.ts +4 -0
  309. package/src/creatio/auth/providers/legacy-provider.ts +70 -0
  310. package/src/creatio/auth/providers/oauth2-code-provider.ts +252 -0
  311. package/src/creatio/auth/providers/oauth2-provider.ts +91 -0
  312. package/src/creatio/auth/providers/type.ts +5 -0
  313. package/src/creatio/client-config.ts +34 -0
  314. package/src/creatio/engines/crud/crud-engine.ts +47 -0
  315. package/src/creatio/engines/engine-manager.ts +102 -0
  316. package/src/creatio/engines/engine-registry.ts +36 -0
  317. package/src/creatio/engines/engine.ts +3 -0
  318. package/src/creatio/engines/index.ts +7 -0
  319. package/src/creatio/engines/process/process-engine.ts +20 -0
  320. package/src/creatio/engines/sys-settings/sys-settings-engine.ts +41 -0
  321. package/src/creatio/engines/user/user-engine.ts +20 -0
  322. package/src/creatio/index.ts +6 -0
  323. package/src/creatio/provider-context.ts +10 -0
  324. package/src/creatio/providers/crud-provider.ts +45 -0
  325. package/src/creatio/providers/index.ts +4 -0
  326. package/src/creatio/providers/process-provider.ts +15 -0
  327. package/src/creatio/providers/sys-settings-provider.ts +63 -0
  328. package/src/creatio/providers/user-provider.ts +12 -0
  329. package/src/creatio/services/creatio-service-context.ts +38 -0
  330. package/src/creatio/services/http-client.ts +174 -0
  331. package/src/creatio/services/index.ts +7 -0
  332. package/src/creatio/services/metadata-store.ts +181 -0
  333. package/src/creatio/services/odata-crud-provider.ts +210 -0
  334. package/src/creatio/services/process-service-provider.ts +76 -0
  335. package/src/creatio/services/sys-settings-service-provider.ts +192 -0
  336. package/src/creatio/services/user-info-provider.ts +41 -0
  337. package/src/index.ts +44 -0
  338. package/src/log.ts +141 -0
  339. package/src/server/http/creatio-oauth-handlers.ts +146 -0
  340. package/src/server/http/httpServer.ts +150 -0
  341. package/src/server/http/index.ts +5 -0
  342. package/src/server/http/mcp-handlers.ts +92 -0
  343. package/src/server/http/mcp-oauth-handlers.ts +108 -0
  344. package/src/server/http/middleware.ts +91 -0
  345. package/src/server/index.ts +2 -0
  346. package/src/server/mcp/filters.ts +97 -0
  347. package/src/server/mcp/index.ts +1 -0
  348. package/src/server/mcp/prompts-data.ts +896 -0
  349. package/src/server/mcp/server.ts +331 -0
  350. package/src/server/mcp/tools-data.ts +592 -0
  351. package/src/server/oauth/client-manager.ts +47 -0
  352. package/src/server/oauth/index.ts +6 -0
  353. package/src/server/oauth/oauth-server.ts +185 -0
  354. package/src/server/oauth/storage.ts +106 -0
  355. package/src/server/oauth/token-manager.ts +80 -0
  356. package/src/server/oauth/types.ts +55 -0
  357. package/src/server/oauth/validators.ts +56 -0
  358. package/src/services/index.ts +2 -0
  359. package/src/services/session-context.ts +232 -0
  360. package/src/services/token-refresh-scheduler.ts +68 -0
  361. package/src/types/index.ts +1 -0
  362. package/src/types/network.ts +7 -0
  363. package/src/utils/context.ts +49 -0
  364. package/src/utils/env.ts +12 -0
  365. package/src/utils/index.ts +5 -0
  366. package/src/utils/mcp.ts +8 -0
  367. package/src/utils/network.ts +65 -0
  368. package/src/utils/pkce.ts +39 -0
  369. package/src/version.ts +15 -0
  370. package/tsconfig.json +28 -0
@@ -0,0 +1,70 @@
1
+ import log from '../../../log';
2
+ import { JSON_ACCEPT } from '../../../types';
3
+ import { parseSetCookie } from '../../../utils';
4
+ import { LegacyAuthConfig } from '../../client-config';
5
+ import { buildHeaders } from '../auth';
6
+
7
+ import { BaseProvider } from './base-provider';
8
+
9
+ export class LegacyProvider extends BaseProvider<LegacyAuthConfig> {
10
+ private _bpmCsrf: string | undefined;
11
+
12
+ private _cookieHeader: string | undefined;
13
+
14
+ private async _ensureSession() {
15
+ if (this._cookieHeader) {
16
+ return;
17
+ }
18
+ const url = `${this.config.baseUrl.replace(/\/$/, '')}/ServiceModel/AuthService.svc/Login`;
19
+ const body = JSON.stringify({
20
+ UserName: this.authConfig.login,
21
+ UserPassword: this.authConfig.password,
22
+ });
23
+ log.creatioAuthStart(this.config.baseUrl, 'legacy');
24
+ const res = await fetch(url, {
25
+ method: 'POST',
26
+ headers: buildHeaders(JSON_ACCEPT, true),
27
+ body,
28
+ redirect: 'manual',
29
+ });
30
+ if (!res.ok) {
31
+ const responseText = await res.text().catch(() => '');
32
+ log.creatioAuthFailed(this.config.baseUrl, `${res.status} ${responseText}`, 'legacy');
33
+ throw new Error(`auth_failed:${res.status} ${responseText}`);
34
+ }
35
+ log.creatioAuthOk(this.config.baseUrl, 'legacy');
36
+ let setCookie: string[] = [];
37
+ if (typeof (res.headers as any).getSetCookie === 'function') {
38
+ setCookie = (res.headers as any).getSetCookie();
39
+ } else if ((res.headers as any).raw && (res.headers as any).raw()['set-cookie']) {
40
+ setCookie = (res.headers as any).raw()['set-cookie'];
41
+ } else {
42
+ setCookie = [];
43
+ }
44
+ const pairs = parseSetCookie(setCookie);
45
+ if (!pairs.length) {
46
+ throw new Error('auth_failed:no_set_cookie');
47
+ }
48
+ this._cookieHeader = pairs.map((c) => `${c.name}=${c.value}`).join('; ');
49
+ const csrf = pairs.find((c) => c.name.toUpperCase() === 'BPMCSRF')?.value;
50
+ if (csrf) {
51
+ this._bpmCsrf = csrf;
52
+ }
53
+ }
54
+
55
+ public async getHeaders(accept: string, isJson?: boolean): Promise<Record<string, string>> {
56
+ await this._ensureSession();
57
+ const h = buildHeaders(accept, Boolean(isJson));
58
+ h['ForceUseSession'] = 'true';
59
+ h['Cookie'] = this._cookieHeader!;
60
+ if (this._bpmCsrf) {
61
+ h['BPMCSRF'] = this._bpmCsrf;
62
+ }
63
+ return h;
64
+ }
65
+
66
+ public async refresh(): Promise<void> {
67
+ this._cookieHeader = undefined;
68
+ await this._ensureSession();
69
+ }
70
+ }
@@ -0,0 +1,252 @@
1
+ import { HTTP_MCP_PORT } from '../../../consts';
2
+ import log from '../../../log';
3
+ import { SessionContext, TokenRefreshScheduler, type UserTokens } from '../../../services';
4
+ import { getEffectiveUserKey, getUserKey } from '../../../utils';
5
+ import { CreatioClientConfig, OAuth2CodeAuthConfig } from '../../client-config';
6
+ import { AUTHORIZE_ENDPOINT, REVOCATION_ENDPOINT, TOKEN_ENDPOINT } from '../auth';
7
+
8
+ import { BaseOAuth2Provider } from './base-oauth2-provider';
9
+
10
+ export class OAuth2CodeProvider extends BaseOAuth2Provider<OAuth2CodeAuthConfig> {
11
+ private readonly _sessionContext = SessionContext.instance;
12
+ private readonly _tokenRefreshScheduler = new TokenRefreshScheduler();
13
+
14
+ protected readonly authErrorCode = 'oauth2_code_need_consent';
15
+
16
+ private get _scope() {
17
+ return this.authConfig.scope || 'offline_access';
18
+ }
19
+
20
+ constructor(config: CreatioClientConfig) {
21
+ super(config);
22
+ this._tokenRefreshScheduler.setRefreshCallback(this.refreshUserTokens.bind(this));
23
+ }
24
+
25
+ private async _exchangeCodeForTokens(code: string): Promise<UserTokens> {
26
+ const idBase = this.getIdentityBase();
27
+ const url = idBase + TOKEN_ENDPOINT;
28
+ const body = new URLSearchParams();
29
+ body.set('grant_type', 'authorization_code');
30
+ body.set('client_id', this.authConfig.clientId);
31
+ if (this.authConfig.clientSecret) {
32
+ body.set('client_secret', this.authConfig.clientSecret);
33
+ }
34
+ body.set('code', code);
35
+ body.set('redirect_uri', this.authConfig.redirectUri);
36
+ body.set('scope', this._scope);
37
+ log.creatioAuthStart(this.config.baseUrl, 'oauth2_code');
38
+ const res = await fetch(url, {
39
+ method: 'POST',
40
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
41
+ body: body.toString(),
42
+ });
43
+ const txt = await res.text().catch(() => '');
44
+ if (!res.ok || !txt) {
45
+ log.creatioAuthFailed(this.config.baseUrl, `token:${res.status} ${txt}`, 'oauth2_code');
46
+ throw new Error(`oauth2_code_token_error:${res.status}`);
47
+ }
48
+ let j: any;
49
+ try {
50
+ j = JSON.parse(txt);
51
+ } catch {
52
+ log.creatioAuthFailed(this.config.baseUrl, 'token_parse_failed', 'oauth2_code');
53
+ throw new Error('oauth2_code_token_parse_failed');
54
+ }
55
+ if (!j.access_token) {
56
+ throw new Error('oauth2_code_no_access_token');
57
+ }
58
+ const expiresIn = Number(j.expires_in) || 180;
59
+ const accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
60
+ log.creatioAuthOk(this.config.baseUrl, 'oauth2_code');
61
+ return {
62
+ accessToken: String(j.access_token),
63
+ accessTokenExpiryMs,
64
+ refreshToken: j.refresh_token ? String(j.refresh_token) : undefined,
65
+ };
66
+ }
67
+
68
+ private async _refreshTokens(refreshToken: string): Promise<UserTokens> {
69
+ const idBase = this.getIdentityBase();
70
+ const url = idBase + TOKEN_ENDPOINT;
71
+ log.info('oauth2_code.refresh_attempt', { url, refreshTokenLength: refreshToken.length });
72
+ const body = new URLSearchParams();
73
+ body.set('grant_type', 'refresh_token');
74
+ body.set('client_id', this.authConfig.clientId);
75
+ if (this.authConfig.clientSecret) {
76
+ body.set('client_secret', this.authConfig.clientSecret);
77
+ }
78
+ body.set('refresh_token', refreshToken);
79
+ body.set('redirect_uri', this.authConfig.redirectUri);
80
+ body.set('scope', this._scope);
81
+ const res = await fetch(url, {
82
+ method: 'POST',
83
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
84
+ body: body.toString(),
85
+ });
86
+ const txt = await res.text().catch(() => '');
87
+ log.info('oauth2_code.refresh_response', {
88
+ status: res.status,
89
+ hasBody: !!txt,
90
+ bodyLength: txt.length,
91
+ });
92
+ if (!res.ok || !txt) {
93
+ log.error('oauth2_code.refresh_failed', {
94
+ status: res.status,
95
+ body: txt.substring(0, 200),
96
+ });
97
+ throw new Error(`oauth2_code_refresh_error:${res.status}`);
98
+ }
99
+ let j: any;
100
+ try {
101
+ j = JSON.parse(txt);
102
+ } catch {
103
+ throw new Error('oauth2_code_refresh_parse_failed');
104
+ }
105
+ if (!j.access_token) {
106
+ throw new Error('oauth2_code_refresh_no_access_token');
107
+ }
108
+ const expiresIn = Number(j.expires_in) || 180;
109
+ const accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
110
+ const newTokens = {
111
+ accessToken: String(j.access_token),
112
+ accessTokenExpiryMs,
113
+ refreshToken: j.refresh_token ? String(j.refresh_token) : refreshToken,
114
+ };
115
+ log.info('oauth2_code.refresh_success', {
116
+ hasNewRefreshToken: !!j.refresh_token,
117
+ expiresIn,
118
+ accessTokenLength: newTokens.accessToken.length,
119
+ });
120
+ return newTokens;
121
+ }
122
+
123
+ protected throwNoTokenError(): void {
124
+ const userKey = getEffectiveUserKey();
125
+ const errorMessage = userKey
126
+ ? `${this.authErrorCode}:http://localhost:${HTTP_MCP_PORT}/oauth/start?userKey=${encodeURIComponent(userKey)}`
127
+ : this.authErrorCode;
128
+ throw new Error(errorMessage);
129
+ }
130
+
131
+ protected async ensureAccessToken(force = false): Promise<string | undefined> {
132
+ log.info('oauth2_code.ensure_access_token.start', { force });
133
+ const now = Date.now();
134
+ if (
135
+ !force &&
136
+ this.accessToken &&
137
+ this.accessTokenExpiryMs &&
138
+ now < this.accessTokenExpiryMs
139
+ ) {
140
+ return this.accessToken;
141
+ }
142
+ const userKey = getEffectiveUserKey();
143
+ if (!userKey) {
144
+ log.warn('oauth2_code.no_user_key');
145
+ return undefined;
146
+ }
147
+ const saved = await this._sessionContext.getTokensForUser(userKey);
148
+ if (!saved) {
149
+ log.warn('oauth2_code.no_saved_tokens', { userKey });
150
+ return undefined;
151
+ }
152
+ if (
153
+ !force &&
154
+ saved.accessToken &&
155
+ saved.accessTokenExpiryMs &&
156
+ now < saved.accessTokenExpiryMs
157
+ ) {
158
+ this.accessToken = saved.accessToken;
159
+ this.accessTokenExpiryMs = saved.accessTokenExpiryMs;
160
+ return this.accessToken;
161
+ }
162
+ if (saved.refreshToken) {
163
+ const updated = await this._refreshTokens(saved.refreshToken);
164
+ await this._sessionContext.setTokensForUser(userKey, updated);
165
+ this.accessToken = updated.accessToken;
166
+ this.accessTokenExpiryMs = updated.accessTokenExpiryMs;
167
+ return this.accessToken;
168
+ }
169
+ await this._sessionContext.deleteTokensForUser(userKey);
170
+ return undefined;
171
+ }
172
+
173
+ public async finishAuthorization(code: string): Promise<void> {
174
+ const userKey = getEffectiveUserKey();
175
+ log.info('oauth2_code.finish_authorization', { userKey, hasCode: !!code });
176
+ if (!userKey) {
177
+ throw new Error('oauth2_code_missing_user');
178
+ }
179
+ const tokens = await this._exchangeCodeForTokens(code);
180
+ await this._sessionContext.setTokensForUser(userKey, tokens);
181
+ this.accessToken = tokens.accessToken;
182
+ this.accessTokenExpiryMs = tokens.accessTokenExpiryMs;
183
+ this._tokenRefreshScheduler.scheduleRefresh(userKey);
184
+ log.info('oauth2_code.authorization_complete', { userKey });
185
+ }
186
+
187
+ public async getAuthorizeUrl(state: string): Promise<string> {
188
+ const idBase = this.getIdentityBase();
189
+ const u = new URL(idBase + AUTHORIZE_ENDPOINT);
190
+ u.searchParams.set('client_id', this.authConfig.clientId);
191
+ u.searchParams.set('redirect_uri', this.authConfig.redirectUri);
192
+ u.searchParams.set('response_type', 'code');
193
+ u.searchParams.set('state', state);
194
+ const scopeParam = encodeURIComponent(this._scope);
195
+ u.search += '&scope=' + scopeParam;
196
+ log.info('oauth2_code.authorize_url', {
197
+ idBase,
198
+ url: u.toString(),
199
+ });
200
+ return u.toString();
201
+ }
202
+
203
+ public async revoke(): Promise<void> {
204
+ try {
205
+ const userKey = getUserKey();
206
+ if (!userKey) {
207
+ return;
208
+ }
209
+ const saved = await this._sessionContext.getTokensForUser(userKey);
210
+ if (!saved?.refreshToken) {
211
+ await this._sessionContext.deleteTokensForUser(userKey);
212
+ return;
213
+ }
214
+ const idBase = this.getIdentityBase();
215
+ const url = idBase + REVOCATION_ENDPOINT;
216
+ const body = new URLSearchParams();
217
+ body.set('client_id', this.authConfig.clientId);
218
+ if (this.authConfig.clientSecret) {
219
+ body.set('client_secret', this.authConfig.clientSecret);
220
+ }
221
+ body.set('token', saved.refreshToken);
222
+ body.set('token_type_hint', 'refresh_token');
223
+ const res = await fetch(url, {
224
+ method: 'POST',
225
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
226
+ body: body.toString(),
227
+ });
228
+ if (!res.ok) {
229
+ const t = await res.text().catch(() => '');
230
+ log.error('oauth2_code.revoke_failed', { status: res.status, t });
231
+ }
232
+ } finally {
233
+ const userKey = getUserKey();
234
+ if (userKey) {
235
+ await this._sessionContext.deleteTokensForUser(userKey);
236
+ this._tokenRefreshScheduler.cancelRefresh(userKey);
237
+ }
238
+ this.accessToken = undefined;
239
+ this.accessTokenExpiryMs = undefined;
240
+ }
241
+ }
242
+
243
+ public async refreshUserTokens(userKey: string): Promise<void> {
244
+ const saved = await this._sessionContext.getTokensForUser(userKey);
245
+ if (!saved?.refreshToken) {
246
+ throw new Error('oauth2_no_refresh_token');
247
+ }
248
+ const updated = await this._refreshTokens(saved.refreshToken);
249
+ await this._sessionContext.setTokensForUser(userKey, updated);
250
+ log.info('oauth2_code.background_refresh_success', { userKey });
251
+ }
252
+ }
@@ -0,0 +1,91 @@
1
+ import log from '../../../log';
2
+ import { CreatioClientConfig, OAuth2AuthConfig } from '../../client-config';
3
+ import { TOKEN_BODY_SNIPPET_MAX, TOKEN_ENDPOINT } from '../auth';
4
+
5
+ import { BaseOAuth2Provider } from './base-oauth2-provider';
6
+
7
+ export class OAuth2Provider extends BaseOAuth2Provider<OAuth2AuthConfig> {
8
+ private readonly _config: CreatioClientConfig;
9
+
10
+ protected readonly authErrorCode = 'oauth2_auth_failed';
11
+
12
+ constructor(config: CreatioClientConfig) {
13
+ super(config);
14
+ this._config = config;
15
+ }
16
+
17
+ protected async ensureAccessToken(): Promise<string | undefined> {
18
+ const now = Date.now();
19
+ if (this.accessToken && this.accessTokenExpiryMs && now < this.accessTokenExpiryMs) {
20
+ return this.accessToken;
21
+ }
22
+ const url = `${this.getIdentityBase()}${TOKEN_ENDPOINT}`;
23
+ const body = new URLSearchParams();
24
+ body.set('grant_type', 'client_credentials');
25
+ body.set('client_id', this.authConfig.clientId);
26
+ body.set('client_secret', this.authConfig.clientSecret);
27
+ try {
28
+ log.creatioAuthStart(this._config.baseUrl, 'oauth2');
29
+ const response = await fetch(url, {
30
+ method: 'POST',
31
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
32
+ body: body.toString(),
33
+ });
34
+ const responseText = await response.text().catch(() => '');
35
+ const contentType = (response.headers as any)?.get?.('content-type') ?? '';
36
+ const bodySnippet =
37
+ responseText && responseText.length > TOKEN_BODY_SNIPPET_MAX
38
+ ? responseText.slice(0, TOKEN_BODY_SNIPPET_MAX) + '\n... [truncated]'
39
+ : responseText;
40
+ if (!response.ok) {
41
+ log.error('oauth.token.error', {
42
+ url,
43
+ status: response.status,
44
+ contentType,
45
+ bodySnippet,
46
+ });
47
+ log.creatioAuthFailed(
48
+ this._config.baseUrl,
49
+ `token_error:${response.status}`,
50
+ 'oauth2',
51
+ );
52
+ throw new Error(`oauth2_token_error:${response.status}`);
53
+ }
54
+ if (!responseText) {
55
+ log.error('oauth.token.empty_body', { url, status: response.status, contentType });
56
+ log.creatioAuthFailed(this._config.baseUrl, 'empty_response_body', 'oauth2');
57
+ throw new Error('oauth2_empty_token_response');
58
+ }
59
+ let tokenResponse: any = null;
60
+ try {
61
+ tokenResponse = JSON.parse(responseText);
62
+ } catch (err) {
63
+ log.error('oauth.token.parse_failed', {
64
+ url,
65
+ status: response.status,
66
+ contentType,
67
+ bodySnippet,
68
+ });
69
+ log.creatioAuthFailed(this._config.baseUrl, 'token_parse_failed', 'oauth2');
70
+ throw new Error('oauth2_token_parse_failed');
71
+ }
72
+ if (!tokenResponse || !tokenResponse.access_token) {
73
+ log.creatioAuthFailed(
74
+ this._config.baseUrl,
75
+ 'no_access_token_in_response',
76
+ 'oauth2',
77
+ );
78
+ throw new Error('oauth2_no_access_token');
79
+ }
80
+ this.accessToken = String(tokenResponse.access_token);
81
+ const expiresIn = Number(tokenResponse.expires_in) || 3600;
82
+ this.accessTokenExpiryMs = this.computeExpiryMs(expiresIn, 1);
83
+ log.creatioAuthOk(this._config.baseUrl, 'oauth2');
84
+ return this.accessToken;
85
+ } catch (e: any) {
86
+ log.error('oauth.token.exception', { error: String(e?.message ?? e) });
87
+ log.creatioAuthFailed(this._config.baseUrl, String(e?.message ?? e), 'oauth2');
88
+ return undefined;
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,5 @@
1
+ export enum AuthProviderType {
2
+ Legacy = 'legacy',
3
+ OAuth2 = 'oauth2',
4
+ OAuth2Code = 'oauth2_code',
5
+ }
@@ -0,0 +1,34 @@
1
+ import { AuthProviderType } from './auth/providers';
2
+
3
+ interface ICreatioAuthConfig {
4
+ kind: AuthProviderType;
5
+ }
6
+
7
+ export interface LegacyAuthConfig extends ICreatioAuthConfig {
8
+ kind: AuthProviderType.Legacy;
9
+ login: string;
10
+ password: string;
11
+ }
12
+
13
+ interface BaseOAuthConfig extends ICreatioAuthConfig {
14
+ clientId: string;
15
+ clientSecret: string;
16
+ scope?: string;
17
+ idBaseUrl?: string;
18
+ }
19
+
20
+ export interface OAuth2AuthConfig extends BaseOAuthConfig {
21
+ kind: AuthProviderType.OAuth2;
22
+ }
23
+
24
+ export interface OAuth2CodeAuthConfig extends BaseOAuthConfig {
25
+ kind: AuthProviderType.OAuth2Code;
26
+ redirectUri: string;
27
+ }
28
+
29
+ export type CreatioClientAuthConfig = LegacyAuthConfig | OAuth2AuthConfig | OAuth2CodeAuthConfig;
30
+
31
+ export interface CreatioClientConfig {
32
+ baseUrl: string;
33
+ auth: CreatioClientAuthConfig;
34
+ }
@@ -0,0 +1,47 @@
1
+ import {
2
+ CrudDeleteParams,
3
+ CrudProvider,
4
+ CrudReadParams,
5
+ CrudUpdateParams,
6
+ CrudWriteParams,
7
+ EntitySchemaDescription,
8
+ } from '../../providers';
9
+ import { CreatioEngine } from '../engine';
10
+
11
+ export class CrudEngine implements CreatioEngine {
12
+ private readonly _provider: CrudProvider;
13
+
14
+ public readonly name = 'crud';
15
+
16
+ constructor(provider: CrudProvider) {
17
+ this._provider = provider;
18
+ }
19
+
20
+ public get kind(): string {
21
+ return this._provider.kind;
22
+ }
23
+
24
+ public listEntitySets(): Promise<string[]> {
25
+ return this._provider.listEntitySets();
26
+ }
27
+
28
+ public describeEntity(entitySet: string): Promise<EntitySchemaDescription> {
29
+ return this._provider.describeEntity(entitySet);
30
+ }
31
+
32
+ public read(params: CrudReadParams): Promise<any> {
33
+ return this._provider.read(params);
34
+ }
35
+
36
+ public create(params: CrudWriteParams): Promise<any> {
37
+ return this._provider.create(params);
38
+ }
39
+
40
+ public update(params: CrudUpdateParams): Promise<any> {
41
+ return this._provider.update(params);
42
+ }
43
+
44
+ public delete(params: CrudDeleteParams): Promise<any> {
45
+ return this._provider.delete(params);
46
+ }
47
+ }
@@ -0,0 +1,102 @@
1
+ import { CreatioProviderContext } from '../provider-context';
2
+ import { CrudProvider, ProcessProvider, SysSettingsProvider, UserProvider } from '../providers';
3
+
4
+ import { CrudEngine } from './crud/crud-engine';
5
+ import { CreatioEngine } from './engine';
6
+ import { EngineRegistry, EngineType } from './engine-registry';
7
+ import { ProcessEngine } from './process/process-engine';
8
+ import { SysSettingsEngine } from './sys-settings/sys-settings-engine';
9
+ import { UserEngine } from './user/user-engine';
10
+
11
+ export interface EngineManagerOptions {
12
+ crudProvider?: CrudProvider;
13
+ processProvider?: ProcessProvider;
14
+ sysSettingsProvider?: SysSettingsProvider;
15
+ userProvider?: UserProvider;
16
+ enableCrud?: boolean;
17
+ enableProcess?: boolean;
18
+ enableSysSettings?: boolean;
19
+ enableUser?: boolean;
20
+ }
21
+
22
+ export class CreatioEngineManager {
23
+ private readonly _context: CreatioProviderContext;
24
+ private readonly _options: EngineManagerOptions | undefined;
25
+ private readonly _registry = new EngineRegistry();
26
+ private readonly _engines = new Map<string, CreatioEngine>();
27
+
28
+ public get authProvider() {
29
+ return this._context.authProvider;
30
+ }
31
+
32
+ public get registry(): EngineRegistry {
33
+ return this._registry;
34
+ }
35
+
36
+ public get crud(): CrudEngine {
37
+ return this._registry.require<CrudEngine>(EngineType.Crud);
38
+ }
39
+
40
+ public get process(): ProcessEngine {
41
+ return this._registry.require<ProcessEngine>(EngineType.Process);
42
+ }
43
+
44
+ public get sysSettings(): SysSettingsEngine {
45
+ return this._registry.require<SysSettingsEngine>(EngineType.SysSettings);
46
+ }
47
+
48
+ public get user(): UserEngine {
49
+ return this._registry.require<UserEngine>(EngineType.User);
50
+ }
51
+
52
+ constructor(context: CreatioProviderContext, options?: EngineManagerOptions) {
53
+ this._context = context;
54
+ this._options = options;
55
+ this._initialize();
56
+ }
57
+
58
+ private _initialize() {
59
+ this._registerEngine(
60
+ EngineType.Crud,
61
+ () =>
62
+ new CrudEngine(this._options?.crudProvider ?? (this._context.crud as CrudProvider)),
63
+ this._options?.enableCrud ?? true,
64
+ );
65
+ this._registerEngine(
66
+ EngineType.Process,
67
+ () =>
68
+ new ProcessEngine(
69
+ this._options?.processProvider ?? (this._context.process as ProcessProvider),
70
+ ),
71
+ this._options?.enableProcess ?? true,
72
+ );
73
+ this._registerEngine(
74
+ EngineType.SysSettings,
75
+ () =>
76
+ new SysSettingsEngine(
77
+ this._options?.sysSettingsProvider ??
78
+ (this._context.sysSettings as SysSettingsProvider),
79
+ ),
80
+ this._options?.enableSysSettings ?? true,
81
+ );
82
+ this._registerEngine(
83
+ EngineType.User,
84
+ () =>
85
+ new UserEngine(this._options?.userProvider ?? (this._context.user as UserProvider)),
86
+ this._options?.enableUser ?? true,
87
+ );
88
+ }
89
+
90
+ private _registerEngine<T extends CreatioEngine>(
91
+ type: EngineType,
92
+ factory: () => T,
93
+ enabled: boolean,
94
+ ) {
95
+ if (!enabled) {
96
+ return;
97
+ }
98
+ const engine = factory();
99
+ this._engines.set(type, engine);
100
+ this._registry.register(engine);
101
+ }
102
+ }
@@ -0,0 +1,36 @@
1
+ import { CreatioEngine } from './engine';
2
+
3
+ export enum EngineType {
4
+ Crud = 'crud',
5
+ Process = 'process',
6
+ SysSettings = 'sys-settings',
7
+ User = 'user',
8
+ }
9
+
10
+ export class EngineRegistry {
11
+ private readonly _engines = new Map<string, CreatioEngine>();
12
+
13
+ public register(engine: CreatioEngine): CreatioEngine {
14
+ if (this._engines.has(engine.name)) {
15
+ throw new Error(`engine_already_registered:${engine.name}`);
16
+ }
17
+ this._engines.set(engine.name, engine);
18
+ return engine;
19
+ }
20
+
21
+ public get<T extends CreatioEngine = CreatioEngine>(name: string): T | undefined {
22
+ return this._engines.get(name) as T | undefined;
23
+ }
24
+
25
+ public require<T extends CreatioEngine = CreatioEngine>(name: string): T {
26
+ const engine = this.get<T>(name);
27
+ if (!engine) {
28
+ throw new Error(`engine_not_registered:${name}`);
29
+ }
30
+ return engine;
31
+ }
32
+
33
+ public entries(): IterableIterator<[string, CreatioEngine]> {
34
+ return this._engines.entries();
35
+ }
36
+ }
@@ -0,0 +1,3 @@
1
+ export interface CreatioEngine {
2
+ readonly name: string;
3
+ }
@@ -0,0 +1,7 @@
1
+ export * from './engine';
2
+ export * from './engine-manager';
3
+ export * from './engine-registry';
4
+ export * from './crud/crud-engine';
5
+ export * from './process/process-engine';
6
+ export * from './sys-settings/sys-settings-engine';
7
+ export * from './user/user-engine';
@@ -0,0 +1,20 @@
1
+ import { ExecuteProcessParams, ExecuteProcessResult, ProcessProvider } from '../../providers';
2
+ import { CreatioEngine } from '../engine';
3
+
4
+ export class ProcessEngine implements CreatioEngine {
5
+ private readonly _provider: ProcessProvider;
6
+
7
+ public readonly name = 'process';
8
+
9
+ constructor(provider: ProcessProvider) {
10
+ this._provider = provider;
11
+ }
12
+
13
+ public get kind(): string {
14
+ return this._provider.kind;
15
+ }
16
+
17
+ public execute(params: ExecuteProcessParams): Promise<ExecuteProcessResult> {
18
+ return this._provider.executeProcess(params);
19
+ }
20
+ }