slack.ts 0.0.13 → 0.0.14
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/client.d.ts +2 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +25 -23
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/receivers/base.d.ts +2 -2
- package/dist/receivers/base.d.ts.map +1 -1
- package/dist/receivers/dummy.d.ts +2 -2
- package/dist/receivers/dummy.d.ts.map +1 -1
- package/dist/receivers/dummy.js +2 -2
- package/dist/receivers/fetch.d.ts +8 -3
- package/dist/receivers/fetch.d.ts.map +1 -1
- package/dist/receivers/fetch.js +11 -10
- package/dist/receivers/http.d.ts +2 -2
- package/dist/receivers/http.d.ts.map +1 -1
- package/dist/receivers/http.js +3 -4
- package/dist/receivers/index.d.ts +6 -0
- package/dist/receivers/index.d.ts.map +1 -0
- package/dist/receivers/index.js +4 -0
- package/dist/receivers/socket.d.ts +2 -2
- package/dist/receivers/socket.d.ts.map +1 -1
- package/dist/receivers/socket.js +24 -25
- package/dist/resources/index.d.ts +8 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +7 -0
- package/dist/utils/events.d.ts +11 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +29 -0
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import EventEmitter from "events";
|
|
2
1
|
import { type SlackAPIMethod, type SlackAPIParams, type SlackAPIResponse } from "./api/index.js";
|
|
3
2
|
import type { AllEvents, AllEventTypes, EventWrapper, SlackEventMap } from "./api/events/index.js";
|
|
4
3
|
import type { MessageEvent } from "./api/events/events.js";
|
|
@@ -15,6 +14,7 @@ import type { DistributiveOmit } from "./utils/typing.js";
|
|
|
15
14
|
import type { EventsReceiver } from "./receivers/base.js";
|
|
16
15
|
import { type SlashCommandInstance } from "./resources/slash.js";
|
|
17
16
|
import type { IM, MPIM, PrivateChannel, PublicChannel } from "./api/types/conversation.js";
|
|
17
|
+
import { AsyncEventEmitter } from "./utils/events.js";
|
|
18
18
|
type ReceiverOptions = ({
|
|
19
19
|
type: "socket";
|
|
20
20
|
} & DistributiveOmit<SocketEventsReceiverOptions, "client">) | ({
|
|
@@ -50,7 +50,7 @@ type ChannelTypeMap = {
|
|
|
50
50
|
mpim: MPIM;
|
|
51
51
|
im: IM;
|
|
52
52
|
};
|
|
53
|
-
export declare class App extends
|
|
53
|
+
export declare class App extends AsyncEventEmitter<AppEventMap> {
|
|
54
54
|
#private;
|
|
55
55
|
constructor({ token, receiver }?: AppOptions);
|
|
56
56
|
get receiver(): EventsReceiver;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import EventEmitter from "events";
|
|
2
1
|
import { POST_METHODS, } from "./api/index.js";
|
|
3
2
|
import { SlackWebAPIError, SlackWebAPIPlatformError } from "./error.js";
|
|
4
3
|
import { DummyReceiver } from "./receivers/dummy.js";
|
|
@@ -11,12 +10,12 @@ import { Message } from "./resources/message.js";
|
|
|
11
10
|
import { sleep } from "./utils/index.js";
|
|
12
11
|
import { SlashCommand } from "./resources/slash.js";
|
|
13
12
|
import { paginate } from "./utils/paginate.js";
|
|
14
|
-
|
|
13
|
+
import { AsyncEventEmitter } from "./utils/events.js";
|
|
14
|
+
export class App extends AsyncEventEmitter {
|
|
15
15
|
#token;
|
|
16
16
|
#receiver;
|
|
17
17
|
constructor({ token, receiver = { type: "dummy" } } = {}) {
|
|
18
|
-
super(
|
|
19
|
-
this.on("error", this.#onCallbackError.bind(this));
|
|
18
|
+
super();
|
|
20
19
|
this.#token = token;
|
|
21
20
|
switch (receiver.type) {
|
|
22
21
|
case "socket":
|
|
@@ -37,38 +36,41 @@ export class App extends EventEmitter {
|
|
|
37
36
|
this.#receiver.on("slash_command", this.#onSlashCommand.bind(this));
|
|
38
37
|
this.on("event:message", this.#onMessage.bind(this));
|
|
39
38
|
}
|
|
40
|
-
#onEvent(event) {
|
|
41
|
-
this.emit("event", event);
|
|
42
|
-
this.emit(`event:${event.event.type}`, {
|
|
39
|
+
async #onEvent(event) {
|
|
40
|
+
await this.emit("event", event);
|
|
41
|
+
await this.emit(`event:${event.event.type}`, {
|
|
42
|
+
payload: event.event,
|
|
43
|
+
event: event,
|
|
44
|
+
});
|
|
43
45
|
}
|
|
44
|
-
#onBlockActions(event) {
|
|
45
|
-
this.emit("actions", event);
|
|
46
|
+
async #onBlockActions(event) {
|
|
47
|
+
await this.emit("actions", event);
|
|
46
48
|
for (const action of event.actions) {
|
|
47
49
|
const obj = new Action(this, action, event);
|
|
48
|
-
this.emit(`action:${action.type}`, obj);
|
|
49
|
-
this.emit(`action.${action.action_id}`, obj);
|
|
50
|
-
this.emit(`action:${action.type}.${action.action_id}`, obj);
|
|
50
|
+
await this.emit(`action:${action.type}`, obj);
|
|
51
|
+
await this.emit(`action.${action.action_id}`, obj);
|
|
52
|
+
await this.emit(`action:${action.type}.${action.action_id}`, obj);
|
|
51
53
|
}
|
|
52
54
|
}
|
|
53
|
-
#onViewSubmission(event) {
|
|
54
|
-
this.emit("submit", event);
|
|
55
|
-
this.emit(`submit.${event.view.callback_id}`, event);
|
|
55
|
+
async #onViewSubmission(event) {
|
|
56
|
+
await this.emit("submit", event);
|
|
57
|
+
await this.emit(`submit.${event.view.callback_id}`, event);
|
|
56
58
|
}
|
|
57
|
-
#onSlashCommand(event) {
|
|
59
|
+
async #onSlashCommand(event) {
|
|
58
60
|
const command = new SlashCommand(this, event);
|
|
59
|
-
this.emit("slash", command);
|
|
60
|
-
this.emit(`/${event.command.substring(1)}`, command);
|
|
61
|
+
await this.emit("slash", command);
|
|
62
|
+
await this.emit(`/${event.command.substring(1)}`, command);
|
|
61
63
|
}
|
|
62
64
|
async #onCallbackError(error) {
|
|
63
65
|
console.error("Error occurred executing callback");
|
|
64
66
|
console.error(error);
|
|
65
67
|
}
|
|
66
|
-
#onMessage({ payload }) {
|
|
68
|
+
async #onMessage({ payload }) {
|
|
67
69
|
const message = new Message(this, payload.channel, payload.ts, payload);
|
|
68
|
-
this.emit("message", message);
|
|
69
|
-
this.emit(`message:${payload.subtype ?? "normal"}`, message);
|
|
70
|
-
this.emit(`message:${payload.subtype ?? "normal"}#${payload.channel}`, message);
|
|
71
|
-
this.emit(`message#${payload.channel}`, message);
|
|
70
|
+
await this.emit("message", message);
|
|
71
|
+
await this.emit(`message:${payload.subtype ?? "normal"}`, message);
|
|
72
|
+
await this.emit(`message:${payload.subtype ?? "normal"}#${payload.channel}`, message);
|
|
73
|
+
await this.emit(`message#${payload.channel}`, message);
|
|
72
74
|
}
|
|
73
75
|
get receiver() {
|
|
74
76
|
return this.#receiver;
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,OAAO,CAAA;AACrB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/receivers/base.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type EventEmitter from "events";
|
|
2
1
|
import type { AllEvents, EventWrapper } from "../api/events/index.js";
|
|
3
2
|
import type { BlockActions } from "../api/interactive/block_actions.js";
|
|
4
3
|
import type { ViewSubmission } from "../api/interactive/view_submission.js";
|
|
5
4
|
import type { SlashCommandPayload } from "../api/slash/index.js";
|
|
6
|
-
|
|
5
|
+
import type { AsyncEventEmitter } from "../utils/events.js";
|
|
6
|
+
export interface EventsReceiver extends AsyncEventEmitter<ReceiverEventMap> {
|
|
7
7
|
start(): unknown;
|
|
8
8
|
}
|
|
9
9
|
export type ReceiverEventMap = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/receivers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/receivers/base.ts"],"names":[],"mappings":"AAAA,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;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,MAAM,WAAW,cAAe,SAAQ,iBAAiB,CAAC,gBAAgB,CAAC;IAC1E,KAAK,IAAI,OAAO,CAAA;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;IAChC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAA;IAC7B,eAAe,EAAE,CAAC,cAAc,CAAC,CAAA;IACjC,aAAa,EAAE,CAAC,mBAAmB,CAAC,CAAA;CACpC,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
2
2
|
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
3
|
-
export declare class DummyReceiver extends
|
|
3
|
+
export declare class DummyReceiver extends AsyncEventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
4
4
|
constructor();
|
|
5
5
|
start(): void;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummy.d.ts","sourceRoot":"","sources":["../../src/receivers/dummy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dummy.d.ts","sourceRoot":"","sources":["../../src/receivers/dummy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9D,qBAAa,aAAc,SAAQ,iBAAiB,CAAC,gBAAgB,CAAE,YAAW,cAAc;;IAK/F,KAAK;CACL"}
|
package/dist/receivers/dummy.js
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import { EventEmitter } from "events";
|
|
2
1
|
import type { App } from "../client.js";
|
|
2
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
3
3
|
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
4
4
|
export interface HttpFetchReceiverOptions {
|
|
5
5
|
signingSecret: string;
|
|
6
6
|
client: App;
|
|
7
|
+
/**
|
|
8
|
+
* Optional function that will be called with each `Promise` that is not awaited. Most useful in
|
|
9
|
+
* serverless environments like Cloudflare Workers, but can also be used to catch errors.
|
|
10
|
+
*/
|
|
11
|
+
waitUntil?: (obj: Promise<unknown>) => unknown;
|
|
7
12
|
}
|
|
8
13
|
/**
|
|
9
14
|
* Stateless HTTP receiver that exposes a fetch() method.
|
|
@@ -37,9 +42,9 @@ export interface HttpFetchReceiverOptions {
|
|
|
37
42
|
* })
|
|
38
43
|
* ```
|
|
39
44
|
*/
|
|
40
|
-
export declare class HttpFetchReceiver extends
|
|
45
|
+
export declare class HttpFetchReceiver extends AsyncEventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
41
46
|
#private;
|
|
42
|
-
constructor({ signingSecret, client }: HttpFetchReceiverOptions);
|
|
47
|
+
constructor({ signingSecret, client, waitUntil }: HttpFetchReceiverOptions);
|
|
43
48
|
/**
|
|
44
49
|
* Handles an incoming HTTP request from Slack.
|
|
45
50
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/receivers/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/receivers/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9D,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,GAAG,CAAA;IACX;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAA;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,iBACZ,SAAQ,iBAAiB,CAAC,gBAAgB,CAC1C,YAAW,cAAc;;gBAMb,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,wBAAwB;IAY1E;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgD1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC5B"}
|
package/dist/receivers/fetch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
2
2
|
import { parseSlackRequest } from "../utils/http.js";
|
|
3
3
|
/**
|
|
4
4
|
* Stateless HTTP receiver that exposes a fetch() method.
|
|
@@ -32,14 +32,15 @@ import { parseSlackRequest } from "../utils/http.js";
|
|
|
32
32
|
* })
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
|
-
export class HttpFetchReceiver extends
|
|
35
|
+
export class HttpFetchReceiver extends AsyncEventEmitter {
|
|
36
36
|
#signingSecret;
|
|
37
37
|
#client;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
#waitUntil;
|
|
39
|
+
constructor({ signingSecret, client, waitUntil }) {
|
|
40
|
+
super();
|
|
41
41
|
this.#signingSecret = signingSecret;
|
|
42
42
|
this.#client = client;
|
|
43
|
+
this.#waitUntil = waitUntil;
|
|
43
44
|
}
|
|
44
45
|
#onError(error) {
|
|
45
46
|
console.error("[http-fetch] error occurred handling event");
|
|
@@ -64,7 +65,7 @@ export class HttpFetchReceiver extends EventEmitter {
|
|
|
64
65
|
return new Response("Bad Request", { status: 400 });
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
|
-
#handlePayload(payload) {
|
|
68
|
+
async #handlePayload(payload) {
|
|
68
69
|
switch (payload.type) {
|
|
69
70
|
case "url_verification":
|
|
70
71
|
return new Response(JSON.stringify({ challenge: payload.challenge }), {
|
|
@@ -72,16 +73,16 @@ export class HttpFetchReceiver extends EventEmitter {
|
|
|
72
73
|
headers: { "Content-Type": "application/json" },
|
|
73
74
|
});
|
|
74
75
|
case "event":
|
|
75
|
-
this.emit("event", payload.payload);
|
|
76
|
+
this.#waitUntil?.(this.emit("event", payload.payload));
|
|
76
77
|
return new Response(null, { status: 200 });
|
|
77
78
|
case "block_actions":
|
|
78
|
-
this.emit("block_actions", payload.payload);
|
|
79
|
+
this.#waitUntil?.(this.emit("block_actions", payload.payload));
|
|
79
80
|
return new Response(null, { status: 200 });
|
|
80
81
|
case "view_submission":
|
|
81
|
-
this.emit("view_submission", payload.payload);
|
|
82
|
+
this.#waitUntil?.(this.emit("view_submission", payload.payload));
|
|
82
83
|
return new Response(null, { status: 200 });
|
|
83
84
|
case "slash_command":
|
|
84
|
-
this.emit("slash_command", payload.payload);
|
|
85
|
+
this.#waitUntil?.(this.emit("slash_command", payload.payload));
|
|
85
86
|
return new Response(null, { status: 200 });
|
|
86
87
|
default:
|
|
87
88
|
const _exhaustive = payload;
|
package/dist/receivers/http.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
2
2
|
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
3
3
|
import { type HttpFetchReceiverOptions } from "./fetch.js";
|
|
4
4
|
export interface HttpServerReceiverOptions extends Omit<HttpFetchReceiverOptions, "signingSecret"> {
|
|
@@ -29,7 +29,7 @@ export interface HttpServerReceiverOptions extends Omit<HttpFetchReceiverOptions
|
|
|
29
29
|
* console.log('Server listening on port 3000 at /slack/events')
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
export declare class HttpServerReceiver extends
|
|
32
|
+
export declare class HttpServerReceiver extends AsyncEventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
33
33
|
#private;
|
|
34
34
|
constructor({ signingSecret, client, port, path, }: HttpServerReceiverOptions);
|
|
35
35
|
start(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/receivers/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/receivers/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,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,kBACZ,SAAQ,iBAAiB,CAAC,gBAAgB,CAC1C,YAAW,cAAc;;gBAOb,EACX,aAAa,EACb,MAAM,EACN,IAAW,EACX,IAAsB,GACtB,EAAE,yBAAyB;IAkBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuD3B"}
|
package/dist/receivers/http.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EventEmitter } from "events";
|
|
2
1
|
import { createServer } from "http";
|
|
2
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
3
3
|
import { HttpFetchReceiver } from "./fetch.js";
|
|
4
4
|
/**
|
|
5
5
|
* HTTP server receiver using Node.js built-in http module.
|
|
@@ -24,14 +24,13 @@ import { HttpFetchReceiver } from "./fetch.js";
|
|
|
24
24
|
* console.log('Server listening on port 3000 at /slack/events')
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
-
export class HttpServerReceiver extends
|
|
27
|
+
export class HttpServerReceiver extends AsyncEventEmitter {
|
|
28
28
|
#fetchReceiver;
|
|
29
29
|
#server;
|
|
30
30
|
#port;
|
|
31
31
|
#path;
|
|
32
32
|
constructor({ signingSecret, client, port = 3000, path = "/slack/events", }) {
|
|
33
|
-
super(
|
|
34
|
-
this.on("error", this.#onError.bind(this));
|
|
33
|
+
super();
|
|
35
34
|
this.#fetchReceiver = new HttpFetchReceiver({ signingSecret, client });
|
|
36
35
|
this.#port = port;
|
|
37
36
|
this.#path = path;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DummyReceiver } from "./dummy.js";
|
|
2
|
+
export { SocketEventsReceiver, type SocketEventsReceiverOptions } from "./socket.js";
|
|
3
|
+
export { HttpServerReceiver, type HttpServerReceiverOptions } from "./http.js";
|
|
4
|
+
export { HttpFetchReceiver, type HttpFetchReceiverOptions } from "./fetch.js";
|
|
5
|
+
export { type EventsReceiver, type ReceiverEventMap } from "./base.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/receivers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAA;AACjF,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,QAAQ,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import EventEmitter from "events";
|
|
2
1
|
import type { App } from "../client.js";
|
|
2
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
3
3
|
import type { EventsReceiver, ReceiverEventMap } from "./base.js";
|
|
4
4
|
export interface SocketEventsReceiverOptions {
|
|
5
5
|
appToken: string;
|
|
6
6
|
client: App;
|
|
7
7
|
}
|
|
8
|
-
export declare class SocketEventsReceiver extends
|
|
8
|
+
export declare class SocketEventsReceiver extends AsyncEventEmitter<ReceiverEventMap> implements EventsReceiver {
|
|
9
9
|
#private;
|
|
10
10
|
client: App;
|
|
11
11
|
constructor({ appToken, client }: SocketEventsReceiverOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/receivers/socket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/receivers/socket.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9D,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,GAAG,CAAA;CACX;AAED,qBAAa,oBACZ,SAAQ,iBAAiB,CAAC,gBAAgB,CAC1C,YAAW,cAAc;;IAGlB,MAAM,EAAE,GAAG,CAAA;gBAGN,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,2BAA2B;IAWvD,KAAK;YAIG,QAAQ;CAoDtB"}
|
package/dist/receivers/socket.js
CHANGED
|
@@ -1,68 +1,67 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
export class SocketEventsReceiver extends
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
import { AsyncEventEmitter } from "../utils/events.js";
|
|
3
|
+
export class SocketEventsReceiver extends AsyncEventEmitter {
|
|
4
4
|
#appToken;
|
|
5
5
|
client;
|
|
6
6
|
#ws;
|
|
7
7
|
constructor({ appToken, client }) {
|
|
8
|
-
super(
|
|
9
|
-
this.on('error', this.#onEventError.bind(this));
|
|
8
|
+
super();
|
|
10
9
|
this.#appToken = appToken;
|
|
11
10
|
this.client = client;
|
|
12
11
|
}
|
|
13
12
|
#onEventError(error) {
|
|
14
|
-
console.error(
|
|
13
|
+
console.error("[socket-mode] error occurred handling event");
|
|
15
14
|
console.error(error);
|
|
16
15
|
}
|
|
17
16
|
async start() {
|
|
18
17
|
await this._connect();
|
|
19
18
|
}
|
|
20
19
|
async _connect() {
|
|
21
|
-
const { url } = await this.client.request(
|
|
20
|
+
const { url } = await this.client.request("apps.connections.open", { token: this.#appToken });
|
|
22
21
|
this.#ws = new WebSocket(url);
|
|
23
|
-
this.#ws.addEventListener(
|
|
24
|
-
this.#ws.addEventListener(
|
|
25
|
-
this.#ws.addEventListener(
|
|
26
|
-
this.#ws.addEventListener(
|
|
22
|
+
this.#ws.addEventListener("open", this.#onOpen.bind(this));
|
|
23
|
+
this.#ws.addEventListener("message", this.#onMessage.bind(this));
|
|
24
|
+
this.#ws.addEventListener("close", this.#onClose.bind(this));
|
|
25
|
+
this.#ws.addEventListener("error", this.#onError.bind(this));
|
|
27
26
|
}
|
|
28
27
|
#onOpen() {
|
|
29
|
-
console.debug(
|
|
28
|
+
console.debug("[socket-mode] websocket connected");
|
|
30
29
|
}
|
|
31
30
|
#onMessage(event) {
|
|
32
|
-
console.debug(
|
|
33
|
-
if (typeof event.data ===
|
|
31
|
+
console.debug("[socket-mode] message received");
|
|
32
|
+
if (typeof event.data === "string") {
|
|
34
33
|
try {
|
|
35
34
|
const data = JSON.parse(event.data);
|
|
36
|
-
if (data.type ===
|
|
35
|
+
if (data.type === "events_api") {
|
|
37
36
|
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
38
|
-
this.emit(
|
|
37
|
+
this.emit("event", data.payload);
|
|
39
38
|
}
|
|
40
|
-
else if (data.type ===
|
|
39
|
+
else if (data.type === "interactive") {
|
|
41
40
|
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
42
41
|
this.emit(data.payload.type, data.payload);
|
|
43
42
|
}
|
|
44
|
-
else if (data.type ===
|
|
43
|
+
else if (data.type === "slash_commands") {
|
|
45
44
|
this.#ws?.send(JSON.stringify({ envelope_id: data.envelope_id }));
|
|
46
|
-
this.emit(
|
|
45
|
+
this.emit("slash_command", data.payload);
|
|
47
46
|
}
|
|
48
|
-
else if (data.type ===
|
|
49
|
-
console.debug(
|
|
47
|
+
else if (data.type === "hello") {
|
|
48
|
+
console.debug("[socket-mode] received server hello, app id", data.connection_info.app_id);
|
|
50
49
|
}
|
|
51
50
|
else {
|
|
52
|
-
console.warn(
|
|
51
|
+
console.warn("[socket-mode] unknown message:", data);
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
54
|
catch (error) {
|
|
56
|
-
console.error(
|
|
55
|
+
console.error("[socket-mode] failed to parse message:", error instanceof Error ? error.message : error);
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
#onClose(event) {
|
|
61
|
-
console.debug(
|
|
60
|
+
console.debug("[socket-mode] websocket closed with code", event.code, event.reason);
|
|
62
61
|
this._connect();
|
|
63
62
|
}
|
|
64
63
|
#onError(event) {
|
|
65
|
-
console.debug(
|
|
64
|
+
console.debug("[socket-mode] websocket error", event.message);
|
|
66
65
|
this.#ws?.close();
|
|
67
66
|
this._connect();
|
|
68
67
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Action, type ActionInstance } from "./action.js";
|
|
2
|
+
export { Channel, ChannelRef, type ChannelInstance } from "./channel.js";
|
|
3
|
+
export { Message, MessageRef, type MessageInstance } from "./message.js";
|
|
4
|
+
export { Modal, type ModalInstance } from "./modal.js";
|
|
5
|
+
export { SlashCommand, type SlashCommandInstance } from "./slash.js";
|
|
6
|
+
export { Submission, type SubmissionInstance } from "./submission.js";
|
|
7
|
+
export { User, UserRef, type UserInstance } from "./user.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAA;AACrE,OAAO,EAAE,KAAK,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,SAAS,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { Action } from "./action.js";
|
|
2
|
+
export { Channel, ChannelRef } from "./channel.js";
|
|
3
|
+
export { Message, MessageRef } from "./message.js";
|
|
4
|
+
export { Modal } from "./modal.js";
|
|
5
|
+
export { SlashCommand } from "./slash.js";
|
|
6
|
+
export { Submission } from "./submission.js";
|
|
7
|
+
export { User, UserRef } from "./user.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type EventListener<EventMap extends Record<string, unknown[]>, Event extends keyof EventMap> = (...args: EventMap[Event]) => unknown;
|
|
2
|
+
export declare class AsyncEventEmitter<EventMap extends Record<string, unknown[]> = Record<string, unknown[]>> {
|
|
3
|
+
#private;
|
|
4
|
+
constructor();
|
|
5
|
+
on<Event extends keyof EventMap & string>(event: Event, listener: EventListener<EventMap, Event>): void;
|
|
6
|
+
once<Event extends keyof EventMap & string>(event: Event, listener: EventListener<EventMap, Event>): void;
|
|
7
|
+
off<Event extends keyof EventMap & string>(event: Event, listener: EventListener<EventMap, Event>): void;
|
|
8
|
+
emit<Event extends keyof EventMap & string>(event: Event, ...args: EventMap[Event]): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/utils/events.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,SAAS,MAAM,QAAQ,IAAI,CAC9F,GAAG,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KACpB,OAAO,CAAA;AAEZ,qBAAa,iBAAiB,CAC7B,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;;;IAMtE,EAAE,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,MAAM,EACvC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAOzC,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,MAAM,EACzC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IASzC,GAAG,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,MAAM,EACxC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAOnC,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;CAIxF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export class AsyncEventEmitter {
|
|
2
|
+
#listeners = {};
|
|
3
|
+
constructor() { }
|
|
4
|
+
on(event, listener) {
|
|
5
|
+
if (!this.#listeners[event])
|
|
6
|
+
this.#listeners[event] = [];
|
|
7
|
+
if (this.#listeners[event].includes(listener))
|
|
8
|
+
return;
|
|
9
|
+
this.#listeners[event].push(listener);
|
|
10
|
+
}
|
|
11
|
+
once(event, listener) {
|
|
12
|
+
const callback = (...args) => {
|
|
13
|
+
this.off(event, callback);
|
|
14
|
+
return listener(...args);
|
|
15
|
+
};
|
|
16
|
+
this.on(event, callback);
|
|
17
|
+
}
|
|
18
|
+
off(event, listener) {
|
|
19
|
+
if (!this.#listeners[event])
|
|
20
|
+
this.#listeners[event] = [];
|
|
21
|
+
const index = this.#listeners[event].indexOf(listener);
|
|
22
|
+
if (index)
|
|
23
|
+
this.#listeners[event].splice(index, 1);
|
|
24
|
+
}
|
|
25
|
+
async emit(event, ...args) {
|
|
26
|
+
const listeners = this.#listeners[event] || [];
|
|
27
|
+
await Promise.all(listeners.map((listener) => listener(...args)));
|
|
28
|
+
}
|
|
29
|
+
}
|