@avakado.ai/schemas 1.1.28 → 1.1.29
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/enums.d.ts +1 -1
- package/package.json +1 -1
- package/src/enums/index.js +28 -1
- package/src/index.js +1 -0
- package/src/statusTrigger.js +40 -8
- package/types.d.ts +20 -0
package/enums.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// Generated by scripts/emit-types.mjs. Run `npm run types` after a schema change.
|
|
2
2
|
|
|
3
|
-
export { CAMPAIGN_STATUS, CONVERSATION_PRIORITY, CONVERSATION_STATUS, CURRENT_SUBSCRIPTION_STATUSES, LEDGER_CATEGORY, LEDGER_DIRECTIONS, LEDGER_SOURCE_TYPES, LEDGER_STATUSES, OAUTH_GRANT_MODES, PAYMENT_STATUS, PENDING_CHANGE_TYPES, SUBSCRIPTION_STATUS, TASK_REFERENCE_TYPES, TASK_STATUS, TASK_TYPES } from "./types.js";
|
|
3
|
+
export { CAMPAIGN_STATUS, CONVERSATION_PRIORITY, CONVERSATION_STATUS, CURRENT_SUBSCRIPTION_STATUSES, EXOTEL_WEBHOOK_EVENTS, INSTAGRAM_WEBHOOK_EVENTS, LEDGER_CATEGORY, LEDGER_DIRECTIONS, LEDGER_SOURCE_TYPES, LEDGER_STATUSES, OAUTH_GRANT_MODES, PAYMENT_STATUS, PENDING_CHANGE_TYPES, SUBSCRIPTION_STATUS, TASK_REFERENCE_TYPES, TASK_STATUS, TASK_TYPES, TELEGRAM_WEBHOOK_EVENTS, WEBHOOK_TRIGGERS, WHATSAPP_CALL_EVENTS, WHATSAPP_CALL_STATUSES, WHATSAPP_MESSAGE_STATUSES, WORKFLOW_TRIGGERS } from "./types.js";
|
package/package.json
CHANGED
package/src/enums/index.js
CHANGED
|
@@ -7,7 +7,34 @@ export const LEAD_STATUS = ["new", "contacted", "qualified", "converted", "lost"
|
|
|
7
7
|
export const CONVERSATION_STATUS = ["open", "pending", "snoozed", "completed", "closed", "archived", "spam"];
|
|
8
8
|
export const CAMPAIGN_STATUS = ["pending", "active", "completed", "failed", "partial"];
|
|
9
9
|
export const TASK_STATUS = ["pending", "in-progress", "completed", "failed", "skipped"];
|
|
10
|
-
|
|
10
|
+
|
|
11
|
+
// Webhook events the channel adapters publish. Names are `{channel}_{event}`.
|
|
12
|
+
// Descriptions and sample payloads live on TriggerTemplate documents, not here.
|
|
13
|
+
export const WHATSAPP_MESSAGE_STATUSES = ["sent", "delivered", "read", "played", "failed", "deleted"];
|
|
14
|
+
export const WHATSAPP_CALL_EVENTS = ["connect", "terminate", "recording"];
|
|
15
|
+
export const WHATSAPP_CALL_STATUSES = ["ringing", "accepted", "rejected", "completed", "failed"];
|
|
16
|
+
export const INSTAGRAM_WEBHOOK_EVENTS = ["message", "postback", "read", "delivery", "reaction"];
|
|
17
|
+
export const TELEGRAM_WEBHOOK_EVENTS = ["message", "message_edited", "callback"];
|
|
18
|
+
export const EXOTEL_WEBHOOK_EVENTS = ["cancelled", "completed", "busy", "no_answer", "failed"];
|
|
19
|
+
|
|
20
|
+
export const WEBHOOK_TRIGGERS = [
|
|
21
|
+
"whatsapp_message",
|
|
22
|
+
"whatsapp_reaction",
|
|
23
|
+
...WHATSAPP_MESSAGE_STATUSES.map((status) => `whatsapp_message_${status}`),
|
|
24
|
+
...WHATSAPP_CALL_EVENTS.map((event) => `whatsapp_call_${event}`),
|
|
25
|
+
...WHATSAPP_CALL_STATUSES.map((status) => `whatsapp_call_${status}`),
|
|
26
|
+
...INSTAGRAM_WEBHOOK_EVENTS.map((event) => `instagram_${event}`),
|
|
27
|
+
...TELEGRAM_WEBHOOK_EVENTS.map((event) => `telegram_${event}`),
|
|
28
|
+
...EXOTEL_WEBHOOK_EVENTS.map((event) => `exotel_${event}`),
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
export const WORKFLOW_TRIGGERS = [
|
|
32
|
+
...LEAD_STATUS.map((status) => `lead_${status}`),
|
|
33
|
+
...CONVERSATION_STATUS.map((status) => `conversation_${status}`),
|
|
34
|
+
...CAMPAIGN_STATUS.map((status) => `campaign_${status}`),
|
|
35
|
+
...TASK_STATUS.map((status) => `task_${status}`),
|
|
36
|
+
...WEBHOOK_TRIGGERS,
|
|
37
|
+
];
|
|
11
38
|
export const CONVERSATION_PRIORITY = ["low", "normal", "high", "urgent"];
|
|
12
39
|
export const SUBSCRIPTION_STATUS = [
|
|
13
40
|
"created",
|
package/src/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./models/index.js";
|
|
|
3
3
|
export * from "./enums/index.js";
|
|
4
4
|
export * from "./media.js";
|
|
5
5
|
export { configureSchemas, defineModel, getSchemaConfig } from "./runtime.js";
|
|
6
|
+
export { publishWorkflowTrigger, WORKFLOW_TRIGGER_TOPIC } from "./statusTrigger.js";
|
|
6
7
|
export {
|
|
7
8
|
CHAT_SESSION_MS,
|
|
8
9
|
WHATSAPP_CALL_CALLBACK_MS,
|
package/src/statusTrigger.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { CAMPAIGN_STATUS, CONVERSATION_STATUS, LEAD_STATUS, TASK_STATUS } from "./enums/index.js";
|
|
2
|
+
import { CAMPAIGN_STATUS, CONVERSATION_STATUS, LEAD_STATUS, TASK_STATUS, WORKFLOW_TRIGGERS } from "./enums/index.js";
|
|
3
3
|
import { Workflow } from "./models/Workflow.js";
|
|
4
4
|
import { requireDep } from "./runtime.js";
|
|
5
5
|
|
|
@@ -130,23 +130,55 @@ async function messagesForActiveWorkflows(messages) {
|
|
|
130
130
|
return publishable;
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
async function
|
|
134
|
-
const
|
|
135
|
-
if (!
|
|
136
|
-
const sendKafkaMessage = requireDep("sendKafkaMessage", "workflow
|
|
137
|
-
for (let i = 0; i <
|
|
138
|
-
const batch =
|
|
133
|
+
async function publishTriggerMessages(messages) {
|
|
134
|
+
const publishable = await messagesForActiveWorkflows(messages);
|
|
135
|
+
if (!publishable.length) return;
|
|
136
|
+
const sendKafkaMessage = requireDep("sendKafkaMessage", "workflow trigger");
|
|
137
|
+
for (let i = 0; i < publishable.length; i += BATCH_SIZE) {
|
|
138
|
+
const batch = publishable.slice(i, i + BATCH_SIZE);
|
|
139
139
|
try {
|
|
140
140
|
await sendKafkaMessage({ topic: WORKFLOW_TRIGGER_TOPIC, messages: batch, acks: -1 });
|
|
141
141
|
} catch (error) {
|
|
142
142
|
console.error(
|
|
143
|
-
`@avakado.ai/schemas: failed to publish ${batch.length} workflow
|
|
143
|
+
`@avakado.ai/schemas: failed to publish ${batch.length} workflow trigger(s) on ${WORKFLOW_TRIGGER_TOPIC}`,
|
|
144
144
|
error?.message || error
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
async function publishStatusChanges(changes) {
|
|
151
|
+
await publishTriggerMessages(changes.map(statusTriggerMessage).filter(Boolean));
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function publishWorkflowTrigger({ trigger, businessId, payload = {}, entity } = {}) {
|
|
155
|
+
if (typeof trigger !== "string" || !WORKFLOW_TRIGGERS.includes(trigger)) return;
|
|
156
|
+
const resolvedBusinessId = businessId == null || businessId === "" ? "" : String(businessId?._id ?? businessId);
|
|
157
|
+
if (!resolvedBusinessId) return;
|
|
158
|
+
let bodyPayload = {};
|
|
159
|
+
try {
|
|
160
|
+
bodyPayload = JSON.parse(JSON.stringify(payload ?? {}));
|
|
161
|
+
} catch {
|
|
162
|
+
bodyPayload = {};
|
|
163
|
+
}
|
|
164
|
+
const eventId = randomUUID();
|
|
165
|
+
await publishTriggerMessages([{
|
|
166
|
+
key: resolvedBusinessId,
|
|
167
|
+
value: JSON.stringify({
|
|
168
|
+
eventId,
|
|
169
|
+
businessId: resolvedBusinessId,
|
|
170
|
+
trigger,
|
|
171
|
+
payload: bodyPayload,
|
|
172
|
+
}),
|
|
173
|
+
headers: {
|
|
174
|
+
eventId,
|
|
175
|
+
businessId: resolvedBusinessId,
|
|
176
|
+
trigger,
|
|
177
|
+
entity: entity || trigger.split("_")[0],
|
|
178
|
+
},
|
|
179
|
+
}]);
|
|
180
|
+
}
|
|
181
|
+
|
|
150
182
|
function writeApplied(result) {
|
|
151
183
|
if (result == null || typeof result !== "object") return false;
|
|
152
184
|
if ("matchedCount" in result || "modifiedCount" in result || "upsertedCount" in result) {
|
package/types.d.ts
CHANGED
|
@@ -762,3 +762,23 @@ export const TASK_STATUS: readonly ["pending", "in-progress", "completed", "fail
|
|
|
762
762
|
|
|
763
763
|
export const TASK_TYPES: readonly ["quick", "webhook"];
|
|
764
764
|
|
|
765
|
+
export const WHATSAPP_MESSAGE_STATUSES: readonly ["sent", "delivered", "read", "played", "failed", "deleted"];
|
|
766
|
+
|
|
767
|
+
export const WHATSAPP_CALL_EVENTS: readonly ["connect", "terminate", "recording"];
|
|
768
|
+
|
|
769
|
+
export const WHATSAPP_CALL_STATUSES: readonly ["ringing", "accepted", "rejected", "completed", "failed"];
|
|
770
|
+
|
|
771
|
+
export const INSTAGRAM_WEBHOOK_EVENTS: readonly ["message", "postback", "read", "delivery", "reaction"];
|
|
772
|
+
|
|
773
|
+
export const TELEGRAM_WEBHOOK_EVENTS: readonly ["message", "message_edited", "callback"];
|
|
774
|
+
|
|
775
|
+
export const EXOTEL_WEBHOOK_EVENTS: readonly ["cancelled", "completed", "busy", "no_answer", "failed"];
|
|
776
|
+
|
|
777
|
+
export const WEBHOOK_TRIGGERS: readonly string[];
|
|
778
|
+
|
|
779
|
+
export const WORKFLOW_TRIGGERS: readonly string[];
|
|
780
|
+
|
|
781
|
+
export const WORKFLOW_TRIGGER_TOPIC: "workflow-execution-trigger";
|
|
782
|
+
|
|
783
|
+
export function publishWorkflowTrigger(params?: { trigger?: string; businessId?: any; payload?: any; entity?: string }): Promise<void>;
|
|
784
|
+
|