@absolutejs/voice 0.0.22-beta.265 → 0.0.22-beta.267
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/index.js +22 -0
- package/dist/telephonyOutcome.d.ts +12 -0
- package/dist/testing/index.js +22 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -17401,6 +17401,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
17401
17401
|
const providers = uniqueSorted3(decisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
|
|
17402
17402
|
const sources = uniqueSorted3(decisions.map((decision) => decision.decision?.source ?? decision.source).filter((source) => typeof source === "string"));
|
|
17403
17403
|
const applied = decisions.filter((decision) => decision.applied === true).length;
|
|
17404
|
+
const duplicateDecisions = decisions.filter((decision) => decision.duplicate === true);
|
|
17405
|
+
const duplicateProviders = uniqueSorted3(duplicateDecisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
|
|
17406
|
+
const duplicateIdempotencyKeys = new Set(duplicateDecisions.map((decision) => decision.idempotencyKey).filter((key) => typeof key === "string" && key.length > 0)).size;
|
|
17407
|
+
const duplicateCampaignOutcomesApplied = duplicateDecisions.filter((decision) => isRecord(decision.campaignOutcome) && decision.campaignOutcome.applied === true).length;
|
|
17408
|
+
const duplicateOutcomeReasons = uniqueSorted3(duplicateDecisions.map((decision) => isRecord(decision.campaignOutcome) ? decision.campaignOutcome.reason : undefined).filter((reason) => typeof reason === "string"));
|
|
17404
17409
|
const routeResults = decisions.filter((decision) => isRecord(decision.routeResult)).length;
|
|
17405
17410
|
const missingSessionIds = decisions.filter((decision) => !decision.sessionId).length;
|
|
17406
17411
|
if (input.minDecisions !== undefined && decisions.length < input.minDecisions) {
|
|
@@ -17409,6 +17414,15 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
17409
17414
|
if (input.minApplied !== undefined && applied < input.minApplied) {
|
|
17410
17415
|
issues.push(`Expected at least ${String(input.minApplied)} applied telephony webhook decision(s), found ${String(applied)}.`);
|
|
17411
17416
|
}
|
|
17417
|
+
if (input.minDuplicates !== undefined && duplicateDecisions.length < input.minDuplicates) {
|
|
17418
|
+
issues.push(`Expected at least ${String(input.minDuplicates)} duplicate telephony webhook decision(s), found ${String(duplicateDecisions.length)}.`);
|
|
17419
|
+
}
|
|
17420
|
+
if (input.minDuplicateIdempotencyKeys !== undefined && duplicateIdempotencyKeys < input.minDuplicateIdempotencyKeys) {
|
|
17421
|
+
issues.push(`Expected at least ${String(input.minDuplicateIdempotencyKeys)} duplicate telephony webhook idempotency key(s), found ${String(duplicateIdempotencyKeys)}.`);
|
|
17422
|
+
}
|
|
17423
|
+
if (input.maxDuplicateCampaignOutcomesApplied !== undefined && duplicateCampaignOutcomesApplied > input.maxDuplicateCampaignOutcomesApplied) {
|
|
17424
|
+
issues.push(`Expected at most ${String(input.maxDuplicateCampaignOutcomesApplied)} duplicate telephony webhook campaign outcome application(s), found ${String(duplicateCampaignOutcomesApplied)}.`);
|
|
17425
|
+
}
|
|
17412
17426
|
if (input.maxMissingSessionIds !== undefined && missingSessionIds > input.maxMissingSessionIds) {
|
|
17413
17427
|
issues.push(`Expected at most ${String(input.maxMissingSessionIds)} telephony webhook decision(s) without sessionId, found ${String(missingSessionIds)}.`);
|
|
17414
17428
|
}
|
|
@@ -17418,6 +17432,9 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
17418
17432
|
for (const provider of findMissing3(providers, input.requiredProviders)) {
|
|
17419
17433
|
issues.push(`Missing telephony webhook provider: ${provider}.`);
|
|
17420
17434
|
}
|
|
17435
|
+
for (const provider of findMissing3(duplicateProviders, input.requiredDuplicateProviders)) {
|
|
17436
|
+
issues.push(`Missing duplicate telephony webhook provider: ${provider}.`);
|
|
17437
|
+
}
|
|
17421
17438
|
for (const action of findMissing3(actions, input.requiredActions)) {
|
|
17422
17439
|
issues.push(`Missing telephony webhook action: ${action}.`);
|
|
17423
17440
|
}
|
|
@@ -17429,6 +17446,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
17429
17446
|
applied,
|
|
17430
17447
|
decisions: decisions.length,
|
|
17431
17448
|
dispositions,
|
|
17449
|
+
duplicateCampaignOutcomesApplied,
|
|
17450
|
+
duplicateIdempotencyKeys,
|
|
17451
|
+
duplicateOutcomeReasons,
|
|
17452
|
+
duplicateProviders,
|
|
17453
|
+
duplicates: duplicateDecisions.length,
|
|
17432
17454
|
issues,
|
|
17433
17455
|
missingSessionIds,
|
|
17434
17456
|
ok: issues.length === 0,
|
|
@@ -74,7 +74,10 @@ export type VoiceTelephonyWebhookNormalizationEvidenceDecision = {
|
|
|
74
74
|
source?: VoiceTelephonyOutcomeDecision['source'] | string;
|
|
75
75
|
};
|
|
76
76
|
disposition?: VoiceCallDisposition | string;
|
|
77
|
+
duplicate?: boolean;
|
|
78
|
+
campaignOutcome?: unknown;
|
|
77
79
|
event?: VoiceTelephonyOutcomeProviderEvent;
|
|
80
|
+
idempotencyKey?: string;
|
|
78
81
|
provider?: VoiceTelephonyWebhookProvider | string;
|
|
79
82
|
routeResult?: unknown;
|
|
80
83
|
sessionId?: string;
|
|
@@ -85,8 +88,12 @@ export type VoiceTelephonyWebhookNormalizationEvidenceInput = {
|
|
|
85
88
|
maxMissingSessionIds?: number;
|
|
86
89
|
minApplied?: number;
|
|
87
90
|
minDecisions?: number;
|
|
91
|
+
minDuplicateIdempotencyKeys?: number;
|
|
92
|
+
minDuplicates?: number;
|
|
93
|
+
maxDuplicateCampaignOutcomesApplied?: number;
|
|
88
94
|
requiredActions?: VoiceTelephonyOutcomeAction[];
|
|
89
95
|
requiredDispositions?: VoiceCallDisposition[];
|
|
96
|
+
requiredDuplicateProviders?: VoiceTelephonyWebhookProvider[];
|
|
90
97
|
requiredProviders?: VoiceTelephonyWebhookProvider[];
|
|
91
98
|
requireRouteResults?: boolean;
|
|
92
99
|
};
|
|
@@ -95,6 +102,11 @@ export type VoiceTelephonyWebhookNormalizationEvidenceReport = {
|
|
|
95
102
|
applied: number;
|
|
96
103
|
decisions: number;
|
|
97
104
|
dispositions: VoiceCallDisposition[];
|
|
105
|
+
duplicateCampaignOutcomesApplied: number;
|
|
106
|
+
duplicateIdempotencyKeys: number;
|
|
107
|
+
duplicateOutcomeReasons: string[];
|
|
108
|
+
duplicateProviders: VoiceTelephonyWebhookProvider[];
|
|
109
|
+
duplicates: number;
|
|
98
110
|
issues: string[];
|
|
99
111
|
missingSessionIds: number;
|
|
100
112
|
ok: boolean;
|
package/dist/testing/index.js
CHANGED
|
@@ -8256,6 +8256,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
8256
8256
|
const providers = uniqueSorted(decisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
|
|
8257
8257
|
const sources = uniqueSorted(decisions.map((decision) => decision.decision?.source ?? decision.source).filter((source) => typeof source === "string"));
|
|
8258
8258
|
const applied = decisions.filter((decision) => decision.applied === true).length;
|
|
8259
|
+
const duplicateDecisions = decisions.filter((decision) => decision.duplicate === true);
|
|
8260
|
+
const duplicateProviders = uniqueSorted(duplicateDecisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
|
|
8261
|
+
const duplicateIdempotencyKeys = new Set(duplicateDecisions.map((decision) => decision.idempotencyKey).filter((key) => typeof key === "string" && key.length > 0)).size;
|
|
8262
|
+
const duplicateCampaignOutcomesApplied = duplicateDecisions.filter((decision) => isRecord(decision.campaignOutcome) && decision.campaignOutcome.applied === true).length;
|
|
8263
|
+
const duplicateOutcomeReasons = uniqueSorted(duplicateDecisions.map((decision) => isRecord(decision.campaignOutcome) ? decision.campaignOutcome.reason : undefined).filter((reason) => typeof reason === "string"));
|
|
8259
8264
|
const routeResults = decisions.filter((decision) => isRecord(decision.routeResult)).length;
|
|
8260
8265
|
const missingSessionIds = decisions.filter((decision) => !decision.sessionId).length;
|
|
8261
8266
|
if (input.minDecisions !== undefined && decisions.length < input.minDecisions) {
|
|
@@ -8264,6 +8269,15 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
8264
8269
|
if (input.minApplied !== undefined && applied < input.minApplied) {
|
|
8265
8270
|
issues.push(`Expected at least ${String(input.minApplied)} applied telephony webhook decision(s), found ${String(applied)}.`);
|
|
8266
8271
|
}
|
|
8272
|
+
if (input.minDuplicates !== undefined && duplicateDecisions.length < input.minDuplicates) {
|
|
8273
|
+
issues.push(`Expected at least ${String(input.minDuplicates)} duplicate telephony webhook decision(s), found ${String(duplicateDecisions.length)}.`);
|
|
8274
|
+
}
|
|
8275
|
+
if (input.minDuplicateIdempotencyKeys !== undefined && duplicateIdempotencyKeys < input.minDuplicateIdempotencyKeys) {
|
|
8276
|
+
issues.push(`Expected at least ${String(input.minDuplicateIdempotencyKeys)} duplicate telephony webhook idempotency key(s), found ${String(duplicateIdempotencyKeys)}.`);
|
|
8277
|
+
}
|
|
8278
|
+
if (input.maxDuplicateCampaignOutcomesApplied !== undefined && duplicateCampaignOutcomesApplied > input.maxDuplicateCampaignOutcomesApplied) {
|
|
8279
|
+
issues.push(`Expected at most ${String(input.maxDuplicateCampaignOutcomesApplied)} duplicate telephony webhook campaign outcome application(s), found ${String(duplicateCampaignOutcomesApplied)}.`);
|
|
8280
|
+
}
|
|
8267
8281
|
if (input.maxMissingSessionIds !== undefined && missingSessionIds > input.maxMissingSessionIds) {
|
|
8268
8282
|
issues.push(`Expected at most ${String(input.maxMissingSessionIds)} telephony webhook decision(s) without sessionId, found ${String(missingSessionIds)}.`);
|
|
8269
8283
|
}
|
|
@@ -8273,6 +8287,9 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
8273
8287
|
for (const provider of findMissing(providers, input.requiredProviders)) {
|
|
8274
8288
|
issues.push(`Missing telephony webhook provider: ${provider}.`);
|
|
8275
8289
|
}
|
|
8290
|
+
for (const provider of findMissing(duplicateProviders, input.requiredDuplicateProviders)) {
|
|
8291
|
+
issues.push(`Missing duplicate telephony webhook provider: ${provider}.`);
|
|
8292
|
+
}
|
|
8276
8293
|
for (const action of findMissing(actions, input.requiredActions)) {
|
|
8277
8294
|
issues.push(`Missing telephony webhook action: ${action}.`);
|
|
8278
8295
|
}
|
|
@@ -8284,6 +8301,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
|
|
|
8284
8301
|
applied,
|
|
8285
8302
|
decisions: decisions.length,
|
|
8286
8303
|
dispositions,
|
|
8304
|
+
duplicateCampaignOutcomesApplied,
|
|
8305
|
+
duplicateIdempotencyKeys,
|
|
8306
|
+
duplicateOutcomeReasons,
|
|
8307
|
+
duplicateProviders,
|
|
8308
|
+
duplicates: duplicateDecisions.length,
|
|
8287
8309
|
issues,
|
|
8288
8310
|
missingSessionIds,
|
|
8289
8311
|
ok: issues.length === 0,
|