@seedcord/core 0.1.4 → 0.2.0-next.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 (60) hide show
  1. package/README.md +35 -5
  2. package/dist/{subscribers-nEpbJj3Z.mjs → Bus-DcuUtOEL.mjs} +401 -31
  3. package/dist/Bus-DcuUtOEL.mjs.map +1 -0
  4. package/dist/{HmrModuleHandler-KxRP8lqJ.mjs → HmrModuleHandler-9AUfKXRl.mjs} +2 -2
  5. package/dist/{HmrModuleHandler-KxRP8lqJ.mjs.map → HmrModuleHandler-9AUfKXRl.mjs.map} +1 -1
  6. package/dist/{Plugin-CDAV7P9l.mjs → Plugin-Bkeqcjy6.mjs} +12 -3
  7. package/dist/Plugin-Bkeqcjy6.mjs.map +1 -0
  8. package/dist/{Plugin-qRc7Ch4g.d.mts → Plugin-Cl5P7-PO.d.mts} +19 -7
  9. package/dist/{cursor-D207VrRo.mjs → cursor-B07ArwDz.mjs} +4 -4
  10. package/dist/cursor-B07ArwDz.mjs.map +1 -0
  11. package/dist/{cursor-C77xH5QT.d.mts → cursor-__0_F4rW.d.mts} +10 -3
  12. package/dist/hmr.index.mjs +1 -1
  13. package/dist/{index-C0k7lRDi.d.mts → index-TYnQ-ztr.d.mts} +15 -4
  14. package/dist/index.d.mts +24 -11
  15. package/dist/index.mjs +26 -6
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/internal.index.d.mts +13 -18
  18. package/dist/internal.index.mjs +16 -48
  19. package/dist/internal.index.mjs.map +1 -1
  20. package/dist/node-internal.index.d.mts +6 -5
  21. package/dist/node-internal.index.mjs +54 -49
  22. package/dist/node-internal.index.mjs.map +1 -1
  23. package/dist/plugin.index.d.mts +1 -1
  24. package/dist/plugin.index.mjs +1 -1
  25. package/dist/subscribers-DuHg-bGT.mjs +3 -0
  26. package/package.json +25 -34
  27. package/dist/HmrModuleHandler-CxGOo1LT.cjs +0 -182
  28. package/dist/HmrModuleHandler-CxGOo1LT.cjs.map +0 -1
  29. package/dist/Plugin-CDAV7P9l.mjs.map +0 -1
  30. package/dist/Plugin-DVNh1kvX.cjs +0 -95
  31. package/dist/Plugin-DVNh1kvX.cjs.map +0 -1
  32. package/dist/cursor-D207VrRo.mjs.map +0 -1
  33. package/dist/cursor-DFgJ70_B.cjs +0 -1339
  34. package/dist/cursor-DFgJ70_B.cjs.map +0 -1
  35. package/dist/devChannel-Cdnmz6hd.cjs +0 -25
  36. package/dist/devChannel-Cdnmz6hd.cjs.map +0 -1
  37. package/dist/hmr.index.cjs +0 -4
  38. package/dist/hmr.index.d.cts +0 -1
  39. package/dist/index.cjs +0 -889
  40. package/dist/index.cjs.map +0 -1
  41. package/dist/index.d.cts +0 -1
  42. package/dist/internal.index.cjs +0 -717
  43. package/dist/internal.index.cjs.map +0 -1
  44. package/dist/internal.index.d.cts +0 -1
  45. package/dist/node-internal.index.cjs +0 -799
  46. package/dist/node-internal.index.cjs.map +0 -1
  47. package/dist/node-internal.index.d.cts +0 -1
  48. package/dist/phases-8qiiLKjS.cjs +0 -42
  49. package/dist/phases-8qiiLKjS.cjs.map +0 -1
  50. package/dist/plugin.index.cjs +0 -4
  51. package/dist/plugin.index.d.cts +0 -1
  52. package/dist/publishDefault-BCrMG9T8.mjs +0 -273
  53. package/dist/publishDefault-BCrMG9T8.mjs.map +0 -1
  54. package/dist/publishDefault-D52iT8mF.cjs +0 -368
  55. package/dist/publishDefault-D52iT8mF.cjs.map +0 -1
  56. package/dist/slashRouteLeaves-HVl6Ymr0.cjs +0 -28
  57. package/dist/slashRouteLeaves-HVl6Ymr0.cjs.map +0 -1
  58. package/dist/subscribers-6x4xw39Z.cjs +0 -531
  59. package/dist/subscribers-6x4xw39Z.cjs.map +0 -1
  60. package/dist/subscribers-nEpbJj3Z.mjs.map +0 -1
@@ -1,717 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_publishDefault = require('./publishDefault-D52iT8mF.cjs');
3
- const require_cursor = require('./cursor-DFgJ70_B.cjs');
4
- const require_devChannel = require('./devChannel-Cdnmz6hd.cjs');
5
- const require_slashRouteLeaves = require('./slashRouteLeaves-HVl6Ymr0.cjs');
6
- require("reflect-metadata");
7
- let _discordjs_builders = require("@discordjs/builders");
8
- let _seedcord_logger = require("@seedcord/logger");
9
- let _seedcord_errors = require("@seedcord/errors");
10
- let _seedcord_errors_internal = require("@seedcord/errors/internal");
11
- let _seedcord_utils = require("@seedcord/utils");
12
- let envapt = require("envapt");
13
-
14
- //#region src/gates/runGates.ts
15
- function routeIdOf(handlerCtor) {
16
- for (const [kind, key] of Object.entries(require_publishDefault.InteractionRouteKeys)) {
17
- const routes = Reflect.getMetadata(key, handlerCtor);
18
- if (routes?.length) return `${kind}:${routes.join(",")}`;
19
- }
20
- return null;
21
- }
22
- async function timedCheck(gate, ctx, observe) {
23
- const start = performance.now();
24
- try {
25
- await require_cursor.runCheck(gate, ctx);
26
- } finally {
27
- observe(gate.name, performance.now() - start);
28
- }
29
- }
30
- async function runGates(gates, ctx, observe) {
31
- try {
32
- for (const gate of gates) await (observe ? timedCheck(gate, ctx, observe) : require_cursor.runCheck(gate, ctx));
33
- await require_cursor.runCommits(ctx);
34
- } finally {
35
- require_cursor.discardCommits(ctx);
36
- }
37
- }
38
- async function runHandlerGates(handlerCtor, ctx, routeId, observe) {
39
- const gates = Reflect.getMetadata(require_publishDefault.GatedMetadataKey, handlerCtor);
40
- if (!gates) return;
41
- await runGates(gates, {
42
- ...ctx,
43
- routeId: routeId ?? routeIdOf(handlerCtor)
44
- }, observe);
45
- }
46
-
47
- //#endregion
48
- //#region src/gates/slowGate.ts
49
- const SLOW_GATE_MS = 750;
50
- let gateLogger;
51
- function logger$2() {
52
- gateLogger ??= new _seedcord_logger.Logger("Gates", { channel: "gates" });
53
- return gateLogger;
54
- }
55
- function slowGateMonitor() {
56
- if (envapt.Envapter.isProduction) return void 0;
57
- const readings = [];
58
- return {
59
- observe: (name, ms) => readings.push({
60
- name,
61
- ms
62
- }),
63
- report(routeId) {
64
- const total = readings.reduce((sum, reading) => sum + reading.ms, 0);
65
- if (total < SLOW_GATE_MS) return;
66
- const shares = readings.toSorted((a, b) => b.ms - a.ms).map((reading) => `${_seedcord_logger.paint.sky.bold(reading.name)} ${Math.round(reading.ms)}ms`);
67
- const headline = `gates${routeId === null ? "" : ` for ${_seedcord_logger.paint.sky.bold(routeId)}`} took ${_seedcord_logger.paint.amber(`${Math.round(total)}ms`)} of the 3s ack budget`;
68
- logger$2().utils.block(headline, shares, "warn", (text) => text);
69
- }
70
- };
71
- }
72
-
73
- //#endregion
74
- //#region src/miscellaneous/emojiConfig.ts
75
- function isEmojiTuple(value) {
76
- return Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "string";
77
- }
78
-
79
- //#endregion
80
- //#region src/hmr/wrapHot.ts
81
- /** @internal */
82
- function wrapHot(hot) {
83
- return {
84
- send: (event, data) => hot.send(event, data),
85
- on: (event, cb) => hot.on(event, cb)
86
- };
87
- }
88
-
89
- //#endregion
90
- //#region src/hmr/HmrManager.ts
91
- var HmrManager = class {
92
- logger = new _seedcord_logger.Logger("HMR", { channel: "hmr" });
93
- listeners = /* @__PURE__ */ new Set();
94
- /** @internal */
95
- init() {
96
- if (!{}.hot) return;
97
- const channel = wrapHot({}.hot);
98
- require_devChannel.setDevChannel(channel);
99
- if (envapt.Envapter.isDevelopment || envapt.Envapter.isTest) {
100
- this.logger.debug("Enabled");
101
- channel.on("seedcord:hmr", (payload) => void this.handleUpdate(payload));
102
- }
103
- }
104
- /** @internal */
105
- register(listener) {
106
- this.listeners.add(listener);
107
- }
108
- /** @internal */
109
- unregister(listener) {
110
- this.listeners.delete(listener);
111
- }
112
- async handleUpdate(event) {
113
- const promises = [...this.listeners].map(async (listener) => {
114
- try {
115
- await listener.onHmr(event);
116
- } catch (error) {
117
- this.logger.error(`Error handling HMR update in ${_seedcord_logger.paint.sky.bold(listener.constructor.name)}`, error);
118
- }
119
- });
120
- await Promise.all(promises);
121
- }
122
- };
123
-
124
- //#endregion
125
- //#region src/stops/asError.ts
126
- /** @internal */
127
- function asError(caught) {
128
- return Error.isError(caught) ? caught : new Error(String(caught), { cause: caught });
129
- }
130
-
131
- //#endregion
132
- //#region src/reply/ackLegality.ts
133
- const showModalReason = {
134
- reason: "this interaction was already acknowledged",
135
- alternative: "showModal() must be the initial response."
136
- };
137
- function deferReason(what) {
138
- return {
139
- reason: `this interaction was already acknowledged with ${what}`,
140
- alternative: "A deferral can only be the initial response."
141
- };
142
- }
143
- const ILLEGAL = {
144
- reply: {
145
- "deferred-reply": {
146
- reason: "this interaction was already deferred",
147
- alternative: "Use edit() to fill the deferred reply or followUp() for a new message."
148
- },
149
- "deferred-update": {
150
- reason: "this interaction was already acknowledged with a deferred update",
151
- alternative: "Use followUp() for a new message."
152
- },
153
- replied: {
154
- reason: "this interaction was already replied to",
155
- alternative: "Use followUp() for a new message or edit() to rewrite the reply."
156
- }
157
- },
158
- defer: {
159
- "deferred-reply": deferReason("a deferred reply"),
160
- "deferred-update": deferReason("a deferred update"),
161
- replied: deferReason("a reply")
162
- },
163
- deferUpdate: {
164
- "deferred-reply": deferReason("a deferred reply"),
165
- "deferred-update": deferReason("a deferred update"),
166
- replied: deferReason("a reply")
167
- },
168
- update: {
169
- "deferred-reply": {
170
- reason: "this interaction was deferred as a reply",
171
- alternative: "The placeholder is yours via edit(). update() rewrites a source message."
172
- },
173
- replied: {
174
- reason: "this interaction was already replied to",
175
- alternative: "update() rewrites a source message. Use edit() or followUp() instead."
176
- }
177
- },
178
- followUp: { unacked: {
179
- reason: "this interaction has not been acknowledged yet",
180
- alternative: "Ack first with reply() or defer()."
181
- } },
182
- edit: { unacked: {
183
- reason: "nothing has been sent yet",
184
- alternative: "Send with reply() or defer() first, then edit() rewrites it."
185
- } },
186
- delete: { unacked: {
187
- reason: "nothing has been sent yet",
188
- alternative: "Acknowledge first with reply() or defer(), then delete() removes it."
189
- } },
190
- showModal: {
191
- "deferred-reply": showModalReason,
192
- "deferred-update": showModalReason,
193
- replied: showModalReason
194
- }
195
- };
196
- const SEND_TARGET = {
197
- unacked: "reply",
198
- "deferred-reply": "edit",
199
- "deferred-update": "followUp",
200
- replied: "followUp"
201
- };
202
- function checkAckLegality(method, state, routeId, ackedBy) {
203
- if (method === "send") return;
204
- const illegal = ILLEGAL[method][state];
205
- if (!illegal) return;
206
- throw new _seedcord_errors_internal.SeedcordError(_seedcord_errors.SeedcordErrorCode.ReplyIllegalAckState, [
207
- method,
208
- illegal.reason,
209
- illegal.alternative,
210
- routeId
211
- ], { cause: ackedBy });
212
- }
213
- function sendTarget(state) {
214
- return SEND_TARGET[state];
215
- }
216
-
217
- //#endregion
218
- //#region src/reply/AckTrace.ts
219
- var AckTrace = class extends Error {
220
- constructor(method) {
221
- super(`${method}() acknowledged this interaction`);
222
- this.name = "AckTrace";
223
- }
224
- };
225
-
226
- //#endregion
227
- //#region src/reply/responseReport.ts
228
- let replyLogger;
229
- function logger$1() {
230
- replyLogger ??= new _seedcord_logger.Logger("Reply", { channel: "interactions" });
231
- return replyLogger;
232
- }
233
- /** @internal */
234
- function publishResponse(telemetry, report) {
235
- const durationMs = performance.now() - report.startedAt;
236
- telemetry.bus[require_publishDefault.PublishDefault]("responseAttempted", {
237
- routeId: report.routeId,
238
- interactionId: telemetry.interactionId,
239
- method: report.method,
240
- outcome: report.outcome,
241
- durationMs,
242
- messageId: report.messageId,
243
- ...report.error && { error: report.error }
244
- });
245
- logger$1().trace(`${_seedcord_logger.paint.mint.bold(report.routeId)} ${report.method} ${report.outcome} ${_seedcord_logger.paint.mute("in")} ${Math.round(durationMs)}ms`);
246
- }
247
- async function reportedWrite(telemetry, routeId, method, write) {
248
- const startedAt = performance.now();
249
- const result = await attemptWrite(telemetry, routeId, method, startedAt, write);
250
- publishResponse(telemetry, {
251
- routeId,
252
- method,
253
- startedAt,
254
- outcome: "sent",
255
- messageId: null
256
- });
257
- return result;
258
- }
259
- async function attemptWrite(telemetry, routeId, method, startedAt, write) {
260
- try {
261
- return await write();
262
- } catch (caught) {
263
- publishResponse(telemetry, {
264
- routeId,
265
- method,
266
- startedAt,
267
- outcome: "failed",
268
- messageId: null,
269
- error: asError(caught)
270
- });
271
- throw caught;
272
- }
273
- }
274
-
275
- //#endregion
276
- //#region src/reply/translateSerialization.ts
277
- const MAX_DEPTH = 8;
278
- const OPERATOR_WORD = {
279
- "<=": "at most",
280
- ">=": "at least",
281
- "<": "fewer than",
282
- ">": "more than"
283
- };
284
- const KIND_WORD = {
285
- string: "a string",
286
- number: "a number",
287
- boolean: "a boolean",
288
- bigint: "a bigint",
289
- array: "a list",
290
- tuple: "a list",
291
- date: "a date",
292
- object: "an object"
293
- };
294
- function asRecord(value) {
295
- return typeof value === "object" && value !== null ? value : null;
296
- }
297
- function firstLine(message) {
298
- if (typeof message !== "string") return "unknown validation failure";
299
- return message.split("\n")[0] ?? message;
300
- }
301
- const GIVEN_PREVIEW_LIMIT = 40;
302
- function gotPhrase(given) {
303
- if (given === void 0) return "nothing";
304
- if (given === null) return "null";
305
- if (typeof given === "string") {
306
- if (given.length === 0) return "an empty string";
307
- if (given.length > GIVEN_PREVIEW_LIMIT) return `${given.length} characters`;
308
- return JSON.stringify(given);
309
- }
310
- if (Array.isArray(given)) return given.length === 0 ? "an empty list" : `${given.length} items`;
311
- if (typeof given === "number" || typeof given === "bigint" || typeof given === "boolean") return String(given);
312
- if (typeof given === "object") return given.constructor?.name ?? "an object";
313
- return typeof given;
314
- }
315
- function needPhrase(expected, given) {
316
- const bounds = [...expected.matchAll(/expected(\.length)?\s*(<=|>=|<|>)\s*(\d+)/g)];
317
- if (bounds.length === 0) return null;
318
- return bounds.map(([, lengthPart, operator, limit]) => {
319
- const word = OPERATOR_WORD[operator ?? ""] ?? operator ?? "";
320
- if (!lengthPart) return `${word} ${limit}`;
321
- const unit = typeof given === "string" ? "character" : "item";
322
- return `${word} ${limit} ${Number(limit) === 1 ? unit : `${unit}s`}`;
323
- }).join(" and ");
324
- }
325
- function instanceName(expected) {
326
- if (typeof expected === "function" && expected.name) return expected.name;
327
- return "specific class instance";
328
- }
329
- function describeLeaf(record) {
330
- if (typeof record.constraint === "string") {
331
- const need = typeof record.expected === "string" ? needPhrase(record.expected, record.given) : null;
332
- if (need) return `need ${need}, got ${gotPhrase(record.given)}`;
333
- return `${firstLine(record.message)}${"given" in record ? ` (got ${gotPhrase(record.given)})` : ""}`;
334
- }
335
- if (typeof record.expected === "function") return `need a ${instanceName(record.expected)}, got ${gotPhrase(record.given)}`;
336
- if (typeof record.validator === "string") {
337
- const kind = KIND_WORD[record.validator.replace(/^s\./, "").replace(/\(.*$/, "")];
338
- if (kind) return `need ${kind}, got ${gotPhrase(record.given)}`;
339
- return `${firstLine(record.message)}, got ${gotPhrase(record.given)}`;
340
- }
341
- return firstLine(record.message);
342
- }
343
- function describeUnion(branches, depth) {
344
- const records = [];
345
- for (const branch of branches) {
346
- const record = asRecord(branch);
347
- if (record) records.push(record);
348
- }
349
- const bounded = records.find((record) => typeof record.constraint === "string");
350
- if (bounded) return describeLeaf(bounded);
351
- const names = [];
352
- let allInstances = records.length > 0;
353
- for (const record of records) if (typeof record.expected === "function") names.push(instanceName(record.expected));
354
- else allInstances = false;
355
- if (allInstances) return `need a ${[...new Set(names)].join(" or ")}, got ${gotPhrase(records[0]?.given)}`;
356
- return detailOf(branches[0], depth + 1);
357
- }
358
- function detailOf(value, depth) {
359
- const record = asRecord(value);
360
- if (!record || depth >= MAX_DEPTH) return firstLine(record?.message);
361
- if (Array.isArray(record.errors) && record.errors.length > 0) {
362
- const errors = record.errors;
363
- const [first] = errors;
364
- if (Array.isArray(first)) {
365
- const [key, inner] = first;
366
- return `${String(key)}: ${detailOf(inner, depth + 1)}`;
367
- }
368
- return describeUnion(errors, depth);
369
- }
370
- return describeLeaf(record);
371
- }
372
- function translateSerializationError(error, componentClass, index, routeId) {
373
- const detail = detailOf(error, 0);
374
- return new _seedcord_errors_internal.SeedcordError(_seedcord_errors.SeedcordErrorCode.ReplyComponentSerialization, [
375
- componentClass,
376
- index,
377
- detail,
378
- routeId
379
- ], { cause: error });
380
- }
381
-
382
- //#endregion
383
- //#region src/reply/serializeReply.ts
384
- function serializeReply(response, routeId) {
385
- if (typeof response === "string") try {
386
- return { components: [new _discordjs_builders.TextDisplayBuilder().setContent(response).toJSON()] };
387
- } catch (error) {
388
- throw translateSerializationError(error, "TextDisplayBuilder", 0, routeId);
389
- }
390
- return {
391
- components: response.components.map((component, index) => {
392
- try {
393
- return component.toJSON();
394
- } catch (error) {
395
- const name = component.constructor?.name;
396
- throw translateSerializationError(error, !name || name === "Object" ? "component" : name, index, routeId);
397
- }
398
- }),
399
- ...response.allowedMentions && { allowedMentions: response.allowedMentions },
400
- ...response.files && { files: response.files }
401
- };
402
- }
403
-
404
- //#endregion
405
- //#region src/reply/BaseReplySender.ts
406
- /**
407
- * Tracks acknowledgement state and throws a translated `SeedcordError` on an illegal verb before any
408
- * transport call. Every verb runs the legality check, calls the transport's wire writer, then updates
409
- * the state and the ack trace. Each transport binds `TMessage` to its own created-message type and
410
- * supplies the writers.
411
- */
412
- var BaseReplySender = class {
413
- routeId;
414
- telemetry;
415
- state;
416
- sent = /* @__PURE__ */ new Set();
417
- ackedBy;
418
- constructor(routeId, telemetry, initialState = "unacked") {
419
- this.routeId = routeId;
420
- this.telemetry = telemetry;
421
- this.state = initialState;
422
- }
423
- report(method, startedAt, outcome, messageId) {
424
- publishResponse(this.telemetry, {
425
- routeId: this.routeId,
426
- method,
427
- startedAt,
428
- outcome,
429
- messageId
430
- });
431
- }
432
- async attempt(method, startedAt, write) {
433
- return await attemptWrite(this.telemetry, this.routeId, method, startedAt, write);
434
- }
435
- async reply(response, opts) {
436
- this.checkLegality("reply");
437
- const startedAt = performance.now();
438
- const created = await this.attempt("reply", startedAt, () => this.writeReply(response, opts));
439
- this.transition("reply", "replied");
440
- const message = this.remember(this.requireMessage(created, "reply"));
441
- this.report("reply", startedAt, "sent", message.id);
442
- return message;
443
- }
444
- async defer(opts) {
445
- this.checkLegality("defer");
446
- const startedAt = performance.now();
447
- await this.attempt("defer", startedAt, () => this.writeDefer(opts));
448
- this.transition("defer", "deferred-reply");
449
- this.report("defer", startedAt, "sent", null);
450
- }
451
- async deferUpdate() {
452
- this.checkLegality("deferUpdate");
453
- const startedAt = performance.now();
454
- await this.attempt("deferUpdate", startedAt, () => this.writeDeferUpdate());
455
- this.transition("deferUpdate", "deferred-update");
456
- this.report("deferUpdate", startedAt, "sent", null);
457
- }
458
- /**
459
- * After a deferUpdate the state stays deferred-update. Calling this again rewrites. The returned message
460
- * is the source message, editable only through a bare `update` or `edit`. A targeted `edit` or `delete`
461
- * of it throws the foreign-target error.
462
- */
463
- async update(response) {
464
- this.checkLegality("update");
465
- const startedAt = performance.now();
466
- if (this.state === "deferred-update") {
467
- const edited = await this.attempt("update", startedAt, () => this.editOriginal(response));
468
- this.report("update", startedAt, "sent", edited.id);
469
- return edited;
470
- }
471
- const created = await this.attempt("update", startedAt, () => this.writeUpdate(response));
472
- this.transition("update", "replied");
473
- const message = this.remember(this.requireMessage(created, "update"));
474
- this.report("update", startedAt, "sent", message.id);
475
- return message;
476
- }
477
- async followUp(response, opts) {
478
- this.checkLegality("followUp");
479
- const startedAt = performance.now();
480
- const created = await this.attempt("followUp", startedAt, () => this.writeFollowUp(response, opts));
481
- const message = this.remember(created);
482
- this.report("followUp", startedAt, "sent", message.id);
483
- return message;
484
- }
485
- async edit(targetOrResponse, maybeResponse) {
486
- this.checkLegality("edit");
487
- const startedAt = performance.now();
488
- if (maybeResponse === void 0) {
489
- const edited = await this.attempt("edit", startedAt, () => this.editOriginal(targetOrResponse));
490
- this.report("edit", startedAt, "sent", edited.id);
491
- return edited;
492
- }
493
- const target = targetOrResponse;
494
- if (!this.sent.has(target.id)) throw new _seedcord_errors_internal.SeedcordError(_seedcord_errors.SeedcordErrorCode.ReplyForeignEditTarget, [
495
- "edit",
496
- target.id,
497
- this.routeId
498
- ]);
499
- const written = await this.attempt("edit", startedAt, () => this.writeEditTarget(target.id, maybeResponse));
500
- const message = this.remember(written);
501
- this.report("edit", startedAt, "sent", message.id);
502
- return message;
503
- }
504
- async delete(target) {
505
- this.checkLegality("delete");
506
- const startedAt = performance.now();
507
- if (target === void 0) {
508
- await this.attempt("delete", startedAt, () => this.writeDeleteOriginal());
509
- this.report("delete", startedAt, "sent", null);
510
- return;
511
- }
512
- if (!this.sent.has(target.id)) throw new _seedcord_errors_internal.SeedcordError(_seedcord_errors.SeedcordErrorCode.ReplyForeignEditTarget, [
513
- "delete",
514
- target.id,
515
- this.routeId
516
- ]);
517
- await this.attempt("delete", startedAt, () => this.writeDeleteTarget(target.id));
518
- this.sent.delete(target.id);
519
- this.report("delete", startedAt, "sent", null);
520
- }
521
- /** Routes to the verb the current ack state permits. Every state has a route, so the illegal-ack throw is unreachable. */
522
- async send(response, opts) {
523
- const target = sendTarget(this.state);
524
- if (target === "reply") return await this.reply(response, opts);
525
- if (target === "edit") return await this.edit(response);
526
- return await this.followUp(response, opts);
527
- }
528
- /** Must be the initial response. */
529
- async showModal(modal) {
530
- this.checkLegality("showModal");
531
- this.guardModalSource();
532
- let data;
533
- try {
534
- data = modal.toJSON();
535
- } catch (error) {
536
- const name = modal.constructor?.name;
537
- throw translateSerializationError(error, !name || name === "Object" ? "modal" : name, 0, this.routeId);
538
- }
539
- const startedAt = performance.now();
540
- await this.attempt("showModal", startedAt, () => this.writeModal(data));
541
- this.transition("showModal", "replied");
542
- this.report("showModal", startedAt, "sent", null);
543
- }
544
- serialize(response) {
545
- return serializeReply(response, this.routeId);
546
- }
547
- remember(created) {
548
- this.sent.add(created.id);
549
- return created;
550
- }
551
- requireMessage(created, method) {
552
- if (!created) throw new _seedcord_errors_internal.SeedcordError(_seedcord_errors.SeedcordErrorCode.ReplyCallbackMissingMessage, [method, this.routeId]);
553
- return created;
554
- }
555
- async editOriginal(response) {
556
- const edited = await this.writeEditOriginal(response);
557
- if (this.state !== "deferred-update") this.remember(edited);
558
- return edited;
559
- }
560
- checkLegality(method) {
561
- checkAckLegality(method, this.state, this.routeId, this.ackedBy);
562
- }
563
- transition(method, state) {
564
- this.state = state;
565
- this.ackedBy = new AckTrace(method);
566
- }
567
- guardModalSource() {}
568
- };
569
-
570
- //#endregion
571
- //#region src/subscribers/FaultThrottle.ts
572
- /** @internal */
573
- var FaultThrottle = class FaultThrottle {
574
- windowMs;
575
- now;
576
- static perCore = /* @__PURE__ */ new WeakMap();
577
- /** @internal */
578
- static for(core) {
579
- let throttle = FaultThrottle.perCore.get(core);
580
- if (!throttle) {
581
- throttle = new FaultThrottle();
582
- FaultThrottle.perCore.set(core, throttle);
583
- }
584
- return throttle;
585
- }
586
- lastReportedAt = /* @__PURE__ */ new Map();
587
- constructor(windowMs = 6e4, now = () => Date.now()) {
588
- this.windowMs = windowMs;
589
- this.now = now;
590
- }
591
- shouldReport(key) {
592
- const last = this.lastReportedAt.get(key);
593
- if (last === void 0) return true;
594
- if (this.now() - last < this.windowMs) return false;
595
- this.lastReportedAt.delete(key);
596
- return true;
597
- }
598
- markReported(key) {
599
- this.lastReportedAt.set(key, this.now());
600
- }
601
- clear() {
602
- this.lastReportedAt.clear();
603
- }
604
- };
605
-
606
- //#endregion
607
- //#region src/dispatch/dispatchReport.ts
608
- let dispatchLogger;
609
- function logger() {
610
- dispatchLogger ??= new _seedcord_logger.Logger("Dispatch", { channel: "interactions" });
611
- return dispatchLogger;
612
- }
613
- /**
614
- * Classifies a caught stop for `interactionDispatched` so a gate and a
615
- * handler label the same stop identically.
616
- *
617
- * @internal
618
- */
619
- function outcomeFor(caught) {
620
- if (caught instanceof require_cursor.Silence) return "refused";
621
- if (caught instanceof require_cursor.Notice) return caught.report ? "failed" : "refused";
622
- return "failed";
623
- }
624
- /**
625
- * Discord's interaction creation to now, read from the snowflake. Called at dispatch entry, since
626
- * a later read would count the handler run into the queue time as well.
627
- *
628
- * @internal
629
- */
630
- function queuedMsFor(interactionId) {
631
- try {
632
- return Date.now() - (0, _seedcord_utils.timestampFromSnowflake)(interactionId);
633
- } catch {
634
- return 0;
635
- }
636
- }
637
- function reportDispatch(bus, report) {
638
- const durationMs = performance.now() - report.startedAt;
639
- bus[require_publishDefault.PublishDefault]("interactionDispatched", {
640
- routeId: report.routeId,
641
- interactionId: report.interactionId,
642
- kind: report.kind,
643
- outcome: report.outcome,
644
- fallback: report.fallback,
645
- durationMs,
646
- queuedMs: report.queuedMs
647
- });
648
- logger().trace(`${_seedcord_logger.paint.mint.bold(report.routeId)} ${report.outcome} ${_seedcord_logger.paint.mute("in")} ${Math.round(durationMs)}ms`);
649
- }
650
-
651
- //#endregion
652
- exports.AckTrace = AckTrace;
653
- exports.BaseReplySender = BaseReplySender;
654
- exports.CommandInjector = require_cursor.CommandInjector;
655
- exports.CommandMetadataKey = require_publishDefault.CommandMetadataKey;
656
- exports.ComponentDefsKey = require_cursor.ComponentDefsKey;
657
- exports.EventMetadataKey = require_publishDefault.EventMetadataKey;
658
- exports.FaultThrottle = FaultThrottle;
659
- exports.GateNotice = require_cursor.GateNotice;
660
- exports.GatedMetadataKey = require_publishDefault.GatedMetadataKey;
661
- exports.HasDangerousPermissions = require_cursor.HasDangerousPermissions;
662
- exports.HmrManager = HmrManager;
663
- exports.InteractionMetadataKey = require_publishDefault.InteractionMetadataKey;
664
- exports.InteractionRouteKeys = require_publishDefault.InteractionRouteKeys;
665
- exports.InteractionRoutes = require_publishDefault.InteractionRoutes;
666
- exports.MiddlewareMetadataKey = require_publishDefault.MiddlewareMetadataKey;
667
- exports.MissingPermissions = require_cursor.MissingPermissions;
668
- exports.MissingRole = require_cursor.MissingRole;
669
- exports.NeedsAny = require_cursor.NeedsAny;
670
- exports.NotAllowed = require_cursor.NotAllowed;
671
- exports.NotInDm = require_cursor.NotInDm;
672
- exports.NotInGuild = require_cursor.NotInGuild;
673
- exports.NotOwner = require_cursor.NotOwner;
674
- exports.NoticeCard = require_cursor.NoticeCard;
675
- exports.OnCooldown = require_cursor.OnCooldown;
676
- exports.PAGE_MAX = require_cursor.PAGE_MAX;
677
- exports.PermissionNames = require_cursor.PermissionNames;
678
- exports.PublishDefault = require_publishDefault.PublishDefault;
679
- exports.SubscribeMetadataKey = require_publishDefault.SubscribeMetadataKey;
680
- exports.WebhookUrlMetadataKey = require_publishDefault.WebhookUrlMetadataKey;
681
- exports.accessorStore = require_cursor.accessorStore;
682
- exports.areRoutes = require_cursor.areRoutes;
683
- exports.asError = asError;
684
- exports.checkAckLegality = checkAckLegality;
685
- exports.clearStore = require_cursor.clearStore;
686
- exports.contextMenuLeaves = require_publishDefault.contextMenuLeaves;
687
- exports.contextMenuRouteOf = require_cursor.contextMenuRouteOf;
688
- exports.decodeComponentRoute = require_cursor.decodeComponentRoute;
689
- exports.decodeFor = require_cursor.decodeFor;
690
- exports.deferFlags = require_publishDefault.deferFlags;
691
- exports.getDevChannel = require_devChannel.getDevChannel;
692
- exports.guardedAccessor = require_cursor.guardedAccessor;
693
- exports.interactionRoutesOf = require_cursor.interactionRoutesOf;
694
- exports.isEmojiTuple = isEmojiTuple;
695
- exports.outcomeFor = outcomeFor;
696
- exports.pageCursor = require_cursor.pageCursor;
697
- exports.pickNotice = require_cursor.pickNotice;
698
- exports.prefixOf = require_cursor.prefixOf;
699
- exports.queuedMsFor = queuedMsFor;
700
- exports.reportDispatch = reportDispatch;
701
- exports.reportedWrite = reportedWrite;
702
- exports.routeIdOf = routeIdOf;
703
- exports.runGates = runGates;
704
- exports.runHandlerGates = runHandlerGates;
705
- exports.selectMenuRouteOf = require_cursor.selectMenuRouteOf;
706
- exports.sendFlags = require_publishDefault.sendFlags;
707
- exports.sendTarget = sendTarget;
708
- exports.serializeReply = serializeReply;
709
- exports.setBotColor = require_publishDefault.setBotColor;
710
- exports.setDevChannel = require_devChannel.setDevChannel;
711
- exports.slashRouteLeaves = require_slashRouteLeaves.slashRouteLeaves;
712
- exports.slowGateMonitor = slowGateMonitor;
713
- exports.storeComponentRoute = require_cursor.storeComponentRoute;
714
- exports.storeInteractionRoute = require_cursor.storeInteractionRoute;
715
- exports.translateSerializationError = translateSerializationError;
716
- exports.wrapHot = wrapHot;
717
- //# sourceMappingURL=internal.index.cjs.map