unleash-server 5.3.4 → 5.3.5
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.
|
@@ -10,14 +10,10 @@ export default class SlackAppAddon extends Addon {
|
|
|
10
10
|
private msgFormatter;
|
|
11
11
|
private accessToken?;
|
|
12
12
|
private slackClient?;
|
|
13
|
-
private slackChannels?;
|
|
14
|
-
private slackChannelsCacheTimeout?;
|
|
15
13
|
constructor(args: IAddonConfig);
|
|
16
14
|
handleEvent(event: IEvent, parameters: ISlackAppAddonParameters): Promise<void>;
|
|
17
15
|
findTaggedChannels({ tags }: Pick<IEvent, 'tags'>): string[];
|
|
18
16
|
getDefaultChannels(defaultChannels?: string): string[];
|
|
19
|
-
startCacheInvalidation(): void;
|
|
20
17
|
logError(event: IEvent, error: Error | CodedError): void;
|
|
21
|
-
destroy(): void;
|
|
22
18
|
}
|
|
23
19
|
export {};
|
|
@@ -6,13 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const web_api_1 = require("@slack/web-api");
|
|
7
7
|
const addon_1 = __importDefault(require("./addon"));
|
|
8
8
|
const slack_app_definition_1 = __importDefault(require("./slack-app-definition"));
|
|
9
|
+
const SCHEDULE_MESSAGE_DELAY_IN_SECONDS = 10;
|
|
9
10
|
const feature_event_formatter_md_1 = require("./feature-event-formatter-md");
|
|
10
|
-
const CACHE_SECONDS = 30;
|
|
11
11
|
class SlackAppAddon extends addon_1.default {
|
|
12
12
|
constructor(args) {
|
|
13
13
|
super(slack_app_definition_1.default, args);
|
|
14
14
|
this.msgFormatter = new feature_event_formatter_md_1.FeatureEventFormatterMd(args.unleashUrl, feature_event_formatter_md_1.LinkStyle.SLACK);
|
|
15
|
-
this.startCacheInvalidation();
|
|
16
15
|
}
|
|
17
16
|
async handleEvent(event, parameters) {
|
|
18
17
|
try {
|
|
@@ -29,6 +28,7 @@ class SlackAppAddon extends addon_1.default {
|
|
|
29
28
|
this.logger.debug(`No Slack channels found for event ${event.type}.`);
|
|
30
29
|
return;
|
|
31
30
|
}
|
|
31
|
+
this.logger.debug(`Found candidate channels: ${eventChannels}.`);
|
|
32
32
|
if (!this.slackClient || this.accessToken !== accessToken) {
|
|
33
33
|
const client = new web_api_1.WebClient(accessToken);
|
|
34
34
|
client.on(web_api_1.WebClientEvent.RATE_LIMITED, (numSeconds) => {
|
|
@@ -37,60 +37,42 @@ class SlackAppAddon extends addon_1.default {
|
|
|
37
37
|
this.slackClient = client;
|
|
38
38
|
this.accessToken = accessToken;
|
|
39
39
|
}
|
|
40
|
-
if (!this.slackChannels) {
|
|
41
|
-
const slackConversationsList = await this.slackClient.conversations.list({
|
|
42
|
-
types: 'public_channel,private_channel',
|
|
43
|
-
exclude_archived: true,
|
|
44
|
-
limit: 200,
|
|
45
|
-
});
|
|
46
|
-
this.slackChannels = slackConversationsList.channels || [];
|
|
47
|
-
let nextCursor = slackConversationsList.response_metadata?.next_cursor;
|
|
48
|
-
while (nextCursor !== undefined && nextCursor !== '') {
|
|
49
|
-
this.logger.debug('Fetching next page of channels');
|
|
50
|
-
const moreChannels = await this.slackClient.conversations.list({
|
|
51
|
-
cursor: nextCursor,
|
|
52
|
-
types: 'public_channel,private_channel',
|
|
53
|
-
exclude_archived: true,
|
|
54
|
-
limit: 200,
|
|
55
|
-
});
|
|
56
|
-
const channels = moreChannels.channels;
|
|
57
|
-
if (channels === undefined) {
|
|
58
|
-
this.logger.debug('Channels list was empty, breaking pagination');
|
|
59
|
-
nextCursor = undefined;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
nextCursor = moreChannels.response_metadata?.next_cursor;
|
|
63
|
-
this.logger.debug(`This page had ${channels.length} channels`);
|
|
64
|
-
channels.forEach((channel) => this.slackChannels?.push(channel));
|
|
65
|
-
}
|
|
66
|
-
this.logger.debug(`Fetched ${this.slackChannels.length} Slack channels`);
|
|
67
|
-
}
|
|
68
|
-
const currentSlackChannels = [...this.slackChannels];
|
|
69
|
-
if (!currentSlackChannels.length) {
|
|
70
|
-
this.logger.warn('No Slack channels found.');
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
40
|
const text = this.msgFormatter.format(event);
|
|
74
41
|
const url = this.msgFormatter.featureLink(event);
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
type: '
|
|
86
|
-
|
|
87
|
-
style: 'primary',
|
|
88
|
-
url,
|
|
42
|
+
const requests = eventChannels.map((name) => {
|
|
43
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
44
|
+
const postAt = now + SCHEDULE_MESSAGE_DELAY_IN_SECONDS;
|
|
45
|
+
return this.slackClient.chat.scheduleMessage({
|
|
46
|
+
channel: name,
|
|
47
|
+
text,
|
|
48
|
+
blocks: [
|
|
49
|
+
{
|
|
50
|
+
type: 'section',
|
|
51
|
+
text: {
|
|
52
|
+
type: 'mrkdwn',
|
|
53
|
+
text,
|
|
89
54
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
type: 'actions',
|
|
58
|
+
block_id: url,
|
|
59
|
+
elements: [
|
|
60
|
+
{
|
|
61
|
+
type: 'button',
|
|
62
|
+
url,
|
|
63
|
+
text: {
|
|
64
|
+
type: 'plain_text',
|
|
65
|
+
text: 'Open in Unleash',
|
|
66
|
+
},
|
|
67
|
+
value: 'featureToggle',
|
|
68
|
+
style: 'primary',
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
post_at: postAt,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
94
76
|
const results = await Promise.allSettled(requests);
|
|
95
77
|
results
|
|
96
78
|
.filter(({ status }) => status === 'rejected')
|
|
@@ -116,11 +98,6 @@ class SlackAppAddon extends addon_1.default {
|
|
|
116
98
|
}
|
|
117
99
|
return [];
|
|
118
100
|
}
|
|
119
|
-
startCacheInvalidation() {
|
|
120
|
-
this.slackChannelsCacheTimeout = setInterval(() => {
|
|
121
|
-
this.slackChannels = undefined;
|
|
122
|
-
}, CACHE_SECONDS * 1000);
|
|
123
|
-
}
|
|
124
101
|
logError(event, error) {
|
|
125
102
|
if (!('code' in error)) {
|
|
126
103
|
this.logger.warn(`Error handling event ${event.type}.`, error);
|
|
@@ -146,12 +123,6 @@ class SlackAppAddon extends addon_1.default {
|
|
|
146
123
|
this.logger.warn(`Error handling event ${event.type}.`, error);
|
|
147
124
|
}
|
|
148
125
|
}
|
|
149
|
-
destroy() {
|
|
150
|
-
if (this.slackChannelsCacheTimeout) {
|
|
151
|
-
clearInterval(this.slackChannelsCacheTimeout);
|
|
152
|
-
this.slackChannelsCacheTimeout = undefined;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
126
|
}
|
|
156
127
|
exports.default = SlackAppAddon;
|
|
157
128
|
module.exports = SlackAppAddon;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-app.js","sourceRoot":"","sources":["../../../src/lib/addons/slack-app.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"slack-app.js","sourceRoot":"","sources":["../../../src/lib/addons/slack-app.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unleash-server",
|
|
3
3
|
"description": "Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.",
|
|
4
|
-
"version": "5.3.
|
|
4
|
+
"version": "5.3.5",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"unleash",
|
|
7
7
|
"feature toggle",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
]
|
|
106
106
|
},
|
|
107
107
|
"dependencies": {
|
|
108
|
-
"@slack/web-api": "^6.
|
|
108
|
+
"@slack/web-api": "^6.9.0",
|
|
109
109
|
"@unleash/express-openapi": "^0.3.0",
|
|
110
110
|
"ajv": "^8.11.0",
|
|
111
111
|
"ajv-formats": "^2.1.1",
|