n8n-nodes-base 2.34.2 → 2.35.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 (338) hide show
  1. package/dist/cjs/build.tsbuildinfo +1 -1
  2. package/dist/credentials/DiscordBotApi.credentials.d.ts.map +1 -1
  3. package/dist/credentials/DiscordBotApi.credentials.js +17 -0
  4. package/dist/credentials/DiscordBotApi.credentials.js.map +1 -1
  5. package/dist/credentials/SlackOAuth2Api.credentials.d.ts.map +1 -1
  6. package/dist/credentials/SlackOAuth2Api.credentials.js +9 -0
  7. package/dist/credentials/SlackOAuth2Api.credentials.js.map +1 -1
  8. package/dist/credentials/TwitterOAuth2Api.credentials.js +2 -2
  9. package/dist/credentials/TwitterOAuth2Api.credentials.js.map +1 -1
  10. package/dist/known/credentials.json +2 -1
  11. package/dist/known/nodes.json +4 -0
  12. package/dist/node-definitions/.nodes-hash +1 -1
  13. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v1/mode_each.ts +40 -0
  14. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v1/mode_once.ts +40 -0
  15. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v11/mode_each.ts +40 -0
  16. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v11/mode_once.ts +40 -0
  17. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v12/mode_each.ts +41 -0
  18. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v12/mode_once.ts +41 -0
  19. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v13/mode_each.ts +41 -0
  20. package/dist/node-definitions/nodes/n8n-nodes-base/executeWorkflow/v13/mode_once.ts +41 -0
  21. package/dist/node-definitions/nodes/n8n-nodes-base/github/v1/resource_workflow/operation_dispatch_and_wait.schema.js +1 -0
  22. package/dist/node-definitions/nodes/n8n-nodes-base/github/v1/resource_workflow/operation_dispatch_and_wait.ts +33 -0
  23. package/dist/node-definitions/nodes/n8n-nodes-base/github/v11/resource_workflow/operation_dispatch_and_wait.schema.js +1 -0
  24. package/dist/node-definitions/nodes/n8n-nodes-base/github/v11/resource_workflow/operation_dispatch_and_wait.ts +33 -0
  25. package/dist/node-definitions/nodes/n8n-nodes-base/googleAnalytics/v2/resource_report/operation_get.ts +2 -2
  26. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v2.schema.js +1 -1
  27. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v2.ts +3 -2
  28. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v3.schema.js +1 -1
  29. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v3.ts +8 -7
  30. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v4.schema.js +1 -1
  31. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v4.ts +8 -7
  32. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v41.schema.js +1 -1
  33. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v41.ts +8 -7
  34. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v42.schema.js +1 -1
  35. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v42.ts +8 -7
  36. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v43.schema.js +1 -1
  37. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v43.ts +8 -7
  38. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v44.schema.js +1 -1
  39. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v44.ts +8 -7
  40. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v45.schema.js +1 -1
  41. package/dist/node-definitions/nodes/n8n-nodes-base/httpRequest/v45.ts +8 -7
  42. package/dist/node-definitions/nodes/n8n-nodes-base/kafka/index.ts +3 -1
  43. package/dist/node-definitions/nodes/n8n-nodes-base/kafka/v2.schema.js +35 -0
  44. package/dist/node-definitions/nodes/n8n-nodes-base/kafka/v2.ts +100 -0
  45. package/dist/node-definitions/nodes/n8n-nodes-base/kafkaTrigger/index.ts +3 -1
  46. package/dist/node-definitions/nodes/n8n-nodes-base/kafkaTrigger/v2.schema.js +30 -0
  47. package/dist/node-definitions/nodes/n8n-nodes-base/kafkaTrigger/v2.ts +124 -0
  48. package/dist/node-definitions/nodes/n8n-nodes-base/microsoftOutlook/v2/resource_event/operation_create.ts +2 -2
  49. package/dist/node-definitions/nodes/n8n-nodes-base/salesforceTrigger/v1.schema.js +1 -0
  50. package/dist/node-definitions/nodes/n8n-nodes-base/salesforceTrigger/v1.ts +6 -0
  51. package/dist/node-definitions/nodes/n8n-nodes-base/salesforceTrigger/v11.schema.js +1 -0
  52. package/dist/node-definitions/nodes/n8n-nodes-base/salesforceTrigger/v11.ts +6 -0
  53. package/dist/node-definitions/nodes/n8n-nodes-base/slack/index.ts +3 -1
  54. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v2/resource_message/operation_search.schema.js +1 -1
  55. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v2/resource_message/operation_search.ts +26 -0
  56. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v21/resource_message/operation_search.schema.js +1 -1
  57. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v21/resource_message/operation_search.ts +26 -0
  58. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v22/resource_message/operation_search.schema.js +1 -1
  59. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v22/resource_message/operation_search.ts +26 -0
  60. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v23/resource_message/operation_search.schema.js +1 -1
  61. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v23/resource_message/operation_search.ts +26 -0
  62. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v24/resource_message/operation_search.schema.js +1 -1
  63. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v24/resource_message/operation_search.ts +26 -0
  64. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v25/resource_message/operation_search.schema.js +1 -1
  65. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v25/resource_message/operation_search.ts +26 -0
  66. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v26/resource_message/operation_search.schema.js +1 -1
  67. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v26/resource_message/operation_search.ts +26 -0
  68. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/index.schema.js +32 -0
  69. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/index.ts +30 -0
  70. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/index.schema.js +52 -0
  71. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/index.ts +60 -0
  72. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_archive.schema.js +23 -0
  73. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_archive.ts +29 -0
  74. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_close.schema.js +23 -0
  75. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_close.ts +29 -0
  76. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_create.schema.js +24 -0
  77. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_create.ts +32 -0
  78. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_get.schema.js +24 -0
  79. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_get.ts +39 -0
  80. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_get_all.schema.js +25 -0
  81. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_get_all.ts +48 -0
  82. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_history.schema.js +26 -0
  83. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_history.ts +56 -0
  84. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_invite.schema.js +24 -0
  85. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_invite.ts +35 -0
  86. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_join.schema.js +23 -0
  87. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_join.ts +29 -0
  88. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_kick.schema.js +24 -0
  89. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_kick.ts +34 -0
  90. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_leave.schema.js +23 -0
  91. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_leave.ts +29 -0
  92. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_member.schema.js +26 -0
  93. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_member.ts +45 -0
  94. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_open.schema.js +23 -0
  95. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_open.ts +41 -0
  96. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_rename.schema.js +24 -0
  97. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_rename.ts +33 -0
  98. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_replies.schema.js +27 -0
  99. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_replies.ts +60 -0
  100. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_set_purpose.schema.js +24 -0
  101. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_set_purpose.ts +33 -0
  102. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_set_topic.schema.js +24 -0
  103. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_set_topic.ts +33 -0
  104. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_unarchive.schema.js +23 -0
  105. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_channel/operation_unarchive.ts +29 -0
  106. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/index.schema.js +24 -0
  107. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/index.ts +18 -0
  108. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_get.schema.js +23 -0
  109. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_get.ts +27 -0
  110. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_get_all.schema.js +25 -0
  111. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_get_all.ts +62 -0
  112. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_upload.schema.js +24 -0
  113. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_file/operation_upload.ts +56 -0
  114. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/index.schema.js +36 -0
  115. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/index.ts +36 -0
  116. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_delete.schema.js +26 -0
  117. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_delete.ts +44 -0
  118. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_delete_scheduled.schema.js +24 -0
  119. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_delete_scheduled.ts +32 -0
  120. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_get_many_scheduled.schema.js +25 -0
  121. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_get_many_scheduled.ts +50 -0
  122. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_get_permalink.schema.js +24 -0
  123. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_get_permalink.ts +32 -0
  124. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_post.schema.js +30 -0
  125. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_post.ts +237 -0
  126. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_schedule.schema.js +31 -0
  127. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_schedule.ts +241 -0
  128. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_search.schema.js +26 -0
  129. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_search.ts +98 -0
  130. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_send_and_wait.schema.js +36 -0
  131. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_send_and_wait.ts +341 -0
  132. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_update.schema.js +29 -0
  133. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_message/operation_update.ts +72 -0
  134. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/index.schema.js +24 -0
  135. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/index.ts +18 -0
  136. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_add.schema.js +25 -0
  137. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_add.ts +37 -0
  138. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_get.schema.js +24 -0
  139. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_get.ts +33 -0
  140. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_remove.schema.js +25 -0
  141. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_reaction/operation_remove.ts +37 -0
  142. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/index.schema.js +24 -0
  143. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/index.ts +18 -0
  144. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_add.schema.js +27 -0
  145. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_add.ts +53 -0
  146. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_delete.schema.js +23 -0
  147. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_delete.ts +42 -0
  148. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_get_all.schema.js +24 -0
  149. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_star/operation_get_all.ts +34 -0
  150. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/index.schema.js +30 -0
  151. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/index.ts +27 -0
  152. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_all.schema.js +24 -0
  153. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_all.ts +34 -0
  154. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_presence.schema.js +23 -0
  155. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_presence.ts +29 -0
  156. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_profile.schema.js +23 -0
  157. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_get_profile.ts +29 -0
  158. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_info.schema.js +23 -0
  159. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_info.ts +29 -0
  160. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_lookup_by_email.schema.js +23 -0
  161. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_lookup_by_email.ts +27 -0
  162. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_update_profile.schema.js +23 -0
  163. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user/operation_update_profile.ts +78 -0
  164. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/index.schema.js +32 -0
  165. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/index.ts +30 -0
  166. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_create.schema.js +24 -0
  167. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_create.ts +48 -0
  168. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_disable.schema.js +24 -0
  169. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_disable.ts +36 -0
  170. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_enable.schema.js +24 -0
  171. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_enable.ts +36 -0
  172. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_get_all.schema.js +25 -0
  173. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_get_all.ts +52 -0
  174. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_get_users.schema.js +24 -0
  175. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_get_users.ts +36 -0
  176. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_update.schema.js +24 -0
  177. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_update.ts +50 -0
  178. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_update_users.schema.js +25 -0
  179. package/dist/node-definitions/nodes/n8n-nodes-base/slack/v27/resource_user_group/operation_update_users.ts +42 -0
  180. package/dist/nodes/Confluence/Confluence.node.d.ts +6 -0
  181. package/dist/nodes/Confluence/Confluence.node.d.ts.map +1 -0
  182. package/dist/nodes/Confluence/Confluence.node.js +13 -0
  183. package/dist/nodes/Confluence/Confluence.node.js.map +1 -0
  184. package/dist/nodes/Confluence/Confluence.node.json +18 -0
  185. package/dist/nodes/Confluence/actions/description.d.ts +3 -0
  186. package/dist/nodes/Confluence/actions/description.d.ts.map +1 -0
  187. package/dist/nodes/Confluence/actions/description.js +28 -0
  188. package/dist/nodes/Confluence/actions/description.js.map +1 -0
  189. package/dist/nodes/Confluence/actions/router.d.ts +9 -0
  190. package/dist/nodes/Confluence/actions/router.d.ts.map +1 -0
  191. package/dist/nodes/Confluence/actions/router.js +15 -0
  192. package/dist/nodes/Confluence/actions/router.js.map +1 -0
  193. package/dist/nodes/Confluence/confluence.svg +1 -0
  194. package/dist/nodes/Confluence/transport/index.d.ts +20 -0
  195. package/dist/nodes/Confluence/transport/index.d.ts.map +1 -0
  196. package/dist/nodes/Confluence/transport/index.js +117 -0
  197. package/dist/nodes/Confluence/transport/index.js.map +1 -0
  198. package/dist/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.d.ts.map +1 -1
  199. package/dist/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.js +48 -0
  200. package/dist/nodes/ExecuteWorkflow/ExecuteWorkflow/ExecuteWorkflow.node.js.map +1 -1
  201. package/dist/nodes/Form/interfaces.d.ts +1 -0
  202. package/dist/nodes/Form/interfaces.d.ts.map +1 -1
  203. package/dist/nodes/Form/interfaces.js.map +1 -1
  204. package/dist/nodes/Form/utils/utils.d.ts +4 -2
  205. package/dist/nodes/Form/utils/utils.d.ts.map +1 -1
  206. package/dist/nodes/Form/utils/utils.js +125 -2
  207. package/dist/nodes/Form/utils/utils.js.map +1 -1
  208. package/dist/nodes/Function/Function.node.d.ts.map +1 -1
  209. package/dist/nodes/Function/Function.node.js +7 -1
  210. package/dist/nodes/Function/Function.node.js.map +1 -1
  211. package/dist/nodes/FunctionItem/FunctionItem.node.d.ts.map +1 -1
  212. package/dist/nodes/FunctionItem/FunctionItem.node.js +7 -1
  213. package/dist/nodes/FunctionItem/FunctionItem.node.js.map +1 -1
  214. package/dist/nodes/Github/Github.node.d.ts.map +1 -1
  215. package/dist/nodes/Github/Github.node.js +25 -1
  216. package/dist/nodes/Github/Github.node.js.map +1 -1
  217. package/dist/nodes/HttpRequest/V3/Description.js +5 -5
  218. package/dist/nodes/HttpRequest/V3/Description.js.map +1 -1
  219. package/dist/nodes/Kafka/Kafka.node.d.ts +3 -9
  220. package/dist/nodes/Kafka/Kafka.node.d.ts.map +1 -1
  221. package/dist/nodes/Kafka/Kafka.node.js +17 -382
  222. package/dist/nodes/Kafka/Kafka.node.js.map +1 -1
  223. package/dist/nodes/Kafka/KafkaTrigger.node.d.ts +3 -4
  224. package/dist/nodes/Kafka/KafkaTrigger.node.d.ts.map +1 -1
  225. package/dist/nodes/Kafka/KafkaTrigger.node.js +18 -452
  226. package/dist/nodes/Kafka/KafkaTrigger.node.js.map +1 -1
  227. package/dist/nodes/Kafka/utils.d.ts +62 -1
  228. package/dist/nodes/Kafka/utils.d.ts.map +1 -1
  229. package/dist/nodes/Kafka/utils.js +151 -16
  230. package/dist/nodes/Kafka/utils.js.map +1 -1
  231. package/dist/nodes/Kafka/v1/KafkaTriggerV1.node.d.ts +7 -0
  232. package/dist/nodes/Kafka/v1/KafkaTriggerV1.node.d.ts.map +1 -0
  233. package/dist/nodes/Kafka/v1/KafkaTriggerV1.node.js +480 -0
  234. package/dist/nodes/Kafka/v1/KafkaTriggerV1.node.js.map +1 -0
  235. package/dist/nodes/Kafka/v1/KafkaV1.node.d.ts +12 -0
  236. package/dist/nodes/Kafka/v1/KafkaV1.node.d.ts.map +1 -0
  237. package/dist/nodes/Kafka/v1/KafkaV1.node.js +397 -0
  238. package/dist/nodes/Kafka/v1/KafkaV1.node.js.map +1 -0
  239. package/dist/nodes/Kafka/v2/KafkaTriggerV2.node.d.ts +7 -0
  240. package/dist/nodes/Kafka/v2/KafkaTriggerV2.node.d.ts.map +1 -0
  241. package/dist/nodes/Kafka/v2/KafkaTriggerV2.node.js +101 -0
  242. package/dist/nodes/Kafka/v2/KafkaTriggerV2.node.js.map +1 -0
  243. package/dist/nodes/Kafka/v2/KafkaTriggerV2Description.d.ts +3 -0
  244. package/dist/nodes/Kafka/v2/KafkaTriggerV2Description.d.ts.map +1 -0
  245. package/dist/nodes/Kafka/v2/KafkaTriggerV2Description.js +291 -0
  246. package/dist/nodes/Kafka/v2/KafkaTriggerV2Description.js.map +1 -0
  247. package/dist/nodes/Kafka/v2/KafkaV2.node.d.ts +7 -0
  248. package/dist/nodes/Kafka/v2/KafkaV2.node.d.ts.map +1 -0
  249. package/dist/nodes/Kafka/v2/KafkaV2.node.js +386 -0
  250. package/dist/nodes/Kafka/v2/KafkaV2.node.js.map +1 -0
  251. package/dist/nodes/Kafka/v2/TriggerSettings.d.ts +109 -0
  252. package/dist/nodes/Kafka/v2/TriggerSettings.d.ts.map +1 -0
  253. package/dist/nodes/Kafka/v2/TriggerSettings.js +273 -0
  254. package/dist/nodes/Kafka/v2/TriggerSettings.js.map +1 -0
  255. package/dist/nodes/Kafka/v2/consumer/ConsumeTopic.d.ts +51 -0
  256. package/dist/nodes/Kafka/v2/consumer/ConsumeTopic.d.ts.map +1 -0
  257. package/dist/nodes/Kafka/v2/consumer/ConsumeTopic.js +189 -0
  258. package/dist/nodes/Kafka/v2/consumer/ConsumeTopic.js.map +1 -0
  259. package/dist/nodes/Kafka/v2/consumer/DataEmitter.d.ts +45 -0
  260. package/dist/nodes/Kafka/v2/consumer/DataEmitter.d.ts.map +1 -0
  261. package/dist/nodes/Kafka/v2/consumer/DataEmitter.js +153 -0
  262. package/dist/nodes/Kafka/v2/consumer/DataEmitter.js.map +1 -0
  263. package/dist/nodes/Kafka/v2/consumer/MessageParser.d.ts +23 -0
  264. package/dist/nodes/Kafka/v2/consumer/MessageParser.d.ts.map +1 -0
  265. package/dist/nodes/Kafka/v2/consumer/MessageParser.js +100 -0
  266. package/dist/nodes/Kafka/v2/consumer/MessageParser.js.map +1 -0
  267. package/dist/nodes/Kafka/v2/consumer/index.d.ts +7 -0
  268. package/dist/nodes/Kafka/v2/consumer/index.d.ts.map +1 -0
  269. package/dist/nodes/Kafka/v2/consumer/index.js +13 -0
  270. package/dist/nodes/Kafka/v2/consumer/index.js.map +1 -0
  271. package/dist/nodes/Kafka/v2/transport/LibraryLogger.d.ts +18 -0
  272. package/dist/nodes/Kafka/v2/transport/LibraryLogger.d.ts.map +1 -0
  273. package/dist/nodes/Kafka/v2/transport/LibraryLogger.js +94 -0
  274. package/dist/nodes/Kafka/v2/transport/LibraryLogger.js.map +1 -0
  275. package/dist/nodes/Kafka/v2/transport/client.d.ts +20 -0
  276. package/dist/nodes/Kafka/v2/transport/client.d.ts.map +1 -0
  277. package/dist/nodes/Kafka/v2/transport/client.js +36 -0
  278. package/dist/nodes/Kafka/v2/transport/client.js.map +1 -0
  279. package/dist/nodes/Kafka/v2/transport/config.d.ts +13 -0
  280. package/dist/nodes/Kafka/v2/transport/config.d.ts.map +1 -0
  281. package/dist/nodes/Kafka/v2/transport/config.js +57 -0
  282. package/dist/nodes/Kafka/v2/transport/config.js.map +1 -0
  283. package/dist/nodes/Kafka/v2/transport/consumer.d.ts +66 -0
  284. package/dist/nodes/Kafka/v2/transport/consumer.d.ts.map +1 -0
  285. package/dist/nodes/Kafka/v2/transport/consumer.js +48 -0
  286. package/dist/nodes/Kafka/v2/transport/consumer.js.map +1 -0
  287. package/dist/nodes/Kafka/v2/transport/index.d.ts +6 -0
  288. package/dist/nodes/Kafka/v2/transport/index.d.ts.map +1 -0
  289. package/dist/nodes/Kafka/v2/transport/index.js +16 -0
  290. package/dist/nodes/Kafka/v2/transport/index.js.map +1 -0
  291. package/dist/nodes/Kafka/v2/transport/producer.d.ts +9 -0
  292. package/dist/nodes/Kafka/v2/transport/producer.d.ts.map +1 -0
  293. package/dist/nodes/Kafka/v2/transport/producer.js +18 -0
  294. package/dist/nodes/Kafka/v2/transport/producer.js.map +1 -0
  295. package/dist/nodes/Merge/Merge.node.json +1 -1
  296. package/dist/nodes/Microsoft/SharePoint/v2/file/index.d.ts.map +1 -1
  297. package/dist/nodes/Microsoft/SharePoint/v2/file/index.js +0 -3
  298. package/dist/nodes/Microsoft/SharePoint/v2/file/index.js.map +1 -1
  299. package/dist/nodes/Microsoft/SharePoint/v2/site/index.d.ts.map +1 -1
  300. package/dist/nodes/Microsoft/SharePoint/v2/site/index.js +10 -8
  301. package/dist/nodes/Microsoft/SharePoint/v2/site/index.js.map +1 -1
  302. package/dist/nodes/Notion/shared/GenericFunctions.d.ts +3 -3
  303. package/dist/nodes/Notion/shared/GenericFunctions.d.ts.map +1 -1
  304. package/dist/nodes/Salesforce/SalesforceTrigger.node.d.ts.map +1 -1
  305. package/dist/nodes/Salesforce/SalesforceTrigger.node.js +31 -0
  306. package/dist/nodes/Salesforce/SalesforceTrigger.node.js.map +1 -1
  307. package/dist/nodes/Schedule/GenericFunctions.d.ts +2 -1
  308. package/dist/nodes/Schedule/GenericFunctions.d.ts.map +1 -1
  309. package/dist/nodes/Schedule/GenericFunctions.js +43 -0
  310. package/dist/nodes/Schedule/GenericFunctions.js.map +1 -1
  311. package/dist/nodes/Schedule/ScheduleTrigger.node.d.ts.map +1 -1
  312. package/dist/nodes/Schedule/ScheduleTrigger.node.js +2 -1
  313. package/dist/nodes/Schedule/ScheduleTrigger.node.js.map +1 -1
  314. package/dist/nodes/Schedule/SchedulerInterface.d.ts +15 -1
  315. package/dist/nodes/Schedule/SchedulerInterface.d.ts.map +1 -1
  316. package/dist/nodes/Slack/Slack.node.d.ts.map +1 -1
  317. package/dist/nodes/Slack/Slack.node.js +2 -1
  318. package/dist/nodes/Slack/Slack.node.js.map +1 -1
  319. package/dist/nodes/Slack/V2/GenericFunctions.d.ts +12 -0
  320. package/dist/nodes/Slack/V2/GenericFunctions.d.ts.map +1 -1
  321. package/dist/nodes/Slack/V2/GenericFunctions.js +80 -19
  322. package/dist/nodes/Slack/V2/GenericFunctions.js.map +1 -1
  323. package/dist/nodes/Slack/V2/MessageDescription.d.ts.map +1 -1
  324. package/dist/nodes/Slack/V2/MessageDescription.js +137 -0
  325. package/dist/nodes/Slack/V2/MessageDescription.js.map +1 -1
  326. package/dist/nodes/Slack/V2/SlackHitlWebhook.d.ts +1 -1
  327. package/dist/nodes/Slack/V2/SlackV2.node.d.ts.map +1 -1
  328. package/dist/nodes/Slack/V2/SlackV2.node.js +64 -17
  329. package/dist/nodes/Slack/V2/SlackV2.node.js.map +1 -1
  330. package/dist/nodes/Slack/__schema__/v2.7.0/message/search.json +75 -0
  331. package/dist/nodes/Twitter/V2/GenericFunctions.js +1 -1
  332. package/dist/nodes/Twitter/V2/GenericFunctions.js.map +1 -1
  333. package/dist/nodes/Webhook/description.d.ts.map +1 -1
  334. package/dist/nodes/Webhook/description.js +15 -9
  335. package/dist/nodes/Webhook/description.js.map +1 -1
  336. package/dist/types/credentials.json +4 -4
  337. package/dist/types/nodes.json +18 -15
  338. package/package.json +14 -12
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSettings = getSettings;
4
+ exports.manualRunGroupId = manualRunGroupId;
5
+ exports.explainManualRunGroupDenial = explainManualRunGroupDenial;
6
+ exports.toConsumerOptions = toConsumerOptions;
7
+ exports.toEmitterOptions = toEmitterOptions;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const n8n_workflow_1 = require("n8n-workflow");
10
+ const consumer_1 = require("./consumer");
11
+ /** v1's defaults for the consumer settings, from `createConsumerConfig`. v2 is
12
+ * always >= 1.3, so the heartbeat default is 1.3's 10s rather than 3s. */
13
+ const DEFAULT_SESSION_TIMEOUT_MS = 30_000;
14
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 10_000;
15
+ /**
16
+ * The most we may ask for. librdkafka accepts 1..86400000 for
17
+ * `max.poll.interval.ms`, and the library doubles whatever it is given, so half
18
+ * of that ceiling is the limit here.
19
+ *
20
+ * Going over does not fail cleanly: the doubled value overflows the 32-bit int
21
+ * librdkafka stores it in, and the consumer refuses to connect complaining
22
+ * about a negative number nobody chose. Measured against a real broker with a
23
+ * 30 day workflow timeout: `value -1702967296 is outside allowed range
24
+ * 1..86400000`.
25
+ */
26
+ const MAX_REBALANCE_TIMEOUT_MS = 43_200_000;
27
+ /** librdkafka's range for `auto.commit.interval.ms`. 0 turns interval commits off. */
28
+ const MAX_AUTO_COMMIT_INTERVAL_MS = 86_400_000;
29
+ /**
30
+ * Kafka's own guidance, and the ratio both defaults already sit at: a heartbeat
31
+ * every 10s against a 30s session. Three beats fit inside one session, so two
32
+ * can be lost before the broker gives up on the consumer.
33
+ */
34
+ const HEARTBEATS_PER_SESSION = 3;
35
+ /**
36
+ * Keeps the heartbeat frequent enough for the session timeout it is paired with.
37
+ *
38
+ * The two options are independent in the UI but not in Kafka, and getting them
39
+ * wrong fails silently rather than loudly. Lower Session Timeout to 10s and
40
+ * leave the 10s heartbeat default alone, and the first beat lands exactly on the
41
+ * deadline: the broker fences the consumer, the uncommitted offset is lost, and
42
+ * the same message is redelivered forever with no error anywhere. Measured
43
+ * against a real broker: a workflow that takes 5s re-ran the same message every
44
+ * ~10s indefinitely.
45
+ *
46
+ * v1 has the same trap. Clamping is a deliberate improvement over it, and the
47
+ * safe direction is unambiguous, so it is applied rather than only warned about.
48
+ * @param heartbeatInterval - Resolved Heartbeat Interval, in milliseconds
49
+ * @param sessionTimeout - Resolved Session Timeout, in milliseconds
50
+ * @param logger - Warns when the supplied heartbeat had to be lowered
51
+ */
52
+ function heartbeatWithinSession(heartbeatInterval, sessionTimeout, logger) {
53
+ // An unusable session timeout is left to librdkafka to reject by name.
54
+ if (!Number.isFinite(sessionTimeout) || sessionTimeout <= 0)
55
+ return heartbeatInterval;
56
+ const largest = Math.floor(sessionTimeout / HEARTBEATS_PER_SESSION);
57
+ if (Number.isFinite(heartbeatInterval) && heartbeatInterval <= largest) {
58
+ return heartbeatInterval;
59
+ }
60
+ logger?.warn('Kafka Heartbeat Interval lowered to stay under a third of the Session Timeout, so the consumer is not dropped from its group', { supplied: heartbeatInterval, applied: largest, sessionTimeout });
61
+ return largest;
62
+ }
63
+ /**
64
+ * A user-supplied millisecond value, or `undefined` to leave the library's own
65
+ * default in place. Options can come from an expression, so a value that
66
+ * librdkafka would reject is dropped with a warning rather than passed on: it
67
+ * fails the whole connection, and the error names a number nobody typed.
68
+ * @param value - The raw option
69
+ * @param max - Largest value librdkafka accepts
70
+ * @param label - Option name, for the warning
71
+ * @param logger - Warns when a supplied value could not be used
72
+ */
73
+ function millisecondsInRange(value, max, label, logger) {
74
+ if (value === undefined)
75
+ return undefined;
76
+ const usable = Number.isFinite(value) && value >= 0 && value <= max;
77
+ if (!usable) {
78
+ logger?.warn(`Kafka ${label} ignored, outside the range the library accepts`, {
79
+ supplied: value,
80
+ allowed: `0..${max}`,
81
+ });
82
+ return undefined;
83
+ }
84
+ return value;
85
+ }
86
+ /**
87
+ * Reads and resolves every node parameter up front, so the trigger below never
88
+ * touches one directly. The single cast is contained here: a `collection`
89
+ * parameter is untyped at the boundary, and this is the one place that knows
90
+ * its shape.
91
+ */
92
+ function getSettings() {
93
+ const options = this.getNodeParameter('options', {});
94
+ const { executionTimeout } = this.getWorkflowSettings();
95
+ // A manual test run always resolves immediately, as in v1: the editor discards
96
+ // the run once it has its sample, so waiting on an execution that nothing will
97
+ // finish would hold the batch open until close.
98
+ const isManualRun = this.getMode() === 'manual';
99
+ const resolveOffsetMode = isManualRun
100
+ ? 'immediately'
101
+ : // Falls back to the field's own default rather than v1's 'immediately', so
102
+ // an absent value keeps the at-least-once behaviour.
103
+ this.getNodeParameter('resolveOffset', 'onCompletion');
104
+ const configuredGroupId = this.getNodeParameter('groupId');
105
+ return {
106
+ topic: this.getNodeParameter('topic'),
107
+ isManualRun,
108
+ configuredGroupId,
109
+ consumer: toConsumerOptions(
110
+ // Read Messages From Beginning defaults to on, and a manual run's group is
111
+ // brand new, so honouring it would replay the whole topic into the editor.
112
+ // On an activated workflow the setting is moot anyway, since the group
113
+ // already has a committed offset to resume from.
114
+ isManualRun ? { ...options, fromBeginning: false } : options, manualRunGroupId(configuredGroupId, isManualRun), executionTimeout, this.logger),
115
+ emitter: toEmitterOptions(options, resolveOffsetMode, this.getNodeParameter('allowedStatuses', []), executionTimeout),
116
+ parser: options,
117
+ batchSize: options.batchSize,
118
+ // 0 means "all partitions sequentially", which the loop expresses by
119
+ // leaving the key off and taking its own default of 1.
120
+ partitionsConsumedConcurrently: options.partitionsConsumedConcurrently || undefined,
121
+ errorRetryDelay: options.errorRetryDelay,
122
+ };
123
+ }
124
+ /**
125
+ * The consumer group a run joins. A manual run gets a throwaway one.
126
+ *
127
+ * Sharing the configured group with an activated workflow means Kafka splits the
128
+ * partitions between the two, and a test run resolves offsets immediately, so
129
+ * pressing "Listen for test event" would mark messages read that the activated
130
+ * workflow never saw. A group of its own leaves production untouched. v1 has
131
+ * this defect and needs its own fix.
132
+ *
133
+ * The throwaway group is left behind on the broker; Kafka expires an empty group
134
+ * on its own once its retention window passes.
135
+ * @param configured - The node's Group ID parameter
136
+ * @param isManualRun - Whether this is an editor test run
137
+ */
138
+ function manualRunGroupId(configured, isManualRun) {
139
+ return isManualRun ? `${MANUAL_RUN_PREFIX(configured)}${(0, node_crypto_1.randomUUID)()}` : configured;
140
+ }
141
+ /** The part of a manual run's group id that is stable, and so grantable in an ACL. */
142
+ const MANUAL_RUN_PREFIX = (configured) => `${configured}-n8n-manual-`;
143
+ /** Broker rejections that mean the group itself was refused, not the credential. */
144
+ const GROUP_AUTHORIZATION_FAILED = /group authorization failed/i;
145
+ /**
146
+ * Explains a group authorization failure on a manual run, where the group the
147
+ * broker refused is one the user never chose and cannot see.
148
+ *
149
+ * On a cluster with an authorizer, group ACLs are usually granted `LITERAL` on
150
+ * the exact Group ID. The throwaway group is a different resource name, so the
151
+ * join is denied while the activated workflow keeps working: "Listen for test
152
+ * event" fails on its own, and the raw broker message names neither the group
153
+ * nor the fix. A `PREFIXED` ACL on the stable part covers every future test run.
154
+ *
155
+ * Only manual runs are rewritten. On an activated workflow the group is exactly
156
+ * what the user typed, so the broker's own message is already actionable.
157
+ * @param error - The error raised from the library's log stream
158
+ * @param configuredGroupId - The node's Group ID parameter, before the suffix
159
+ * @param isManualRun - Whether this is an editor test run
160
+ */
161
+ function explainManualRunGroupDenial(error, configuredGroupId, isManualRun) {
162
+ if (!isManualRun || !GROUP_AUTHORIZATION_FAILED.test(error.message))
163
+ return error;
164
+ return new n8n_workflow_1.UserError('Kafka refused the consumer group used for a test run', {
165
+ description: `A test run uses a throwaway consumer group so it cannot mark messages read for the activated workflow, and this cluster has not authorized it. Grant a prefixed group ACL for "${MANUAL_RUN_PREFIX(configuredGroupId)}", or run the workflow activated instead of testing it.`,
166
+ cause: error,
167
+ });
168
+ }
169
+ /**
170
+ * Maps the node's options onto the consumer factory.
171
+ *
172
+ * `rebalanceTimeout` is the one value not passed straight through. In this
173
+ * library it also becomes `max.poll.interval.ms`, the deadline to finish one
174
+ * batch before the consumer is dropped from its group, and the library doubles
175
+ * whatever it is given (`_consumer.js:711`). So the workflow's own execution
176
+ * timeout is the deadline we actually want, and it is halved here to survive
177
+ * that doubling, then capped at {@link MAX_REBALANCE_TIMEOUT_MS}. An unbounded
178
+ * workflow timeout (<= 0), or one that is not a usable number, has no deadline
179
+ * to derive from, so the Rebalance Timeout option stands in.
180
+ * @param options - The node's `options` collection
181
+ * @param groupId - The node's consumer group id
182
+ * @param executionTimeoutSeconds - `getWorkflowSettings().executionTimeout`, raw
183
+ * @param logger - Warns when a supplied value could not be used as given
184
+ */
185
+ function toConsumerOptions(options, groupId, executionTimeoutSeconds, logger) {
186
+ // A workflow timeout arrives as a number, but Rebalance Timeout can come from
187
+ // an expression, so neither is trusted to be a usable one.
188
+ const fromWorkflow = typeof executionTimeoutSeconds === 'number' &&
189
+ Number.isFinite(executionTimeoutSeconds) &&
190
+ executionTimeoutSeconds > 0;
191
+ const configured = options.rebalanceTimeout;
192
+ const usableOption = typeof configured === 'number' && Number.isFinite(configured) && configured > 0;
193
+ // Three sources, most specific first.
194
+ //
195
+ // The last one used to be the Rebalance Timeout default, which handed the broker
196
+ // a 10 minute deadline while the emitter was still prepared to wait an hour for
197
+ // the same execution. Anything in between was fenced and redelivered while n8n
198
+ // believed the run still owned it: two of our own defaults disagreeing about one
199
+ // deadline, so they are now the same value by construction.
200
+ let deadlineMs;
201
+ if (fromWorkflow) {
202
+ deadlineMs = executionTimeoutSeconds * 1000;
203
+ }
204
+ else if (usableOption) {
205
+ // No usable workflow timeout, but the user set this deliberately.
206
+ deadlineMs = configured;
207
+ }
208
+ else {
209
+ // Nothing set anywhere, so match how long the emitter will actually wait.
210
+ deadlineMs = consumer_1.DEFAULT_EXECUTION_TIMEOUT_SECONDS * 1000;
211
+ }
212
+ const sessionTimeout = options.sessionTimeout ?? DEFAULT_SESSION_TIMEOUT_MS;
213
+ // librdkafka refuses a `max.poll.interval.ms` below `session.timeout.ms`
214
+ // (`rdkafka_conf.c:4257`, on the classic group protocol we use), and the
215
+ // deadline becomes exactly that. A range check cannot catch it because both
216
+ // values are individually legal. Left alone, a workflow timeout under the 30s
217
+ // session default made the consumer refuse to connect, complaining about two
218
+ // numbers where the user only chose one.
219
+ // An unusable session timeout is left for librdkafka to reject by name, as the
220
+ // heartbeat clamp does. Flooring against it would turn the deadline into NaN
221
+ // and hide the value actually at fault behind a second complaint.
222
+ const sessionUsable = Number.isFinite(sessionTimeout) && sessionTimeout > 0;
223
+ const floored = sessionUsable ? Math.max(deadlineMs, sessionTimeout) : deadlineMs;
224
+ if (floored !== deadlineMs) {
225
+ logger?.warn('Kafka processing deadline raised to the Session Timeout, the shortest the library allows', { requestedMs: deadlineMs, appliedMs: floored, sessionTimeout });
226
+ }
227
+ const wanted = Math.ceil(floored / 2);
228
+ // Capped last: the ceiling exists to stop the doubled value overflowing a
229
+ // 32-bit int, which outranks the floor above. They cannot both bite, since a
230
+ // session timeout large enough to collide is one librdkafka already rejects.
231
+ const rebalanceTimeout = Math.min(wanted, MAX_REBALANCE_TIMEOUT_MS);
232
+ if (rebalanceTimeout !== wanted) {
233
+ logger?.warn('Kafka processing deadline capped at the largest the library accepts, 24 hours', {
234
+ requestedMs: deadlineMs,
235
+ appliedMs: rebalanceTimeout * 2,
236
+ });
237
+ }
238
+ return {
239
+ groupId,
240
+ sessionTimeout,
241
+ heartbeatInterval: heartbeatWithinSession(options.heartbeatInterval ?? DEFAULT_HEARTBEAT_INTERVAL_MS, sessionTimeout, logger),
242
+ rebalanceTimeout,
243
+ maxBytesPerPartition: options.fetchMaxBytes,
244
+ minBytes: options.fetchMinBytes,
245
+ // v1 turns 0 into `null` to mean "no limit". The library has no such
246
+ // sentinel, so leave the key off and let its own default stand.
247
+ maxInFlightRequests: options.maxInFlightRequests || undefined,
248
+ fromBeginning: options.fromBeginning,
249
+ // 0 is a real setting here, not "unset", so it must not go through the
250
+ // falsy-to-undefined treatment maxInFlightRequests gets.
251
+ autoCommitInterval: millisecondsInRange(options.autoCommitInterval, MAX_AUTO_COMMIT_INTERVAL_MS, 'Auto Commit Interval', logger),
252
+ };
253
+ }
254
+ /**
255
+ * Maps the node's options and offset settings onto the emitter.
256
+ *
257
+ * `executionTimeoutSeconds` is passed through raw: n8n treats <= 0 as
258
+ * explicitly unbounded, and the emitter handles that. Coercing it to a default
259
+ * here would reintroduce a deadline the user switched off.
260
+ * @param options - The node's `options` collection
261
+ * @param resolveOffsetMode - Already resolved, including the manual-mode override
262
+ * @param allowedStatuses - Only meaningful when the mode is `onStatus`
263
+ * @param executionTimeoutSeconds - `getWorkflowSettings().executionTimeout`, raw
264
+ */
265
+ function toEmitterOptions(options, resolveOffsetMode, allowedStatuses, executionTimeoutSeconds) {
266
+ return {
267
+ resolveOffsetMode,
268
+ allowedStatuses,
269
+ executionTimeoutSeconds,
270
+ errorRetryDelay: options.errorRetryDelay,
271
+ };
272
+ }
273
+ //# sourceMappingURL=TriggerSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerSettings.js","sourceRoot":"","sources":["../../../../nodes/Kafka/v2/TriggerSettings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { KafkaJS } from '@confluentinc/kafka-javascript';
2
+ import type { Logger } from 'n8n-workflow';
3
+ import type { DataEmitter } from './DataEmitter';
4
+ import type { KafkaMessageParser } from './MessageParser';
5
+ export interface ConsumeTopicOptions {
6
+ topic: string;
7
+ parseMessage: KafkaMessageParser;
8
+ /** Starts an execution and reports whether its offsets may advance. */
9
+ emit: DataEmitter;
10
+ logger: Logger;
11
+ /** Messages per execution. Defaults to {@link DEFAULT_BATCH_SIZE}. */
12
+ batchSize?: number;
13
+ /** Defaults to {@link DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY}. */
14
+ partitionsConsumedConcurrently?: number;
15
+ /**
16
+ * How long to wait before letting a failed chunk be re-delivered. The node
17
+ * maps v1's existing "Retry Delay on Error" option onto this; v1 applies it
18
+ * only to failed offset resolution, so the parse path was unpaced.
19
+ */
20
+ errorRetryDelay?: number;
21
+ }
22
+ export interface KafkaConsumerHandle {
23
+ /** Disconnects the consumer. ENT-226 verifies this against a real broker. */
24
+ close: () => Promise<void>;
25
+ }
26
+ /**
27
+ * Messages handed to one execution. v1's Batch Size default, and the reason the
28
+ * library's batch is chunked rather than emitted whole: at 1 each message starts
29
+ * its own execution.
30
+ */
31
+ export declare const DEFAULT_BATCH_SIZE = 1;
32
+ /**
33
+ * Partitions processed in parallel.
34
+ *
35
+ * The library defaults this to 1 when the key is absent, but it checks with
36
+ * `Object.hasOwn`, so passing the key with an explicit `undefined` skips that
37
+ * default and later fails in `Math.min(undefined, …)`. Never forward a
38
+ * possibly-undefined user value straight through; resolve it to a number first.
39
+ */
40
+ export declare const DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 1;
41
+ /**
42
+ * Connects, subscribes, and runs the consume loop.
43
+ *
44
+ * Automatic progress-saving is off, matching v1: the loop resolves offsets chunk
45
+ * by chunk, and anything it does not resolve is re-delivered. So a failure part
46
+ * way through a batch leaves the earlier chunks done rather than replaying them.
47
+ * @param consumer - An unconnected consumer from `transport/consumer`
48
+ * @param options - Topic, parser, emitter, and the chunking settings
49
+ */
50
+ export declare function consumeTopic(consumer: KafkaJS.Consumer, options: ConsumeTopicOptions): Promise<KafkaConsumerHandle>;
51
+ //# sourceMappingURL=ConsumeTopic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsumeTopic.d.ts","sourceRoot":"","sources":["../../../../../nodes/Kafka/v2/consumer/ConsumeTopic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAO1D,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,kBAAkB,CAAC;IACjC,uEAAuE;IACvE,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAgCD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;GAOG;AACH,eAAO,MAAM,wCAAwC,IAAI,CAAC;AAM1D;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAC1B,OAAO,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAoE9B"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = exports.DEFAULT_BATCH_SIZE = void 0;
4
+ exports.consumeTopic = consumeTopic;
5
+ const sleep_1 = require("@n8n/utils/sleep");
6
+ const utils_1 = require("../../utils");
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ /** Bounds teardown so a hung broker request cannot block deactivation, as in v1. */
11
+ const CLOSE_TIMEOUT_MS = 30_000;
12
+ /**
13
+ * Messages handed to one execution. v1's Batch Size default, and the reason the
14
+ * library's batch is chunked rather than emitted whole: at 1 each message starts
15
+ * its own execution.
16
+ */
17
+ exports.DEFAULT_BATCH_SIZE = 1;
18
+ /**
19
+ * Partitions processed in parallel.
20
+ *
21
+ * The library defaults this to 1 when the key is absent, but it checks with
22
+ * `Object.hasOwn`, so passing the key with an explicit `undefined` skips that
23
+ * default and later fails in `Math.min(undefined, …)`. Never forward a
24
+ * possibly-undefined user value straight through; resolve it to a number first.
25
+ */
26
+ exports.DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY = 1;
27
+ // ---------------------------------------------------------------------------
28
+ // Entry point
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Connects, subscribes, and runs the consume loop.
32
+ *
33
+ * Automatic progress-saving is off, matching v1: the loop resolves offsets chunk
34
+ * by chunk, and anything it does not resolve is re-delivered. So a failure part
35
+ * way through a batch leaves the earlier chunks done rather than replaying them.
36
+ * @param consumer - An unconnected consumer from `transport/consumer`
37
+ * @param options - Topic, parser, emitter, and the chunking settings
38
+ */
39
+ async function consumeTopic(consumer, options) {
40
+ const { topic, parseMessage, emit, logger } = options;
41
+ const settings = resolveSettings(options);
42
+ const closeController = new AbortController();
43
+ const { signal } = closeController;
44
+ // Turns "we are closing" into something a wait can race against, since you can
45
+ // race a promise but not a signal. It only ever resolves: the loser of a race
46
+ // is abandoned, and an abandoned rejection gets reported as unhandled.
47
+ const closed = new Promise((resolve) => {
48
+ // The abort event fires once. If it already fired, no listener would run.
49
+ if (signal.aborted)
50
+ return resolve();
51
+ signal.addEventListener('abort', () => resolve(), { once: true });
52
+ });
53
+ /** Paces a re-delivery, unless teardown is already waiting. */
54
+ const pauseBeforeRetry = async () => {
55
+ if (signal.aborted)
56
+ return;
57
+ await Promise.race([(0, sleep_1.sleep)(settings.errorRetryDelay), closed]);
58
+ };
59
+ const context = {
60
+ ...settings,
61
+ parseMessage,
62
+ emit,
63
+ logger,
64
+ signal,
65
+ pauseBeforeRetry,
66
+ };
67
+ try {
68
+ await consumer.connect();
69
+ await consumer.subscribe({ topics: [topic] });
70
+ await consumer.run({
71
+ partitionsConsumedConcurrently: settings.partitionsConsumedConcurrently,
72
+ // Off, as in v1: processBatch decides what counts as read. Leaving it on
73
+ // would mark a whole batch done the moment the callback returns, including
74
+ // messages no execution ever saw.
75
+ eachBatchAutoResolve: false,
76
+ eachBatch: async (payload) => await processBatch(payload, context),
77
+ });
78
+ }
79
+ catch (error) {
80
+ // Nothing else holds this consumer yet, so a failed start must not leave the
81
+ // broker connection open. `connect()` is inside the try for symmetry rather
82
+ // than because it leaks: the library marks a failed connect as disconnected
83
+ // before rejecting, so disconnect() is a no-op on that path today.
84
+ try {
85
+ await consumer.disconnect();
86
+ }
87
+ catch {
88
+ // The start failure is the useful one; a failing disconnect must not mask it.
89
+ }
90
+ throw error;
91
+ }
92
+ return {
93
+ close: async () => {
94
+ closeController.abort();
95
+ // The library's `stop()` is not implemented, so disconnect is the only lever.
96
+ // Bounded, so a hung broker cannot keep a superseded consumer in the group.
97
+ await (0, utils_1.withTimeout)(consumer.disconnect(), CLOSE_TIMEOUT_MS, 'Kafka consumer did not disconnect in time');
98
+ },
99
+ };
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // The batch loop
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * Walks one library batch in chunks, handing each to a workflow and advancing
106
+ * the read position only once that workflow permits it.
107
+ *
108
+ * Stopping early is always safe: whatever is left unresolved is re-delivered.
109
+ * That is how a close, a rebalance and a failure all end up doing the right
110
+ * thing without any of them needing to undo work.
111
+ */
112
+ async function processBatch({ batch, resolveOffset, commitOffsetsIfNecessary, isRunning, isStale }, context) {
113
+ const { batchSize, parseMessage, emit, logger, signal, pauseBeforeRetry } = context;
114
+ const { messages } = batch;
115
+ for (let i = 0; i < messages.length; i += batchSize) {
116
+ // Stop if the trigger is closing, the consumer stopped, or the partition
117
+ // was revoked. Unresolved offsets are re-delivered, so stopping here
118
+ // loses nothing.
119
+ if (signal.aborted || !isRunning() || isStale()) {
120
+ logger.debug('Kafka batch interrupted by close, rebalance or consumer stop');
121
+ return;
122
+ }
123
+ const chunk = messages.slice(i, Math.min(i + batchSize, messages.length));
124
+ let items;
125
+ try {
126
+ items = await Promise.all(chunk.map(async (message) => await parseMessage(message, batch.topic)));
127
+ }
128
+ catch (error) {
129
+ // Coordinates included: this message is now re-read indefinitely, and
130
+ // the log is the only way to find which one it is.
131
+ logger.error('Kafka chunk could not be parsed, leaving it unresolved', {
132
+ error,
133
+ topic: batch.topic,
134
+ partition: batch.partition,
135
+ offset: chunk[0]?.offset,
136
+ });
137
+ await pauseBeforeRetry();
138
+ return;
139
+ }
140
+ if (!(await emit(items)).mayAdvance) {
141
+ logger.warn('Kafka chunk was not processed, leaving it unresolved');
142
+ return;
143
+ }
144
+ const lastMessage = chunk[chunk.length - 1];
145
+ if (lastMessage) {
146
+ resolveOffset(lastMessage.offset);
147
+ await commitOffsetsIfNecessary();
148
+ }
149
+ }
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Helpers
153
+ // ---------------------------------------------------------------------------
154
+ /** Fills in every optional, so the loop only ever sees usable values. */
155
+ function resolveSettings(options) {
156
+ const { logger } = options;
157
+ return {
158
+ batchSize: positiveCount(options.batchSize, exports.DEFAULT_BATCH_SIZE, 'Batch Size', logger),
159
+ partitionsConsumedConcurrently: positiveCount(options.partitionsConsumedConcurrently, exports.DEFAULT_PARTITIONS_CONSUMED_CONCURRENTLY, 'Parallel Processing', logger),
160
+ errorRetryDelay: (0, utils_1.resolveRetryDelay)(options.errorRetryDelay, logger),
161
+ };
162
+ }
163
+ /**
164
+ * A whole number of at least one, or the fallback when the value cannot be used
165
+ * as a count. Anything unusable takes the same path: not a number, not finite,
166
+ * or below one.
167
+ *
168
+ * Both callers feed either a loop increment or a library config key, where `NaN`
169
+ * does more damage than a merely wrong number. It slips past `??` because it is
170
+ * not `undefined`, and past `Math.max` because every comparison with `NaN` is
171
+ * false, and then quietly produces empty chunks or a broken worker count. A node
172
+ * option can arrive as `NaN` from an expression that did not evaluate to a
173
+ * number.
174
+ * @param name - The option's user-facing name, for the warning
175
+ * @param logger - Warns when a supplied value had to be replaced. A missing
176
+ * value is not a misconfiguration, so it falls back quietly. A fractional one
177
+ * is truncated rather than replaced, which needs no warning either.
178
+ */
179
+ function positiveCount(value, fallback, name, logger) {
180
+ if (value === undefined)
181
+ return fallback;
182
+ const whole = typeof value === 'number' ? Math.trunc(value) : Number.NaN;
183
+ if (!Number.isFinite(whole) || whole < 1) {
184
+ logger.warn(`Kafka "${name}" of ${String(value)} cannot be used, falling back to ${fallback}`);
185
+ return fallback;
186
+ }
187
+ return whole;
188
+ }
189
+ //# sourceMappingURL=ConsumeTopic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsumeTopic.js","sourceRoot":"","sources":["../../../../../nodes/Kafka/v2/consumer/ConsumeTopic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { INodeExecutionData, ITriggerFunctions } from 'n8n-workflow';
2
+ /** When a message's read position is recorded as done. Mirrors v1.3's option. */
3
+ export type ResolveOffsetMode = 'immediately' | 'onCompletion' | 'onSuccess' | 'onStatus';
4
+ /** Whether the caller may advance past the chunk it just handed over. */
5
+ export interface OffsetVerdict {
6
+ readonly mayAdvance: boolean;
7
+ }
8
+ export type DataEmitter = (items: INodeExecutionData[]) => Promise<OffsetVerdict>;
9
+ /**
10
+ * The slice of the trigger context the emitter needs, so it can be exercised
11
+ * without a node.
12
+ */
13
+ export type DataEmitterContext = Pick<ITriggerFunctions, 'emit' | 'logger' | 'getNode'> & {
14
+ helpers: Pick<ITriggerFunctions['helpers'], 'createDeferredPromise'>;
15
+ };
16
+ export interface DataEmitterOptions {
17
+ resolveOffsetMode: ResolveOffsetMode;
18
+ /** Required when the mode is `onStatus`. */
19
+ allowedStatuses?: string[];
20
+ /** Seconds an execution may run before the wait is abandoned. */
21
+ executionTimeoutSeconds?: number;
22
+ errorRetryDelay?: number;
23
+ }
24
+ /**
25
+ * The wait an absent workflow execution timeout falls back to. Exported because
26
+ * the consumer's processing deadline has to agree with it: if the emitter waits
27
+ * an hour for an execution the broker fenced ten minutes in, the message is
28
+ * redelivered while n8n still thinks the run owns it.
29
+ */
30
+ export declare const DEFAULT_EXECUTION_TIMEOUT_SECONDS = 3600;
31
+ /**
32
+ * Builds the function that starts an execution for a chunk of items and decides
33
+ * whether its offsets may advance. `mayAdvance: false` means the caller must not
34
+ * record the chunk as done, so Kafka delivers it again.
35
+ *
36
+ * `immediately` never waits, which is at-most-once. The other three wait for the
37
+ * execution and are at-least-once. This mirrors v1's `configureDataEmitter`,
38
+ * with the mode and its inputs resolved by the caller rather than read from node
39
+ * parameters here.
40
+ * @param ctx - Trigger context used to emit and log
41
+ * @param options - Resolved offset mode and its inputs
42
+ * @param closeSignal - Aborted on teardown, so a wait never outlives the trigger
43
+ */
44
+ export declare function createDataEmitter(ctx: DataEmitterContext, options: DataEmitterOptions, closeSignal: AbortSignal): DataEmitter;
45
+ //# sourceMappingURL=DataEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataEmitter.d.ts","sourceRoot":"","sources":["../../../../../nodes/Kafka/v2/consumer/DataEmitter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAQ,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAShF,iFAAiF;AACjF,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC;AAE1F,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAElF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG;IACzF,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,uBAAuB,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,WAAW,kBAAkB;IAClC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,iEAAiE;IACjE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAatD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,kBAAkB,EACvB,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,WAAW,GACtB,WAAW,CAIb"}