slack.ts 0.0.9 → 0.0.11
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/dist/src/api/index.d.ts +14 -3
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +1 -0
- package/dist/src/api/web/users.d.ts +29 -1
- package/dist/src/api/web/users.d.ts.map +1 -1
- package/dist/src/client.d.ts +19 -9
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +25 -1
- package/dist/src/receivers/fetch.d.ts +52 -0
- package/dist/src/receivers/fetch.d.ts.map +1 -0
- package/dist/src/receivers/fetch.js +92 -0
- package/dist/src/receivers/http.d.ts +38 -0
- package/dist/src/receivers/http.d.ts.map +1 -0
- package/dist/src/receivers/http.js +110 -0
- package/dist/src/receivers/socket.d.ts.map +1 -1
- package/dist/src/receivers/socket.js +22 -17
- package/dist/src/utils/http.d.ts +31 -0
- package/dist/src/utils/http.d.ts.map +1 -0
- package/dist/src/utils/http.js +105 -0
- package/dist/src/utils/paginate.d.ts.map +1 -1
- package/dist/src/utils/paginate.js +3 -6
- package/package.json +2 -1
package/dist/src/api/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SlackApiMap } from "slack-undoc-client";
|
|
1
2
|
import type { CursorPaginationResponse } from "./types/api.js";
|
|
2
3
|
import type { AppsConnectionsOpenParams, AppsConnectionsOpenResponse, AppsManifestCreateParams, AppsManifestCreateResponse, AppsManifestDeleteParams, AppsManifestDeleteResponse, AppsManifestExportParams, AppsManifestExportResponse, AppsManifestUpdateParams, AppsManifestUpdateResponse, AppsManifestValidateParams, AppsManifestValidateResponse, AppsUninstallParams, AppsUninstallResponse } from "./web/apps.js";
|
|
3
4
|
import type { AuthRevokeParams, AuthRevokeResponse, AuthTeamsListParams, AuthTeamsListResponse, AuthTestParams, AuthTestResponse } from "./web/auth.js";
|
|
@@ -5,9 +6,13 @@ import type { BotsInfoParams, BotsInfoResponse } from "./web/bots.js";
|
|
|
5
6
|
import type { ChatPostEphemeralParams, ChatPostEphemeralResponse, ChatPostMessageParams, ChatPostMessageResponse } from "./web/chat.js";
|
|
6
7
|
import type { ConversationsHistoryParams, ConversationsHistoryResponse, ConversationsInfoParams, ConversationsInfoResponse, ConversationsListParams, ConversationsListResponse, ConversationsRepliesParams, ConversationsRepliesResponse } from "./web/conversations.js";
|
|
7
8
|
import type { FilesCompleteUploadExternalParams, FilesCompleteUploadExternalResponse, FilesGetUploadURLExternalParams, FilesGetUploadURLExternalResponse } from "./web/files.js";
|
|
8
|
-
import type { UsersInfoParams, UsersInfoResponse } from "./web/users.js";
|
|
9
|
+
import type { UsersInfoParams, UsersInfoResponse, UsersProfileSetParams, UsersProfileSetResponse } from "./web/users.js";
|
|
9
10
|
import type { ViewsOpenParams, ViewsOpenResponse } from "./web/views.js";
|
|
10
|
-
|
|
11
|
+
interface SlackWebAPIMapInternal {
|
|
12
|
+
"users.profile.set": {
|
|
13
|
+
params: UsersProfileSetParams;
|
|
14
|
+
response: UsersProfileSetResponse;
|
|
15
|
+
};
|
|
11
16
|
"bots.info": {
|
|
12
17
|
params: BotsInfoParams;
|
|
13
18
|
response: BotsInfoResponse;
|
|
@@ -93,12 +98,17 @@ export interface SlackWebAPIMap {
|
|
|
93
98
|
response: ViewsOpenResponse;
|
|
94
99
|
};
|
|
95
100
|
}
|
|
101
|
+
export interface SlackWebAPIMap extends SlackWebAPIMapInternal, Omit<SlackApiMap, keyof SlackWebAPIMapInternal> {
|
|
102
|
+
}
|
|
96
103
|
export type SlackAPIMethod = keyof SlackWebAPIMap;
|
|
97
104
|
export type SlackPaginatingAPIMethod = {
|
|
98
105
|
[K in SlackAPIMethod]: SlackWebAPIMap[K]["response"] extends CursorPaginationResponse ? K : never;
|
|
99
106
|
}[SlackAPIMethod];
|
|
100
107
|
export type SlackAPIParams<Method extends SlackAPIMethod> = SlackWebAPIMap[Method]["params"] & {
|
|
101
|
-
token?: string
|
|
108
|
+
token?: string | {
|
|
109
|
+
cookie: string;
|
|
110
|
+
token: string;
|
|
111
|
+
};
|
|
102
112
|
};
|
|
103
113
|
export type SlackAPIResponse<Method extends SlackAPIMethod> = {
|
|
104
114
|
ok: false;
|
|
@@ -107,4 +117,5 @@ export type SlackAPIResponse<Method extends SlackAPIMethod> = {
|
|
|
107
117
|
ok: true;
|
|
108
118
|
} & SlackWebAPIMap[Method]["response"]);
|
|
109
119
|
export declare const POST_METHODS: SlackAPIMethod[];
|
|
120
|
+
export {};
|
|
110
121
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAC3D,OAAO,KAAK,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EACX,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EACX,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EACX,0BAA0B,EAC1B,4BAA4B,EAC5B,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAC5B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,KAAK,EACX,iCAAiC,EACjC,mCAAmC,EACnC,+BAA+B,EAC/B,iCAAiC,EACjC,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/api/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { User } from "../types/user.js";
|
|
1
|
+
import type { User, UserProfile } from "../types/user.js";
|
|
2
2
|
export interface UsersInfoParams {
|
|
3
3
|
/** User to get info on */
|
|
4
4
|
user: string;
|
|
@@ -8,4 +8,32 @@ export interface UsersInfoParams {
|
|
|
8
8
|
export interface UsersInfoResponse {
|
|
9
9
|
user: User;
|
|
10
10
|
}
|
|
11
|
+
interface ProfileUpdate {
|
|
12
|
+
display_name?: string;
|
|
13
|
+
email?: string;
|
|
14
|
+
first_name?: string;
|
|
15
|
+
last_name?: string;
|
|
16
|
+
phone?: string;
|
|
17
|
+
pronouns?: string;
|
|
18
|
+
real_name?: string;
|
|
19
|
+
start_date?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
fields?: Record<string, {
|
|
22
|
+
value: string;
|
|
23
|
+
alt?: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export type UsersProfileSetParams = {} & ({
|
|
27
|
+
name: string;
|
|
28
|
+
value: string;
|
|
29
|
+
profile?: never;
|
|
30
|
+
} | {
|
|
31
|
+
name?: never;
|
|
32
|
+
value?: never;
|
|
33
|
+
profile: ProfileUpdate;
|
|
34
|
+
});
|
|
35
|
+
export interface UsersProfileSetResponse {
|
|
36
|
+
profile: UserProfile;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
11
39
|
//# sourceMappingURL=users.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../../src/api/web/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../../src/api/web/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEtD,MAAM,WAAW,eAAe;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IAEZ,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,IAAI,CAAA;CACV;AAED,UAAU,aAAa;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACxD;AAED,MAAM,MAAM,qBAAqB,GAAG,EAAE,GAAG,CACtC;IACA,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAA;CACd,GACD;IACA,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,OAAO,EAAE,aAAa,CAAA;CACrB,CACH,CAAA;AAED,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,WAAW,CAAA;CACpB"}
|
package/dist/src/client.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ import type { BlockAction, BlockActionMap, BlockActions, BlockActionTypes } from
|
|
|
6
6
|
import type { ViewSubmission } from "./api/interactive/view_submission.js";
|
|
7
7
|
import type { AnyMessage, NormalMessage } from "./api/types/message.js";
|
|
8
8
|
import { type SocketEventsReceiverOptions } from "./receivers/socket.js";
|
|
9
|
+
import { type HttpServerReceiverOptions } from "./receivers/http.js";
|
|
10
|
+
import { type HttpFetchReceiverOptions } from "./receivers/fetch.js";
|
|
9
11
|
import { Action, type ActionInstance } from "./resources/action.js";
|
|
10
12
|
import { Channel, ChannelRef } from "./resources/channel.js";
|
|
11
13
|
import { type MessageInstance } from "./resources/message.js";
|
|
@@ -14,12 +16,19 @@ import { type SlashCommandInstance } from "./resources/slash.js";
|
|
|
14
16
|
import type { IM, MPIM, PrivateChannel, PublicChannel } from "./api/types/conversation.js";
|
|
15
17
|
type ReceiverOptions = ({
|
|
16
18
|
type: "socket";
|
|
17
|
-
} & DistributiveOmit<SocketEventsReceiverOptions, "client">) | {
|
|
19
|
+
} & DistributiveOmit<SocketEventsReceiverOptions, "client">) | ({
|
|
20
|
+
type: "http";
|
|
21
|
+
} & DistributiveOmit<HttpServerReceiverOptions, "client">) | ({
|
|
22
|
+
type: "fetch";
|
|
23
|
+
} & DistributiveOmit<HttpFetchReceiverOptions, "client">) | {
|
|
18
24
|
type: "dummy";
|
|
19
25
|
options?: never;
|
|
20
26
|
};
|
|
21
27
|
interface AppOptions {
|
|
22
|
-
token?: string
|
|
28
|
+
token?: string | {
|
|
29
|
+
cookie: string;
|
|
30
|
+
token: string;
|
|
31
|
+
};
|
|
23
32
|
receiver?: ReceiverOptions;
|
|
24
33
|
}
|
|
25
34
|
export type MessageCallbackData = {
|
|
@@ -81,16 +90,17 @@ export declare class App extends EventEmitter<AppEventMap> {
|
|
|
81
90
|
*/
|
|
82
91
|
channel(id: string): ChannelRef;
|
|
83
92
|
channels<Types extends ("public_channel" | "private_channel" | "mpim" | "im")[]>(...types: Types): AsyncGenerator<Channel<ChannelTypeMap[Types[number]]>>;
|
|
84
|
-
/**
|
|
85
|
-
* Makes a Slack Web API request.
|
|
86
|
-
*
|
|
87
|
-
* @param method The Slack Web API method to call
|
|
88
|
-
* @param params The parameters for the method
|
|
89
|
-
* @returns The response from the API call
|
|
90
|
-
*/
|
|
91
93
|
request<Method extends SlackAPIMethod>(method: Method, params: SlackAPIParams<Method>): Promise<Extract<SlackAPIResponse<Method>, {
|
|
92
94
|
ok: true;
|
|
93
95
|
}>>;
|
|
96
|
+
request<Method extends string>(method: Method extends SlackAPIMethod ? never : Method, params: Record<string, unknown> & {
|
|
97
|
+
token?: string | {
|
|
98
|
+
cookie: string;
|
|
99
|
+
token: string;
|
|
100
|
+
};
|
|
101
|
+
}): Promise<{
|
|
102
|
+
ok: true;
|
|
103
|
+
} & Record<string, unknown>>;
|
|
94
104
|
}
|
|
95
105
|
type AppEventMap = {
|
|
96
106
|
event: [
|
package/dist/src/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AACjC,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,MAAM,OAAO,CAAA;AACd,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,MAAM,iCAAiC,CAAA;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGpE,OAAO,EAAwB,KAAK,2BAA2B,EAAE,MAAM,oBAAoB,CAAA;AAC3F,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGtD,OAAO,EAAgB,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,KAAK,EAEX,EAAE,EACF,IAAI,EACJ,cAAc,EACd,aAAa,EACb,MAAM,0BAA0B,CAAA;AAGjC,KAAK,eAAe,GACjB,CAAC;IACD,IAAI,EAAE,QAAQ,CAAA;CACb,GAAG,gBAAgB,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC,GAC5D;IACA,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAEJ,UAAU,UAAU;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/client.js
CHANGED
|
@@ -3,6 +3,8 @@ import { POST_METHODS, } from "./api/index.js";
|
|
|
3
3
|
import { SlackWebAPIError, SlackWebAPIPlatformError } from "./error.js";
|
|
4
4
|
import { DummyReceiver } from "./receivers/dummy.js";
|
|
5
5
|
import { SocketEventsReceiver } from "./receivers/socket.js";
|
|
6
|
+
import { HttpServerReceiver } from "./receivers/http.js";
|
|
7
|
+
import { HttpFetchReceiver } from "./receivers/fetch.js";
|
|
6
8
|
import { Action } from "./resources/action.js";
|
|
7
9
|
import { Channel, ChannelRef } from "./resources/channel.js";
|
|
8
10
|
import { Message } from "./resources/message.js";
|
|
@@ -20,6 +22,12 @@ export class App extends EventEmitter {
|
|
|
20
22
|
case "socket":
|
|
21
23
|
this.#receiver = new SocketEventsReceiver({ ...receiver, client: this });
|
|
22
24
|
break;
|
|
25
|
+
case "http":
|
|
26
|
+
this.#receiver = new HttpServerReceiver({ ...receiver, client: this });
|
|
27
|
+
break;
|
|
28
|
+
case "fetch":
|
|
29
|
+
this.#receiver = new HttpFetchReceiver({ ...receiver, client: this });
|
|
30
|
+
break;
|
|
23
31
|
default:
|
|
24
32
|
this.#receiver = new DummyReceiver();
|
|
25
33
|
}
|
|
@@ -125,6 +133,15 @@ export class App extends EventEmitter {
|
|
|
125
133
|
/**
|
|
126
134
|
* Makes a Slack Web API request.
|
|
127
135
|
*
|
|
136
|
+
* This method can be used to call undocumented Slack API methods. Most of these methods require
|
|
137
|
+
* an `xoxd-` cookie and an `xoxc-` token, rather than the normal `xoxb-` and `xoxp-` tokens. You
|
|
138
|
+
* can obtain this cookie and token from a Slack browser session. Then, pass them in an object of
|
|
139
|
+
* the form `{ cookie: string; token: string }` to the `token` parameter.
|
|
140
|
+
*
|
|
141
|
+
* This method contains typings for some Slack API methods (broader support to come), as well as
|
|
142
|
+
* some undocumented methods (provided by the `slack-undoc-client` library). Use the undocumented
|
|
143
|
+
* endpoints at your own risk since they may break at any time.
|
|
144
|
+
*
|
|
128
145
|
* @param method The Slack Web API method to call
|
|
129
146
|
* @param params The parameters for the method
|
|
130
147
|
* @returns The response from the API call
|
|
@@ -150,7 +167,14 @@ export class App extends EventEmitter {
|
|
|
150
167
|
headers.append("Content-Type", "application/json; charset=utf-8");
|
|
151
168
|
}
|
|
152
169
|
if (params.token || this.#token) {
|
|
153
|
-
|
|
170
|
+
const token = params.token || this.#token;
|
|
171
|
+
if (typeof token === "string") {
|
|
172
|
+
headers.set("Authorization", `Bearer ${params.token || this.#token}`);
|
|
173
|
+
}
|
|
174
|
+
else if (token?.cookie && token?.token) {
|
|
175
|
+
headers.set("Cookie", `d=${token.cookie}`);
|
|
176
|
+
headers.set("Authorization", `Bearer ${token.token}`);
|
|
177
|
+
}
|
|
154
178
|
}
|
|
155
179
|
const res = await request(url.toString(), {
|
|
156
180
|
method: httpMethod,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import type { App } from "../client.js";
|
|
3
|
+
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
4
|
+
export interface HttpFetchReceiverOptions {
|
|
5
|
+
signingSecret: string;
|
|
6
|
+
client: App;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Stateless HTTP receiver that exposes a fetch() method.
|
|
10
|
+
*
|
|
11
|
+
* This receiver is designed for serverless and other environments where the user manages their HTTP
|
|
12
|
+
* server. It handles a single request at a time without maintaining server state.
|
|
13
|
+
*
|
|
14
|
+
* Example usage:
|
|
15
|
+
*
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const receiver = new HttpFetchReceiver({
|
|
18
|
+
* signingSecret: process.env.SLACK_SIGNING_SECRET,
|
|
19
|
+
* client: app,
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* // For Cloudflare Workers, Deno, etc.:
|
|
23
|
+
* export default {
|
|
24
|
+
* fetch: (request) => receiver.fetch(request),
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // For Express:
|
|
28
|
+
* app.post('/slack/events', async (req, res) => {
|
|
29
|
+
* const response = await receiver.fetch(
|
|
30
|
+
* new Request('http://localhost/', {
|
|
31
|
+
* method: req.method,
|
|
32
|
+
* headers: req.headers,
|
|
33
|
+
* body: req.body,
|
|
34
|
+
* }),
|
|
35
|
+
* )
|
|
36
|
+
* res.status(response.status).send(await response.text())
|
|
37
|
+
* })
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class HttpFetchReceiver extends EventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
41
|
+
#private;
|
|
42
|
+
constructor({ signingSecret, client }: HttpFetchReceiverOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Handles an incoming HTTP request from Slack.
|
|
45
|
+
*
|
|
46
|
+
* @param request The incoming HTTP request
|
|
47
|
+
* @returns An HTTP response to send back to Slack
|
|
48
|
+
*/
|
|
49
|
+
fetch(request: Request): Promise<Response>;
|
|
50
|
+
start(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/receivers/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9D,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,GAAG,CAAA;CACX;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,cAAc;;gBAIlF,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,wBAAwB;IAY/D;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgD1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { parseSlackRequest } from "../utils/http.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stateless HTTP receiver that exposes a fetch() method.
|
|
5
|
+
*
|
|
6
|
+
* This receiver is designed for serverless and other environments where the user manages their HTTP
|
|
7
|
+
* server. It handles a single request at a time without maintaining server state.
|
|
8
|
+
*
|
|
9
|
+
* Example usage:
|
|
10
|
+
*
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const receiver = new HttpFetchReceiver({
|
|
13
|
+
* signingSecret: process.env.SLACK_SIGNING_SECRET,
|
|
14
|
+
* client: app,
|
|
15
|
+
* })
|
|
16
|
+
*
|
|
17
|
+
* // For Cloudflare Workers, Deno, etc.:
|
|
18
|
+
* export default {
|
|
19
|
+
* fetch: (request) => receiver.fetch(request),
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* // For Express:
|
|
23
|
+
* app.post('/slack/events', async (req, res) => {
|
|
24
|
+
* const response = await receiver.fetch(
|
|
25
|
+
* new Request('http://localhost/', {
|
|
26
|
+
* method: req.method,
|
|
27
|
+
* headers: req.headers,
|
|
28
|
+
* body: req.body,
|
|
29
|
+
* }),
|
|
30
|
+
* )
|
|
31
|
+
* res.status(response.status).send(await response.text())
|
|
32
|
+
* })
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class HttpFetchReceiver extends EventEmitter {
|
|
36
|
+
#signingSecret;
|
|
37
|
+
#client;
|
|
38
|
+
constructor({ signingSecret, client }) {
|
|
39
|
+
super({ captureRejections: true });
|
|
40
|
+
this.on("error", this.#onError.bind(this));
|
|
41
|
+
this.#signingSecret = signingSecret;
|
|
42
|
+
this.#client = client;
|
|
43
|
+
}
|
|
44
|
+
#onError(error) {
|
|
45
|
+
console.error("[http-fetch] error occurred handling event");
|
|
46
|
+
console.error(error);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Handles an incoming HTTP request from Slack.
|
|
50
|
+
*
|
|
51
|
+
* @param request The incoming HTTP request
|
|
52
|
+
* @returns An HTTP response to send back to Slack
|
|
53
|
+
*/
|
|
54
|
+
async fetch(request) {
|
|
55
|
+
try {
|
|
56
|
+
const payload = await parseSlackRequest(request, this.#signingSecret);
|
|
57
|
+
return this.#handlePayload(payload);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error("[http-fetch] error parsing request:", error instanceof Error ? error.message : error);
|
|
61
|
+
if (error instanceof Error && error.message.includes("Invalid signature")) {
|
|
62
|
+
return new Response("Unauthorized", { status: 403 });
|
|
63
|
+
}
|
|
64
|
+
return new Response("Bad Request", { status: 400 });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
#handlePayload(payload) {
|
|
68
|
+
switch (payload.type) {
|
|
69
|
+
case "url_verification":
|
|
70
|
+
return new Response(JSON.stringify({ challenge: payload.challenge }), {
|
|
71
|
+
status: 200,
|
|
72
|
+
headers: { "Content-Type": "application/json" },
|
|
73
|
+
});
|
|
74
|
+
case "event":
|
|
75
|
+
this.emit("event", payload.payload);
|
|
76
|
+
return new Response(null, { status: 200 });
|
|
77
|
+
case "block_actions":
|
|
78
|
+
this.emit("block_actions", payload.payload);
|
|
79
|
+
return new Response(null, { status: 200 });
|
|
80
|
+
case "view_submission":
|
|
81
|
+
this.emit("view_submission", payload.payload);
|
|
82
|
+
return new Response(null, { status: 200 });
|
|
83
|
+
case "slash_command":
|
|
84
|
+
this.emit("slash_command", payload.payload);
|
|
85
|
+
return new Response(null, { status: 200 });
|
|
86
|
+
default:
|
|
87
|
+
const _exhaustive = payload;
|
|
88
|
+
return new Response(null, { status: 200 });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async start() { }
|
|
92
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
3
|
+
import { type HttpFetchReceiverOptions } from "./fetch.js";
|
|
4
|
+
export interface HttpServerReceiverOptions extends Omit<HttpFetchReceiverOptions, "signingSecret"> {
|
|
5
|
+
signingSecret: string;
|
|
6
|
+
port?: number;
|
|
7
|
+
path?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* HTTP server receiver using Node.js built-in http module.
|
|
11
|
+
*
|
|
12
|
+
* This receiver starts its own HTTP server and listens for Slack events on a specified port and
|
|
13
|
+
* path.
|
|
14
|
+
*
|
|
15
|
+
* Example usage:
|
|
16
|
+
*
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const app = new App({
|
|
19
|
+
* token: process.env.SLACK_BOT_TOKEN,
|
|
20
|
+
* receiver: {
|
|
21
|
+
* type: 'http',
|
|
22
|
+
* signingSecret: process.env.SLACK_SIGNING_SECRET,
|
|
23
|
+
* port: 3000,
|
|
24
|
+
* path: '/slack/events',
|
|
25
|
+
* },
|
|
26
|
+
* })
|
|
27
|
+
*
|
|
28
|
+
* await app.start()
|
|
29
|
+
* console.log('Server listening on port 3000 at /slack/events')
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class HttpServerReceiver extends EventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
33
|
+
#private;
|
|
34
|
+
constructor({ signingSecret, client, port, path, }: HttpServerReceiverOptions);
|
|
35
|
+
start(): Promise<void>;
|
|
36
|
+
stop(): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/receivers/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAC9D,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAE1E,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,wBAAwB,EAAE,eAAe,CAAC;IACjG,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,kBAAmB,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,cAAc;;gBAMnF,EACX,aAAa,EACb,MAAM,EACN,IAAW,EACX,IAAsB,GACtB,EAAE,yBAAyB;IAmBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuD3B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { createServer } from "http";
|
|
3
|
+
import { HttpFetchReceiver } from "./fetch.js";
|
|
4
|
+
/**
|
|
5
|
+
* HTTP server receiver using Node.js built-in http module.
|
|
6
|
+
*
|
|
7
|
+
* This receiver starts its own HTTP server and listens for Slack events on a specified port and
|
|
8
|
+
* path.
|
|
9
|
+
*
|
|
10
|
+
* Example usage:
|
|
11
|
+
*
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const app = new App({
|
|
14
|
+
* token: process.env.SLACK_BOT_TOKEN,
|
|
15
|
+
* receiver: {
|
|
16
|
+
* type: 'http',
|
|
17
|
+
* signingSecret: process.env.SLACK_SIGNING_SECRET,
|
|
18
|
+
* port: 3000,
|
|
19
|
+
* path: '/slack/events',
|
|
20
|
+
* },
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* await app.start()
|
|
24
|
+
* console.log('Server listening on port 3000 at /slack/events')
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class HttpServerReceiver extends EventEmitter {
|
|
28
|
+
#fetchReceiver;
|
|
29
|
+
#server;
|
|
30
|
+
#port;
|
|
31
|
+
#path;
|
|
32
|
+
constructor({ signingSecret, client, port = 3000, path = "/slack/events", }) {
|
|
33
|
+
super({ captureRejections: true });
|
|
34
|
+
this.on("error", this.#onError.bind(this));
|
|
35
|
+
this.#fetchReceiver = new HttpFetchReceiver({ signingSecret, client });
|
|
36
|
+
this.#port = port;
|
|
37
|
+
this.#path = path;
|
|
38
|
+
this.#fetchReceiver.on("event", (payload) => this.emit("event", payload));
|
|
39
|
+
this.#fetchReceiver.on("block_actions", (payload) => this.emit("block_actions", payload));
|
|
40
|
+
this.#fetchReceiver.on("view_submission", (payload) => this.emit("view_submission", payload));
|
|
41
|
+
this.#fetchReceiver.on("slash_command", (payload) => this.emit("slash_command", payload));
|
|
42
|
+
}
|
|
43
|
+
#onError(error) {
|
|
44
|
+
console.error("[http-server] error occurred");
|
|
45
|
+
console.error(error);
|
|
46
|
+
}
|
|
47
|
+
async start() {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
this.#server = createServer(this.#onRequest.bind(this));
|
|
50
|
+
this.#server.on("error", reject);
|
|
51
|
+
this.#server.listen(this.#port, () => {
|
|
52
|
+
console.debug(`[http-server] listening on port ${this.#port} at ${this.#path}`);
|
|
53
|
+
resolve();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async stop() {
|
|
58
|
+
if (!this.#server)
|
|
59
|
+
return;
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
this.#server.close((err) => {
|
|
62
|
+
if (err)
|
|
63
|
+
reject(err);
|
|
64
|
+
else
|
|
65
|
+
resolve();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async #onRequest(req, res) {
|
|
70
|
+
if (req.method !== "POST" || req.url !== this.#path) {
|
|
71
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
72
|
+
res.end("Not Found");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const headers = new Headers();
|
|
77
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
78
|
+
if (typeof value === "string") {
|
|
79
|
+
headers.set(key, value);
|
|
80
|
+
}
|
|
81
|
+
else if (Array.isArray(value)) {
|
|
82
|
+
headers.set(key, value.join(", "));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const chunks = [];
|
|
86
|
+
for await (const chunk of req) {
|
|
87
|
+
chunks.push(chunk);
|
|
88
|
+
}
|
|
89
|
+
const body = Buffer.concat(chunks);
|
|
90
|
+
const webRequest = new Request("http://localhost/", {
|
|
91
|
+
method: "POST",
|
|
92
|
+
headers,
|
|
93
|
+
body: body.length > 0 ? body : undefined,
|
|
94
|
+
});
|
|
95
|
+
const response = await this.#fetchReceiver.fetch(webRequest);
|
|
96
|
+
res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
97
|
+
if (response.body) {
|
|
98
|
+
res.end(await response.text());
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
res.end();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error("[http-server] error handling request:", error);
|
|
106
|
+
res.writeHead(500, { "Content-Type": "text/plain" });
|
|
107
|
+
res.end("Internal Server Error");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../src/receivers/socket.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAIjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAG9D,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,GAAG,CAAA;CACX;AAED,qBAAa,oBAAqB,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,cAAc;;IAE1F,MAAM,EAAE,GAAG,CAAA;gBAGN,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,2BAA2B;IAYvD,KAAK;YAIG,QAAQ;
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../../src/receivers/socket.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,QAAQ,CAAA;AAIjC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAG9D,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,GAAG,CAAA;CACX;AAED,qBAAa,oBAAqB,SAAQ,YAAY,CAAC,gBAAgB,CAAE,YAAW,cAAc;;IAE1F,MAAM,EAAE,GAAG,CAAA;gBAGN,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,2BAA2B;IAYvD,KAAK;YAIG,QAAQ;CAoDtB"}
|
|
@@ -31,24 +31,29 @@ export class SocketEventsReceiver extends EventEmitter {
|
|
|
31
31
|
#onMessage(event) {
|
|
32
32
|
console.debug('[socket-mode] message received');
|
|
33
33
|
if (typeof event.data === 'string') {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
try {
|
|
35
|
+
const data = JSON.parse(event.data);
|
|
36
|
+
if (data.type === 'events_api') {
|
|
37
|
+
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
38
|
+
this.emit('event', data.payload);
|
|
39
|
+
}
|
|
40
|
+
else if (data.type === 'interactive') {
|
|
41
|
+
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
42
|
+
this.emit(data.payload.type, data.payload);
|
|
43
|
+
}
|
|
44
|
+
else if (data.type === 'slash_commands') {
|
|
45
|
+
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
46
|
+
this.emit('slash_command', data.payload);
|
|
47
|
+
}
|
|
48
|
+
else if (data.type === 'hello') {
|
|
49
|
+
console.debug('[socket-mode] received server hello, app id', data.connection_info.app_id);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.warn('[socket-mode] unknown message:', data);
|
|
53
|
+
}
|
|
38
54
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.emit(data.payload.type, data.payload);
|
|
42
|
-
}
|
|
43
|
-
else if (data.type === 'slash_commands') {
|
|
44
|
-
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
45
|
-
this.emit('slash_command', data.payload);
|
|
46
|
-
}
|
|
47
|
-
else if (data.type === 'hello') {
|
|
48
|
-
console.debug('[socket-mode] received server hello, app id', data.connection_info.app_id);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
console.warn('[socket-mode] unknown message:', data);
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error('[socket-mode] failed to parse message:', error instanceof Error ? error.message : error);
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AllEvents, EventWrapper } from "../api/events/index.js";
|
|
2
|
+
import type { BlockActions } from "../api/interactive/block_actions.js";
|
|
3
|
+
import type { ViewSubmission } from "../api/interactive/view_submission.js";
|
|
4
|
+
import type { SlashCommandPayload } from "../api/slash/index.js";
|
|
5
|
+
export type SlackHttpPayload = {
|
|
6
|
+
type: "url_verification";
|
|
7
|
+
challenge: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "event";
|
|
10
|
+
payload: EventWrapper<AllEvents>;
|
|
11
|
+
} | {
|
|
12
|
+
type: "block_actions";
|
|
13
|
+
payload: BlockActions;
|
|
14
|
+
} | {
|
|
15
|
+
type: "view_submission";
|
|
16
|
+
payload: ViewSubmission;
|
|
17
|
+
} | {
|
|
18
|
+
type: "slash_command";
|
|
19
|
+
payload: SlashCommandPayload;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Parses and validates a Slack HTTP request.
|
|
23
|
+
*
|
|
24
|
+
* @param request The incoming request
|
|
25
|
+
* @param signingSecret The Slack app signing secret
|
|
26
|
+
* @param timestampWindow Timestamp validation window in seconds (default: 300)
|
|
27
|
+
* @returns Parsed Slack payload
|
|
28
|
+
* @throws Error if signature is invalid or payload format is unrecognized
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseSlackRequest(request: Request, signingSecret: string, timestampWindow?: number): Promise<SlackHttpPayload>;
|
|
31
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/utils/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAEvD,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAA;AAE1D;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,EACrB,eAAe,GAAE,MAAY,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAyD3B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Parses and validates a Slack HTTP request.
|
|
4
|
+
*
|
|
5
|
+
* @param request The incoming request
|
|
6
|
+
* @param signingSecret The Slack app signing secret
|
|
7
|
+
* @param timestampWindow Timestamp validation window in seconds (default: 300)
|
|
8
|
+
* @returns Parsed Slack payload
|
|
9
|
+
* @throws Error if signature is invalid or payload format is unrecognized
|
|
10
|
+
*/
|
|
11
|
+
export async function parseSlackRequest(request, signingSecret, timestampWindow = 300) {
|
|
12
|
+
const timestamp = request.headers.get('x-slack-request-timestamp');
|
|
13
|
+
const signature = request.headers.get('x-slack-signature');
|
|
14
|
+
if (!timestamp || !signature) {
|
|
15
|
+
throw new Error('Missing timestamp or signature headers');
|
|
16
|
+
}
|
|
17
|
+
const ts = Number(timestamp);
|
|
18
|
+
const now = Math.floor(Date.now() / 1000);
|
|
19
|
+
if (isNaN(ts) || Math.abs(now - ts) > timestampWindow) {
|
|
20
|
+
throw new Error('Timestamp outside acceptable window');
|
|
21
|
+
}
|
|
22
|
+
const bodyText = await request.text();
|
|
23
|
+
const baseString = `v0:${timestamp}:${bodyText}`;
|
|
24
|
+
const expectedSignature = 'v0=' + createHmac('sha256', signingSecret).update(baseString).digest('hex');
|
|
25
|
+
const signatureBuffer = Buffer.from(signature);
|
|
26
|
+
const expectedBuffer = Buffer.from(expectedSignature);
|
|
27
|
+
if (signatureBuffer.length !== expectedBuffer.length ||
|
|
28
|
+
!timingSafeEqual(signatureBuffer, expectedBuffer)) {
|
|
29
|
+
throw new Error('Invalid signature');
|
|
30
|
+
}
|
|
31
|
+
const contentType = request.headers.get('content-type') || '';
|
|
32
|
+
let body;
|
|
33
|
+
if (contentType.includes('application/json')) {
|
|
34
|
+
try {
|
|
35
|
+
body = JSON.parse(bodyText);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw new Error('Invalid JSON payload');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (contentType.includes('application/x-www-form-urlencoded')) {
|
|
42
|
+
const params = new URLSearchParams(bodyText);
|
|
43
|
+
const formBody = parseFormBody(params);
|
|
44
|
+
if (params.has('payload')) {
|
|
45
|
+
try {
|
|
46
|
+
body = JSON.parse(params.get('payload'));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
throw new Error('Invalid JSON in form payload');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
body = formBody;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw new Error(`Unsupported content type: ${contentType}`);
|
|
58
|
+
}
|
|
59
|
+
return detectSlackPayload(body);
|
|
60
|
+
}
|
|
61
|
+
function detectSlackPayload(body) {
|
|
62
|
+
if (typeof body !== 'object' || body === null) {
|
|
63
|
+
throw new Error('Invalid payload: not an object');
|
|
64
|
+
}
|
|
65
|
+
const obj = body;
|
|
66
|
+
if (obj.type === 'url_verification' && typeof obj.challenge === 'string') {
|
|
67
|
+
return {
|
|
68
|
+
type: 'url_verification',
|
|
69
|
+
challenge: obj.challenge,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (obj.type === 'event_callback' && obj.event) {
|
|
73
|
+
return {
|
|
74
|
+
type: 'event',
|
|
75
|
+
payload: body,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (obj.type === 'block_actions' && Array.isArray(obj.actions)) {
|
|
79
|
+
return {
|
|
80
|
+
type: 'block_actions',
|
|
81
|
+
payload: body,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (obj.type === 'view_submission' && obj.view) {
|
|
85
|
+
return {
|
|
86
|
+
type: 'view_submission',
|
|
87
|
+
payload: body,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (typeof obj.command === 'string' && typeof obj.text === 'string' && obj.trigger_id) {
|
|
91
|
+
return {
|
|
92
|
+
type: 'slash_command',
|
|
93
|
+
payload: body,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
throw new Error('Unrecognized payload type');
|
|
97
|
+
}
|
|
98
|
+
/** Parses URLSearchParams from form data into a plain object. */
|
|
99
|
+
function parseFormBody(params) {
|
|
100
|
+
const result = {};
|
|
101
|
+
for (const [key, value] of params.entries()) {
|
|
102
|
+
result[key] = value;
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../../src/utils/paginate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"paginate.d.ts","sourceRoot":"","sources":["../../../src/utils/paginate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,QAAQ,CAAA;AAExF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,wBAAuB,QAAQ,CAAC,MAAM,SAAS,wBAAwB,EAAE,CAAC,EACzE,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,GAAG;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,EACD,SAAS,EAAE,CACV,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CAAC,KACrD,QAAQ,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,6CAgBnC"}
|
|
@@ -4,12 +4,9 @@ export async function* paginate(client, method, params, converter) {
|
|
|
4
4
|
if (remaining <= 0)
|
|
5
5
|
return;
|
|
6
6
|
while (true) {
|
|
7
|
-
const batch
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
limit: params.batch ?? undefined,
|
|
11
|
-
batch: undefined,
|
|
12
|
-
});
|
|
7
|
+
const { batch: _, ...payload } = params;
|
|
8
|
+
const body = { ...payload, cursor, limit: params.batch ?? undefined };
|
|
9
|
+
const batch = await client.request(method, body);
|
|
13
10
|
for await (const item of converter(batch)) {
|
|
14
11
|
yield item;
|
|
15
12
|
if (--remaining <= 0)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "slack.ts",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "A fully-typed, opinionated Slack API library",
|
|
5
5
|
"author": "@jollyroger182",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@slack/types": "^2.20.1",
|
|
49
|
+
"slack-undoc-client": "1.1.1",
|
|
49
50
|
"ws": "^8.20.0"
|
|
50
51
|
}
|
|
51
52
|
}
|