n8n-nodes-msteams-botframework 1.2.11 → 1.2.13

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.
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MsTeamsBotFrameworkTrigger = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const botbuilder_1 = require("botbuilder");
4
6
  // Track processed activity IDs to prevent duplicates
5
7
  const processedActivities = new Map();
6
8
  // Clean up old entries every 5 minutes
@@ -183,109 +185,136 @@ class MsTeamsBotFrameworkTrigger {
183
185
  };
184
186
  }
185
187
  async webhook() {
186
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
188
+ const credentials = await this.getCredentials('msTeamsBotFrameworkApi');
187
189
  const req = this.getRequestObject();
188
190
  const events = this.getNodeParameter('events', []);
189
191
  const options = this.getNodeParameter('options', {});
190
- // Get the activity directly from request body
191
- const activity = req.body;
192
- // Check for duplicate activity
193
- const activityKey = `${activity.id}_${activity.timestamp}`;
194
- if (processedActivities.has(activityKey)) {
195
- // Already processed this activity, return 200 OK but don't trigger workflow
196
- return {
197
- webhookResponse: { status: 'ok' },
198
- };
199
- }
200
- // Check if we should process this activity type
201
- if (!events.includes(activity.type)) {
202
- return {
203
- webhookResponse: { status: 'ok' },
204
- };
205
- }
206
- // Ignore bot messages if configured
207
- if (options.ignoreBotMessages && ((_a = activity.from) === null || _a === void 0 ? void 0 : _a.role) === 'bot') {
208
- return {
209
- webhookResponse: { status: 'ok' },
210
- };
211
- }
212
- // Mark this activity as processed
213
- processedActivities.set(activityKey, Date.now());
214
- // Extract useful data from activity
215
- const activityData = {
216
- type: activity.type,
217
- text: activity.text,
218
- timestamp: activity.timestamp,
219
- id: activity.id,
220
- conversation: {
221
- id: (_b = activity.conversation) === null || _b === void 0 ? void 0 : _b.id,
222
- name: (_c = activity.conversation) === null || _c === void 0 ? void 0 : _c.name,
223
- conversationType: (_d = activity.conversation) === null || _d === void 0 ? void 0 : _d.conversationType,
224
- tenantId: (_e = activity.conversation) === null || _e === void 0 ? void 0 : _e.tenantId,
225
- },
226
- from: {
227
- id: (_f = activity.from) === null || _f === void 0 ? void 0 : _f.id,
228
- name: (_g = activity.from) === null || _g === void 0 ? void 0 : _g.name,
229
- aadObjectId: (_h = activity.from) === null || _h === void 0 ? void 0 : _h.aadObjectId,
230
- role: (_j = activity.from) === null || _j === void 0 ? void 0 : _j.role,
231
- },
232
- recipient: {
233
- id: (_k = activity.recipient) === null || _k === void 0 ? void 0 : _k.id,
234
- name: (_l = activity.recipient) === null || _l === void 0 ? void 0 : _l.name,
235
- },
236
- channelId: activity.channelId,
237
- serviceUrl: activity.serviceUrl,
238
- locale: activity.locale,
239
- };
240
- // Add type-specific data
241
- switch (activity.type) {
242
- case 'message':
243
- activityData.message = {
244
- text: activity.text,
245
- textFormat: activity.textFormat,
246
- attachments: activity.attachments,
247
- mentions: (_m = activity.entities) === null || _m === void 0 ? void 0 : _m.filter((e) => e.type === 'mention'),
248
- };
249
- break;
250
- case 'conversationUpdate':
251
- activityData.conversationUpdate = {
252
- membersAdded: activity.membersAdded,
253
- membersRemoved: activity.membersRemoved,
254
- };
255
- break;
256
- case 'messageReaction':
257
- activityData.messageReaction = {
258
- reactionsAdded: activity.reactionsAdded,
259
- reactionsRemoved: activity.reactionsRemoved,
260
- replyToId: activity.replyToId,
261
- };
262
- break;
263
- case 'messageUpdate':
264
- activityData.messageUpdate = {
192
+ const appId = credentials.appId;
193
+ const appPassword = credentials.appPassword;
194
+ // Create Bot Framework Adapter
195
+ const adapter = new botbuilder_1.BotFrameworkAdapter({
196
+ appId,
197
+ appPassword,
198
+ });
199
+ // Process the incoming activity
200
+ let activityData = null;
201
+ let shouldTrigger = false;
202
+ try {
203
+ await adapter.processActivity(req, req.res, async (context) => {
204
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
205
+ const activity = context.activity;
206
+ // Check for duplicate activity
207
+ const activityKey = `${activity.id}_${activity.timestamp}`;
208
+ if (processedActivities.has(activityKey)) {
209
+ // Already processed this activity, skip
210
+ shouldTrigger = false;
211
+ return;
212
+ }
213
+ // Check if we should process this activity type
214
+ if (!events.includes(activity.type)) {
215
+ shouldTrigger = false;
216
+ return;
217
+ }
218
+ // Ignore bot messages if configured
219
+ if (options.ignoreBotMessages && ((_a = activity.from) === null || _a === void 0 ? void 0 : _a.role) === 'bot') {
220
+ shouldTrigger = false;
221
+ return;
222
+ }
223
+ // Mark this activity as processed
224
+ processedActivities.set(activityKey, Date.now());
225
+ shouldTrigger = true;
226
+ // Send typing indicator if auto reply is enabled
227
+ if (options.autoReply && activity.type === 'message') {
228
+ await context.sendActivity({ type: 'typing' });
229
+ }
230
+ // Extract useful data from activity
231
+ activityData = {
232
+ type: activity.type,
265
233
  text: activity.text,
266
- updatedText: activity.text,
234
+ timestamp: activity.timestamp,
235
+ id: activity.id,
236
+ conversation: {
237
+ id: (_b = activity.conversation) === null || _b === void 0 ? void 0 : _b.id,
238
+ name: (_c = activity.conversation) === null || _c === void 0 ? void 0 : _c.name,
239
+ conversationType: (_d = activity.conversation) === null || _d === void 0 ? void 0 : _d.conversationType,
240
+ tenantId: (_e = activity.conversation) === null || _e === void 0 ? void 0 : _e.tenantId,
241
+ },
242
+ from: {
243
+ id: (_f = activity.from) === null || _f === void 0 ? void 0 : _f.id,
244
+ name: (_g = activity.from) === null || _g === void 0 ? void 0 : _g.name,
245
+ aadObjectId: (_h = activity.from) === null || _h === void 0 ? void 0 : _h.aadObjectId,
246
+ role: (_j = activity.from) === null || _j === void 0 ? void 0 : _j.role,
247
+ },
248
+ recipient: {
249
+ id: (_k = activity.recipient) === null || _k === void 0 ? void 0 : _k.id,
250
+ name: (_l = activity.recipient) === null || _l === void 0 ? void 0 : _l.name,
251
+ },
252
+ channelId: activity.channelId,
253
+ serviceUrl: activity.serviceUrl,
254
+ locale: activity.locale,
267
255
  };
268
- break;
269
- case 'messageDelete':
270
- activityData.messageDelete = {
271
- deletedMessageId: activity.id,
256
+ // Add type-specific data
257
+ switch (activity.type) {
258
+ case 'message':
259
+ activityData.message = {
260
+ text: activity.text,
261
+ textFormat: activity.textFormat,
262
+ attachments: activity.attachments,
263
+ mentions: (_m = activity.entities) === null || _m === void 0 ? void 0 : _m.filter((e) => e.type === 'mention'),
264
+ };
265
+ break;
266
+ case 'conversationUpdate':
267
+ activityData.conversationUpdate = {
268
+ membersAdded: activity.membersAdded,
269
+ membersRemoved: activity.membersRemoved,
270
+ };
271
+ break;
272
+ case 'messageReaction':
273
+ activityData.messageReaction = {
274
+ reactionsAdded: activity.reactionsAdded,
275
+ reactionsRemoved: activity.reactionsRemoved,
276
+ replyToId: activity.replyToId,
277
+ };
278
+ break;
279
+ case 'messageUpdate':
280
+ activityData.messageUpdate = {
281
+ text: activity.text,
282
+ updatedText: activity.text,
283
+ };
284
+ break;
285
+ case 'messageDelete':
286
+ activityData.messageDelete = {
287
+ deletedMessageId: activity.id,
288
+ };
289
+ break;
290
+ }
291
+ // Include raw activity if requested
292
+ if (options.includeRawActivity) {
293
+ activityData.rawActivity = activity;
294
+ }
295
+ });
296
+ if (!shouldTrigger || !activityData) {
297
+ // Don't trigger workflow - Bot Framework Adapter already sent 200 OK
298
+ return {
299
+ noWebhookResponse: true,
272
300
  };
273
- break;
301
+ }
302
+ // Return the activity data to the workflow
303
+ return {
304
+ workflowData: [
305
+ [
306
+ {
307
+ json: activityData,
308
+ },
309
+ ],
310
+ ],
311
+ };
274
312
  }
275
- // Include raw activity if requested
276
- if (options.includeRawActivity) {
277
- activityData.rawActivity = activity;
313
+ catch (error) {
314
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to process Teams webhook: ${error.message}`, {
315
+ description: error.message,
316
+ });
278
317
  }
279
- // Return the activity data to the workflow
280
- return {
281
- workflowData: [
282
- [
283
- {
284
- json: activityData,
285
- },
286
- ],
287
- ],
288
- };
289
318
  }
290
319
  }
291
320
  exports.MsTeamsBotFrameworkTrigger = MsTeamsBotFrameworkTrigger;
package/package.json CHANGED
@@ -1,64 +1,64 @@
1
- {
2
- "name": "n8n-nodes-msteams-botframework",
3
- "version": "1.2.11",
4
- "description": "n8n node for MS Teams Azure Bot Framework",
5
- "keywords": [
6
- "n8n-community-node-package",
7
- "n8n",
8
- "msteams",
9
- "microsoft teams",
10
- "bot framework",
11
- "azure"
12
- ],
13
- "license": "MIT",
14
- "homepage": "https://weon.vn",
15
- "author": {
16
- "name": "Weon Software",
17
- "email": "doannv@weon.vn"
18
- },
19
- "repository": {
20
- "type": "git",
21
- "url": "https://github.com/weonVN/n8n-nodes-msteams-botframework.git"
22
- },
23
- "main": "index.js",
24
- "scripts": {
25
- "build": "tsc && gulp build:icons",
26
- "dev": "tsc --watch",
27
- "format": "prettier nodes credentials --write",
28
- "lint": "eslint nodes credentials package.json",
29
- "lintfix": "eslint nodes credentials package.json --fix",
30
- "prepublishOnly": "npm run build"
31
- },
32
- "files": [
33
- "dist"
34
- ],
35
- "n8n": {
36
- "n8nNodesApiVersion": 1,
37
- "credentials": [
38
- "dist/credentials/MsTeamsBotFrameworkApi.credentials.js"
39
- ],
40
- "nodes": [
41
- "dist/nodes/MsTeamsBotFramework/MsTeamsBotFramework.node.js",
42
- "dist/nodes/MsTeamsBotFramework/MsTeamsBotFrameworkTrigger.node.js",
43
- "dist/nodes/MsTeamsBotFramework/MsTeamsAIBot.node.js"
44
- ]
45
- },
46
- "devDependencies": {
47
- "@types/express": "^4.17.6",
48
- "@types/node": "^18.16.0",
49
- "@typescript-eslint/parser": "^5.59.0",
50
- "eslint": "^8.39.0",
51
- "eslint-plugin-n8n-nodes-base": "^1.12.0",
52
- "gulp": "^4.0.2",
53
- "n8n-workflow": "^1.0.0",
54
- "prettier": "^2.8.8",
55
- "typescript": "^5.0.4"
56
- },
57
- "peerDependencies": {
58
- "n8n-workflow": "*"
59
- },
60
- "dependencies": {
61
- "botbuilder": "^4.20.0",
62
- "axios": "^1.6.0"
63
- }
64
- }
1
+ {
2
+ "name": "n8n-nodes-msteams-botframework",
3
+ "version": "1.2.13",
4
+ "description": "n8n node for MS Teams Azure Bot Framework",
5
+ "keywords": [
6
+ "n8n-community-node-package",
7
+ "n8n",
8
+ "msteams",
9
+ "microsoft teams",
10
+ "bot framework",
11
+ "azure"
12
+ ],
13
+ "license": "MIT",
14
+ "homepage": "https://weon.vn",
15
+ "author": {
16
+ "name": "Weon Software",
17
+ "email": "doannv@weon.vn"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://github.com/weon-software/n8n-nodes-msteams-botframework.git"
22
+ },
23
+ "main": "index.js",
24
+ "scripts": {
25
+ "build": "tsc && gulp build:icons",
26
+ "dev": "tsc --watch",
27
+ "format": "prettier nodes credentials --write",
28
+ "lint": "eslint nodes credentials package.json",
29
+ "lintfix": "eslint nodes credentials package.json --fix",
30
+ "prepublishOnly": "npm run build"
31
+ },
32
+ "files": [
33
+ "dist"
34
+ ],
35
+ "n8n": {
36
+ "n8nNodesApiVersion": 1,
37
+ "credentials": [
38
+ "dist/credentials/MsTeamsBotFrameworkApi.credentials.js"
39
+ ],
40
+ "nodes": [
41
+ "dist/nodes/MsTeamsBotFramework/MsTeamsBotFramework.node.js",
42
+ "dist/nodes/MsTeamsBotFramework/MsTeamsBotFrameworkTrigger.node.js",
43
+ "dist/nodes/MsTeamsBotFramework/MsTeamsAIBot.node.js"
44
+ ]
45
+ },
46
+ "devDependencies": {
47
+ "@types/express": "^4.17.6",
48
+ "@types/node": "^22.10.0",
49
+ "@typescript-eslint/parser": "^8.18.0",
50
+ "eslint": "^8.57.0",
51
+ "eslint-plugin-n8n-nodes-base": "^1.16.0",
52
+ "gulp": "^5.0.0",
53
+ "n8n-workflow": "~2.2.2",
54
+ "prettier": "^3.4.0",
55
+ "typescript": "~5.7.0"
56
+ },
57
+ "peerDependencies": {
58
+ "n8n-workflow": ">=2.0.0"
59
+ },
60
+ "dependencies": {
61
+ "botbuilder": "^4.20.0",
62
+ "axios": "^1.6.0"
63
+ }
64
+ }