@nerimity/nerimity.js 1.19.0 → 1.20.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.
Files changed (49) hide show
  1. package/build/AsyncFunctionQueue.d.ts +43 -0
  2. package/build/AsyncFunctionQueue.d.ts.map +1 -0
  3. package/build/AsyncFunctionQueue.js +105 -0
  4. package/build/AsyncFunctionQueue.js.map +1 -0
  5. package/build/Attachment.d.ts +8 -0
  6. package/build/Attachment.d.ts.map +1 -0
  7. package/build/Attachment.js +41 -0
  8. package/build/Attachment.js.map +1 -0
  9. package/build/Client.d.ts +233 -121
  10. package/build/Client.d.ts.map +1 -1
  11. package/build/Client.js +211 -7
  12. package/build/Client.js.map +1 -1
  13. package/build/Webhooks.d.ts +73 -0
  14. package/build/Webhooks.d.ts.map +1 -0
  15. package/build/Webhooks.js +122 -0
  16. package/build/Webhooks.js.map +1 -0
  17. package/build/classes/Button.d.ts +19 -0
  18. package/build/classes/Button.d.ts.map +1 -0
  19. package/build/classes/Button.js +29 -0
  20. package/build/classes/Button.js.map +1 -0
  21. package/build/classes/Channel.d.ts +2 -0
  22. package/build/classes/Channel.d.ts.map +1 -1
  23. package/build/classes/Channel.js +16 -12
  24. package/build/classes/Channel.js.map +1 -1
  25. package/build/classes/Message.d.ts +1 -0
  26. package/build/classes/Message.d.ts.map +1 -1
  27. package/build/classes/Message.js +1 -0
  28. package/build/classes/Message.js.map +1 -1
  29. package/build/classes/Webhooks.d.ts.map +1 -1
  30. package/build/classes/Webhooks.js +6 -1
  31. package/build/classes/Webhooks.js.map +1 -1
  32. package/build/services/MessageService.d.ts +1 -0
  33. package/build/services/MessageService.d.ts.map +1 -1
  34. package/build/services/MessageService.js +18 -24
  35. package/build/services/MessageService.js.map +1 -1
  36. package/build/services/PostsService.d.ts.map +1 -1
  37. package/build/services/PostsService.js +0 -8
  38. package/build/services/PostsService.js.map +1 -1
  39. package/build/services/ServerService.d.ts.map +1 -1
  40. package/build/services/ServerService.js +0 -6
  41. package/build/services/ServerService.js.map +1 -1
  42. package/package.json +1 -2
  43. package/src/AsyncFunctionQueue.ts +115 -0
  44. package/src/classes/Channel.ts +17 -12
  45. package/src/classes/Message.ts +2 -0
  46. package/src/classes/Webhooks.ts +8 -1
  47. package/src/services/MessageService.ts +19 -24
  48. package/src/services/PostsService.ts +0 -8
  49. package/src/services/ServerService.ts +0 -6
@@ -1,3 +1,4 @@
1
+ import { AsyncFunctionQueue } from "../AsyncFunctionQueue";
1
2
  import { ChannelType, RawChannel } from "../RawData";
2
3
  import {
3
4
  deleteMessage as requestMessageDelete,
@@ -11,6 +12,8 @@ export class Channel {
11
12
  client: Client;
12
13
  id: string;
13
14
 
15
+ messageSendQueue = new AsyncFunctionQueue();
16
+
14
17
  type: ChannelType;
15
18
  createdAt?: number;
16
19
  lastMessagedAt?: number;
@@ -26,19 +29,21 @@ export class Channel {
26
29
  }
27
30
 
28
31
  async send(content: string, opts?: MessageOpts) {
29
- const RawMessage = await postMessage({
30
- client: this.client,
31
- channelId: this.id,
32
- content: content,
33
- silent: opts?.silent,
34
- nerimityCdnFileId: opts?.nerimityCdnFileId,
35
- htmlEmbed: opts?.htmlEmbed,
36
- buttons: opts?.buttons,
37
- replyToMessageIds: opts?.replyToMessageIds,
38
- mentionReplies: opts?.mentionReplies,
32
+ return this.messageSendQueue.add(async () => {
33
+ const RawMessage = await postMessage({
34
+ client: this.client,
35
+ channelId: this.id,
36
+ content: content,
37
+ silent: opts?.silent,
38
+ nerimityCdnFileId: opts?.nerimityCdnFileId,
39
+ htmlEmbed: opts?.htmlEmbed,
40
+ buttons: opts?.buttons,
41
+ replyToMessageIds: opts?.replyToMessageIds,
42
+ mentionReplies: opts?.mentionReplies,
43
+ });
44
+ const message = new Message(this.client, RawMessage);
45
+ return message;
39
46
  });
40
- const message = new Message(this.client, RawMessage);
41
- return message;
42
47
  }
43
48
  toString() {
44
49
  return `[#:${this.id}]`;
@@ -59,6 +59,7 @@ export interface MessageOpts {
59
59
  }
60
60
  interface EditMessageOpts {
61
61
  htmlEmbed?: string;
62
+ buttons?: RawMessageButton[];
62
63
  }
63
64
  export class Message {
64
65
  client: Client;
@@ -136,6 +137,7 @@ export class Message {
136
137
  messageId: this.id,
137
138
  content: content,
138
139
  htmlEmbed: opts?.htmlEmbed,
140
+ buttons: opts?.buttons,
139
141
  });
140
142
  const message = new Message(this.client, RawMessage);
141
143
  return message;
@@ -116,6 +116,9 @@ export class WebhookBuilder {
116
116
  * @throws If the request fails, is unauthorized, or returns invalid JSON.
117
117
  */
118
118
  public async send(content: string): Promise<any> {
119
+ const error = new Error();
120
+ Error.captureStackTrace(error, this.send);
121
+
119
122
  const url = `https://nerimity.com/api/webhooks/${this.channelId}/${this.token}`;
120
123
 
121
124
  try {
@@ -138,7 +141,11 @@ export class WebhookBuilder {
138
141
 
139
142
  return json;
140
143
  } catch (err: any) {
141
- throw new Error(`Failed to send webhook: ${err.message}`);
144
+ const message = err.message || err;
145
+ error.message = `Failed to send webhook: ${message}`;
146
+ (error as any).raw = message;
147
+
148
+ throw error;
142
149
  }
143
150
  }
144
151
  }
@@ -1,7 +1,6 @@
1
1
  import { Client } from "../classes/Client";
2
2
  import { RawMessage, RawMessageButton } from "../RawData";
3
3
  import { ServiceEndpoints } from "./serviceEndpoints";
4
- import fetch from "node-fetch";
5
4
 
6
5
  interface FetchMessageOpts {
7
6
  client: Client;
@@ -16,12 +15,6 @@ export async function fetchMessage(opts: FetchMessageOpts) {
16
15
  method: "GET",
17
16
 
18
17
  useToken: true,
19
- }).catch((err) => {
20
- const error = new Error(
21
- `Failed to get message. ${JSON.stringify(err.message)}`
22
- );
23
- (error as unknown as { raw: string }).raw = err.message;
24
- throw error;
25
18
  });
26
19
  }
27
20
 
@@ -52,12 +45,6 @@ export async function postMessage(opts: PostMessageOpts) {
52
45
  replyToMessageIds: opts.replyToMessageIds,
53
46
  },
54
47
  useToken: true,
55
- }).catch((err) => {
56
- const error = new Error(
57
- `Failed to send message. ${JSON.stringify(err.message)}`
58
- );
59
- (error as unknown as { raw: string }).raw = err.message;
60
- throw error;
61
48
  });
62
49
  }
63
50
 
@@ -67,6 +54,7 @@ interface EditMessageOpts {
67
54
  messageId: string;
68
55
  content: string;
69
56
  htmlEmbed?: string;
57
+ buttons?: RawMessageButton[];
70
58
  }
71
59
 
72
60
  export function editMessage(opts: EditMessageOpts) {
@@ -74,10 +62,12 @@ export function editMessage(opts: EditMessageOpts) {
74
62
  client: opts.client,
75
63
  url: ServiceEndpoints.EditMessage(opts.channelId, opts.messageId),
76
64
  method: "PATCH",
77
- body: { content: opts.content, htmlEmbed: opts.htmlEmbed },
65
+ body: {
66
+ content: opts.content,
67
+ htmlEmbed: opts.htmlEmbed,
68
+ buttons: opts.buttons,
69
+ },
78
70
  useToken: true,
79
- }).catch((err) => {
80
- throw err.message;
81
71
  });
82
72
  }
83
73
 
@@ -92,8 +82,6 @@ export function deleteMessage(opts: DeleteMessageOpts) {
92
82
  url: ServiceEndpoints.EditMessage(opts.channelId, opts.messageId),
93
83
  method: "DELETE",
94
84
  useToken: true,
95
- }).catch((err) => {
96
- throw err.message;
97
85
  });
98
86
  }
99
87
 
@@ -168,8 +156,6 @@ export function buttonClickCallback(opts: ButtonClickCallbackOpts) {
168
156
  userId: opts.userId,
169
157
  },
170
158
  useToken: true,
171
- }).catch((err) => {
172
- throw err.message;
173
159
  });
174
160
  }
175
161
 
@@ -184,6 +170,9 @@ interface RequestOpts {
184
170
  }
185
171
 
186
172
  export async function request<T>(opts: RequestOpts): Promise<T> {
173
+ const stackCapture: any = {};
174
+ Error.captureStackTrace(stackCapture, request);
175
+
187
176
  const url = new URL(opts.url);
188
177
  url.search = new URLSearchParams(opts.params || {}).toString();
189
178
 
@@ -195,7 +184,7 @@ export async function request<T>(opts: RequestOpts): Promise<T> {
195
184
  Authorization: opts.useToken ? opts.client.token! : "",
196
185
  },
197
186
  }).catch((err) => {
198
- throw { message: "Could not connect to server. " + err.message };
187
+ throw new Error("Could not connect to server. " + err.message);
199
188
  });
200
189
 
201
190
  const text = await response.text();
@@ -204,10 +193,16 @@ export async function request<T>(opts: RequestOpts): Promise<T> {
204
193
  try {
205
194
  const json = JSON.parse(text);
206
195
  if (!response.ok) {
207
- return Promise.reject(json);
196
+ throw new Error(JSON.stringify(json));
208
197
  }
209
198
  return json;
210
- } catch {
211
- throw { message: text };
199
+ } catch (err) {
200
+ if (err instanceof Error) {
201
+ // Remove the first line of the captured stack ("Error")
202
+ // and append the rest to the real error
203
+ const originalStack = stackCapture.stack?.split("\n").slice(1).join("\n");
204
+ err.stack += "\n -- caused by --\n" + originalStack;
205
+ }
206
+ throw err;
212
207
  }
213
208
  }
@@ -30,8 +30,6 @@ export async function getPosts(client: Client) {
30
30
  url: ServiceEndpoints.GetPosts(),
31
31
  method: "GET",
32
32
  useToken: true,
33
- }).catch((err) => {
34
- throw new Error(`Failed to get posts. ${err.message}`);
35
33
  });
36
34
  }
37
35
 
@@ -46,8 +44,6 @@ export async function postPost(opts: PostPostOpts) {
46
44
  poll: opts.poll,
47
45
  },
48
46
  useToken: true,
49
- }).catch((err) => {
50
- throw new Error(`Failed to send post. ${err.message}`);
51
47
  });
52
48
  }
53
49
 
@@ -58,8 +54,6 @@ export async function editPost(opts: EditPostOpts) {
58
54
  method: "PATCH",
59
55
  body: { content: opts.content },
60
56
  useToken: true,
61
- }).catch((err) => {
62
- throw new Error(`Failed to edit post. ${err.message}`);
63
57
  });
64
58
  }
65
59
 
@@ -69,7 +63,5 @@ export async function deletePost(opts: DeletePostOpts) {
69
63
  url: ServiceEndpoints.DeletePost(opts.postId),
70
64
  method: "DELETE",
71
65
  useToken: true,
72
- }).catch((err) => {
73
- throw new Error(`Failed to delete post. ${err.message}`);
74
66
  });
75
67
  }
@@ -14,8 +14,6 @@ export async function banServerMember(
14
14
  method: "POST",
15
15
  useToken: true,
16
16
  body: { reason },
17
- }).catch((err) => {
18
- throw new Error(`Failed to ban server member. ${err.message}`);
19
17
  });
20
18
  }
21
19
 
@@ -29,8 +27,6 @@ export async function unbanServerMember(
29
27
  url: ServiceEndpoints.serverMemberBan(serverId, userId),
30
28
  method: "DELETE",
31
29
  useToken: true,
32
- }).catch((err) => {
33
- throw new Error(`Failed to unban server member. ${err.message}`);
34
30
  });
35
31
  }
36
32
  export async function kickServerMember(
@@ -43,7 +39,5 @@ export async function kickServerMember(
43
39
  url: ServiceEndpoints.serverMemberKick(serverId, userId),
44
40
  method: "DELETE",
45
41
  useToken: true,
46
- }).catch((err) => {
47
- throw new Error(`Failed to kick server member. ${err.message}`);
48
42
  });
49
43
  }