@minesa-org/mini-interaction 0.4.11 → 0.4.12
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.
|
@@ -80,6 +80,7 @@ export declare class MiniInteraction {
|
|
|
80
80
|
private normalizeModuleExports;
|
|
81
81
|
private normalizeExportValue;
|
|
82
82
|
private walkFiles;
|
|
83
|
+
private scheduleBackgroundTask;
|
|
83
84
|
private getDefaultInitialResponse;
|
|
84
85
|
private isDeferredResponse;
|
|
85
86
|
private isImportableModule;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readFile, readdir } from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { pathToFileURL } from "node:url";
|
|
4
|
+
import { waitUntil as vercelWaitUntil } from "@vercel/functions";
|
|
4
5
|
import { ApplicationCommandType, InteractionResponseType, InteractionType, } from "discord-api-types/v10";
|
|
5
6
|
import { createCommandInteraction } from "../utils/CommandInteractionOptions.js";
|
|
6
7
|
import { createAppCommandInteraction, createMessageContextMenuInteraction, createUserContextMenuInteraction, } from "../utils/ContextMenuInteraction.js";
|
|
@@ -32,11 +33,16 @@ export class MiniInteraction {
|
|
|
32
33
|
createNodeHandler() {
|
|
33
34
|
return async (req, res) => {
|
|
34
35
|
let responseSent = false;
|
|
36
|
+
let resolveInitialCommit;
|
|
37
|
+
const initialCommitPromise = new Promise((resolve) => {
|
|
38
|
+
resolveInitialCommit = resolve;
|
|
39
|
+
});
|
|
35
40
|
const commitInitialResponse = (response) => {
|
|
36
41
|
if (responseSent)
|
|
37
42
|
return false;
|
|
38
43
|
this.sendJson(res, 200, response);
|
|
39
44
|
responseSent = true;
|
|
45
|
+
resolveInitialCommit?.();
|
|
40
46
|
return true;
|
|
41
47
|
};
|
|
42
48
|
try {
|
|
@@ -66,7 +72,24 @@ export class MiniInteraction {
|
|
|
66
72
|
this.sendJson(res, 200, { type: InteractionResponseType.Pong });
|
|
67
73
|
return;
|
|
68
74
|
}
|
|
69
|
-
const
|
|
75
|
+
const dispatchPromise = this.dispatch(interaction, commitInitialResponse);
|
|
76
|
+
const backgroundPromise = dispatchPromise.catch((error) => {
|
|
77
|
+
if (this.options.debug) {
|
|
78
|
+
console.error("[MiniInteraction] Background interaction processing failed", error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
const settled = await Promise.race([
|
|
82
|
+
dispatchPromise.then((response) => ({ kind: "result", response }), (error) => ({ kind: "error", error })),
|
|
83
|
+
initialCommitPromise.then(() => ({ kind: "committed" })),
|
|
84
|
+
]);
|
|
85
|
+
if (settled.kind === "committed") {
|
|
86
|
+
this.scheduleBackgroundTask(backgroundPromise);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (settled.kind === "error") {
|
|
90
|
+
throw settled.error;
|
|
91
|
+
}
|
|
92
|
+
const response = settled.response;
|
|
70
93
|
if (!responseSent) {
|
|
71
94
|
this.sendJson(res, 200, response ?? this.getDefaultInitialResponse(interaction));
|
|
72
95
|
responseSent = true;
|
|
@@ -389,6 +412,14 @@ export class MiniInteraction {
|
|
|
389
412
|
}));
|
|
390
413
|
return results.flat();
|
|
391
414
|
}
|
|
415
|
+
scheduleBackgroundTask(promise) {
|
|
416
|
+
try {
|
|
417
|
+
vercelWaitUntil(promise);
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
void promise;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
392
423
|
getDefaultInitialResponse(interaction) {
|
|
393
424
|
if (interaction.type === InteractionType.MessageComponent) {
|
|
394
425
|
return { type: InteractionResponseType.DeferredMessageUpdate };
|
package/package.json
CHANGED