@hubot-friends/hubot-slack 3.4.0 → 3.6.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hubot-friends/hubot-slack",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "A new Slack adapter for Hubot",
5
5
  "homepage": "https://github.com/hubot-friends/hubot-slack#readme",
6
6
  "main": "./index.mjs",
@@ -8,7 +8,7 @@
8
8
  "test": "node --test",
9
9
  "test:watch": "node --test --watch",
10
10
  "test:integration": "node --test --env-file=.env",
11
- "start:local": "node --watch --env-file=.env node_modules/hubot/bin/hubot --adapter ../../../index.mjs --name jbot"
11
+ "start:local": "node --watch --env-file=.env node_modules/hubot/bin/hubot --adapter ../../../index.mjs --name gbot"
12
12
  },
13
13
  "keywords": [
14
14
  "hubot",
@@ -25,15 +25,15 @@
25
25
  "url": "https://github.com/hubot-friends/hubot-slack/issues"
26
26
  },
27
27
  "dependencies": {
28
- "@slack/socket-mode": "^1.3.2",
28
+ "@slack/socket-mode": "^2.0.4",
29
29
  "@slack/web-api": "^6.11.2"
30
30
  },
31
- "peerDependencies": {
32
- "hubot": "^11.6.0"
33
- },
34
31
  "engines": {
35
32
  "node": ">= 18"
36
33
  },
34
+ "peerDependencies": {
35
+ "hubot": "^12.0.0"
36
+ },
37
37
  "devDependencies": {
38
38
  "pino-pretty": "^10.0.1"
39
39
  },
package/src/Bot.mjs CHANGED
@@ -31,7 +31,7 @@ class SlackClient {
31
31
 
32
32
  // Event handling
33
33
  // NOTE: add channel join and leave events
34
- this.socket.on('authenticated', this.eventWrapper, this);
34
+ this.socket.on("authenticated", this.eventWrapper, this);
35
35
  this.socket.on("message", this.eventWrapper, this);
36
36
  this.socket.on("reaction_added", this.eventWrapper, this);
37
37
  this.socket.on("reaction_removed", this.eventWrapper, this);
@@ -203,8 +203,7 @@ class SlackBot extends Adapter {
203
203
  }
204
204
 
205
205
  this.client.socket.on("open", this.open.bind(this));
206
- this.client.socket.on("close", this.close.bind(this));
207
- this.client.socket.on("disconnect", this.disconnect.bind(this));
206
+ this.client.socket.on("close", this.onSocketClose.bind(this));
208
207
  this.client.socket.on("error", this.error.bind(this));
209
208
  this.client.socket.on("authenticated", this.authenticated.bind(this));
210
209
  this.client.onEvent(this.eventHandler.bind(this));
@@ -358,16 +357,23 @@ class SlackBot extends Adapter {
358
357
  * Slack client has closed the connection
359
358
  * @private
360
359
  */
361
- close() {
362
- // NOTE: not confident that @options.autoReconnect works
363
- if (this.options.autoReconnect) {
360
+ onSocketClose() {
361
+ if (this.socket.autoReconnectEnabled && !this.socket.shuttingDown) {
364
362
  this.robot.logger.info("Disconnected from Slack Socket");
365
363
  return this.robot.logger.info("Waiting for reconnect...");
366
364
  } else {
367
- return this.disconnect();
365
+ return this.robot.logger.info("Disconnected from Slack Socket");
368
366
  }
369
367
  }
370
368
 
369
+ /**
370
+ * Close the connection
371
+ * @private
372
+ */
373
+ close() {
374
+ this.disconnect();
375
+ }
376
+
371
377
  /**
372
378
  * Slack client has closed the connection and will not reconnect
373
379
  * @private
package/test/Bot.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { describe, it, beforeEach } from 'node:test'
1
+ import { describe, it, beforeEach, mock } from 'node:test'
2
2
  import assert from 'node:assert/strict'
3
3
  import { SlackBot } from '../src/Bot.mjs'
4
4
  import hubotSlackMock from '../index.mjs'
@@ -76,6 +76,65 @@ describe('Authenticate', () => {
76
76
  })
77
77
  })
78
78
 
79
+ describe('Socket', () => {
80
+ let stubs, slackbot
81
+ beforeEach(async () => {
82
+ ({stubs, slackbot} = (await import('./Stubs.mjs')).default())
83
+ slackbot.socket.disconnect = mock.fn(() => {
84
+ slackbot.socket.shuttingDown = true
85
+ slackbot.socket.emit('close')
86
+ })
87
+ })
88
+
89
+ it('Should socket.disconnect() once', async () => {
90
+ slackbot.socket.autoReconnectEnabled = false
91
+
92
+ await slackbot.run()
93
+ await slackbot.socket.disconnect()
94
+ assert.equal(slackbot.socket.disconnect.mock.callCount(), 1)
95
+ })
96
+
97
+ it('Should log socket close event when we call socket.disconnect()', async () => {
98
+ const { logger } = slackbot.robot
99
+
100
+ slackbot.socket.autoReconnectEnabled = true
101
+
102
+ await slackbot.run()
103
+ await slackbot.socket.disconnect()
104
+ assert.deepEqual(logger.logs.info.slice(-1), ['Disconnected from Slack Socket'])
105
+ })
106
+
107
+ it('Should log waiting for reconnect on socket close event', async () => {
108
+ const { logger } = slackbot.robot
109
+ // Skip socket.disconnect() because it overrides automatic reconnect
110
+ slackbot.socket.websocket = {
111
+ disconnect: mock.fn(() => {
112
+ slackbot.socket.emit('close')
113
+ })
114
+ }
115
+ slackbot.socket.autoReconnectEnabled = true
116
+
117
+ await slackbot.run()
118
+ await slackbot.socket.websocket.disconnect()
119
+ assert.deepEqual(logger.logs.info.slice(-2), ['Disconnected from Slack Socket', 'Waiting for reconnect...'])
120
+ })
121
+
122
+ it('Should log socket close event', async () => {
123
+ const { logger } = slackbot.robot
124
+ // Skip socket.disconnect() because it overrides automatic reconnect
125
+ slackbot.socket.websocket = {
126
+ disconnect: mock.fn(() => {
127
+ slackbot.socket.emit('close')
128
+ })
129
+ }
130
+ slackbot.socket.autoReconnectEnabled = false
131
+
132
+ await slackbot.run()
133
+ await slackbot.socket.websocket.disconnect()
134
+ assert.deepEqual(logger.logs.info.slice(-1), ['Disconnected from Slack Socket'])
135
+ })
136
+ })
137
+
79
138
  describe('Logger', () => {
80
139
  let stubs, slackbot
81
140
  beforeEach(async () => {