crisp-api
Version:
Crisp API wrapper for Node - official, maintained by Crisp
794 lines (656 loc) • 22.3 kB
text/typescript
/*
* This file is part of node-crisp-api
*
* Copyright (c) 2025 Crisp IM SAS
* All rights belong to Crisp IM SAS
*/
/**************************************************************************
* IMPORTS
***************************************************************************/
// PROJECT: RESOURCES
import {
ConversationMessageType,
ConversationMessageUser,
ConversationState,
ConversationFileMessageContent,
ConversationAnimationMessageContent,
ConversationAudioMessageContent,
ConversationPickerMessageContent,
ConversationFieldMessageContent,
ConversationCarouselMessageContent,
ConversationEventMessageContent,
GeolocationInfo,
SystemInfo,
ConnectionInfo
} from "@/resources/WebsiteConversation";
/**************************************************************************
* TYPES + INTERFACES (COMMON)
***************************************************************************/
/**
* Common fields shared by every website-scoped event.
*/
export interface EventsWebsiteGeneric {
website_id: string;
}
/**
* Common fields shared by every session-scoped event.
*/
export interface EventsSessionGeneric extends EventsWebsiteGeneric {
session_id: string;
inbox_id: string | null;
}
export interface EventsOperator {
user_id: string;
avatar?: string | null;
nickname?: string;
}
/**************************************************************************
* TYPES + INTERFACES (SESSION EVENTS)
***************************************************************************/
export type EventsSessionAvailability = "online" | "offline";
export interface EventsSessionUpdateAvailability extends EventsSessionGeneric {
availability: EventsSessionAvailability;
}
export interface EventsSessionVerification {
identity: string;
method: string;
annotation: string;
}
export interface EventsSessionUpdateVerify extends EventsSessionGeneric {
is_verified: boolean;
verifications: EventsSessionVerification[];
routing_ids?: string[];
error?: "unknown";
}
export type EventsSessionRequestInitiated = EventsSessionGeneric;
export interface EventsSessionSetEmail extends EventsSessionGeneric {
email: string;
}
export interface EventsSessionSetPhone extends EventsSessionGeneric {
phone: string;
}
export interface EventsSessionSetAddress extends EventsSessionGeneric {
address: string;
}
export interface EventsSessionSetSubject extends EventsSessionGeneric {
subject: string;
}
export interface EventsSessionSetAvatar extends EventsSessionGeneric {
avatar: string;
}
export interface EventsSessionSetNickname extends EventsSessionGeneric {
nickname: string;
}
export interface EventsSessionSetOrigin extends EventsSessionGeneric {
origin: string;
}
export interface EventsSessionSetData extends EventsSessionGeneric {
data: Record<string, string | number | boolean>;
}
export interface EventsSessionSetSegments extends EventsSessionGeneric {
segments: string[];
}
export interface EventsSessionSetBlock extends EventsSessionGeneric {
is_blocked: boolean;
}
export interface EventsSessionSetOpened extends EventsSessionGeneric {
operator: EventsOperator;
}
export interface EventsSessionSetClosed extends EventsSessionGeneric {
operator: EventsOperator;
}
export interface EventsSessionParticipant {
target: string;
type: string;
}
export interface EventsSessionSetParticipants extends EventsSessionGeneric {
participants: EventsSessionParticipant[];
}
export interface EventsSessionSetMentions extends EventsSessionGeneric {
mentions: string[];
}
export interface EventsSessionSetRouting extends EventsSessionGeneric {
routing_id: string | null;
previous_routing_id: string | null;
}
export interface EventsSessionSetInbox extends EventsSessionGeneric {
previous_inbox_id: string | null;
}
export interface EventsSessionSetState extends EventsSessionGeneric {
state: ConversationState;
}
export interface EventsSessionSyncCapabilities extends EventsSessionGeneric {
capabilities: string[];
}
export interface EventsSessionSyncGeolocation extends EventsSessionGeneric {
geolocation: GeolocationInfo;
}
export interface EventsSessionSyncSystem extends EventsSessionGeneric {
system: SystemInfo;
}
export interface EventsSessionSyncNetworkInfo {
ip: string;
connection?: ConnectionInfo;
}
export interface EventsSessionSyncNetwork extends EventsSessionGeneric {
network: EventsSessionSyncNetworkInfo;
}
export interface EventsSessionSyncTimezone extends EventsSessionGeneric {
timezone: {
offset: number;
};
}
export interface EventsSessionSyncLocales extends EventsSessionGeneric {
locales: {
locales: string[];
};
}
export interface EventsSessionPage {
page_url: string;
page_title: string;
timestamp: number;
}
export interface EventsSessionSyncPages extends EventsSessionGeneric {
pages: EventsSessionPage[];
}
export interface EventsSessionEvent {
text: string;
data?: Record<string, string | number | boolean>;
color?: string;
timestamp: number;
}
export interface EventsSessionSyncEvents extends EventsSessionGeneric {
events: EventsSessionEvent[];
}
export interface EventsSessionRating {
stars: number;
comment?: string;
}
export interface EventsSessionSyncRating extends EventsSessionGeneric {
rating: EventsSessionRating;
}
export interface EventsSessionSyncTopic extends EventsSessionGeneric {
topic: string;
}
export type EventsSessionRemoved = EventsSessionGeneric;
export interface EventsSessionError extends EventsSessionGeneric {
type: string;
value: string;
previous_value: string;
}
/**************************************************************************
* TYPES + INTERFACES (MESSAGE EVENTS)
***************************************************************************/
export interface EventsMessageUpdated extends EventsSessionGeneric {
fingerprint: number;
content: string | ConversationPickerMessageContent;
}
/**
* Common fields shared by 'message:send' and 'message:received' events.
*/
export interface EventsMessageGeneric extends EventsSessionGeneric {
type: ConversationMessageType;
from: string;
origin: string;
fingerprint: number;
timestamp: number;
user: ConversationMessageUser;
mentions?: string[];
stamped?: boolean;
automated?: boolean;
}
export interface EventsMessageSendText extends EventsMessageGeneric {
type: "text";
content: string;
}
export interface EventsMessageSendFile extends EventsMessageGeneric {
type: "file";
content: ConversationFileMessageContent;
}
export interface EventsMessageSendAnimation extends EventsMessageGeneric {
type: "animation";
content: ConversationAnimationMessageContent;
}
export interface EventsMessageSendAudio extends EventsMessageGeneric {
type: "audio";
content: ConversationAudioMessageContent;
}
export interface EventsMessageSendPicker extends EventsMessageGeneric {
type: "picker";
content: ConversationPickerMessageContent;
}
export interface EventsMessageSendField extends EventsMessageGeneric {
type: "field";
content: ConversationFieldMessageContent;
}
export interface EventsMessageSendCarousel extends EventsMessageGeneric {
type: "carousel";
content: ConversationCarouselMessageContent;
}
/**
* Payload of a 'message:send' event (message sent by a visitor).
*/
export type EventsMessageSend =
| EventsMessageSendText
| EventsMessageSendFile
| EventsMessageSendAnimation
| EventsMessageSendAudio
| EventsMessageSendPicker
| EventsMessageSendField
| EventsMessageSendCarousel;
export interface EventsMessageReceivedNote extends EventsMessageGeneric {
type: "note";
content: string;
}
export interface EventsMessageReceivedEvent extends EventsMessageGeneric {
type: "event";
content: ConversationEventMessageContent;
}
/**
* Payload of a 'message:received' event (message sent by an operator).
*/
export type EventsMessageReceived =
| EventsMessageSendText
| EventsMessageReceivedNote
| EventsMessageSendFile
| EventsMessageSendAnimation
| EventsMessageSendAudio
| EventsMessageSendPicker
| EventsMessageSendField
| EventsMessageSendCarousel
| EventsMessageReceivedEvent;
export interface EventsMessageRemoved extends EventsSessionGeneric {
fingerprint: number;
}
export interface EventsMessageComposeSend extends EventsSessionGeneric {
type: "start" | "stop";
excerpt?: string;
timestamp: number;
}
export interface EventsMessageComposeReceive extends EventsSessionGeneric {
type: "start" | "stop";
excerpt?: string;
timestamp: number;
user: ConversationMessageUser;
}
export interface EventsMessageAcknowledge extends EventsSessionGeneric {
origin: string;
fingerprints: number[];
}
export interface EventsMessageAcknowledgeIgnoredDetails {
type: string;
reason: string;
}
export interface EventsMessageAcknowledgeIgnored
extends EventsMessageAcknowledge {
details?: EventsMessageAcknowledgeIgnoredDetails;
}
export type EventsMessageNotifyUnread = EventsSessionGeneric;
/**************************************************************************
* TYPES + INTERFACES (SPAM EVENTS)
***************************************************************************/
export interface EventsSpamMessage extends EventsWebsiteGeneric {
spam_id: string;
type: string;
reason: string;
metadata?: Record<string, unknown>;
headers?: Record<string, string>;
timestamp: number;
}
export interface EventsSpamDecision extends EventsWebsiteGeneric {
spam_id: string;
action: string;
}
/**************************************************************************
* TYPES + INTERFACES (PEOPLE EVENTS)
***************************************************************************/
export interface EventsPeopleProfileCreated extends EventsWebsiteGeneric {
people_id: string;
email?: string;
}
export interface EventsPeopleEmployment {
domain?: string;
name?: string;
role?: string;
title?: string;
}
export interface EventsPeoplePerson {
geolocation?: GeolocationInfo;
locales?: string[];
nickname?: string;
timezone?: number;
phone?: string;
avatar?: string;
employment?: EventsPeopleEmployment;
address?: string;
website?: string;
gender?: string;
}
export interface EventsPeopleCompany {
description?: string;
domain?: string;
geolocation?: GeolocationInfo;
legal_name?: string;
name?: string;
url?: string;
}
export interface EventsPeopleProfileUpdated extends EventsWebsiteGeneric {
people_id: string;
email?: string;
update: {
updated_at: number;
person: EventsPeoplePerson;
};
}
export interface EventsPeopleProfileRemoved extends EventsWebsiteGeneric {
people_id: string;
}
export interface EventsPeopleBindSession extends EventsSessionGeneric {
people_id: string;
}
export interface EventsPeopleSyncProfile extends EventsSessionGeneric {
people_id: string;
identity: {
person?: EventsPeoplePerson;
company?: EventsPeopleCompany;
};
}
export interface EventsPeopleImportProgress extends EventsWebsiteGeneric {
people_id?: string;
progress: number;
count: {
skipped: number;
remaining: number;
};
items?: {
skipped?: Array<{
identifier: string | null;
reason: string;
}>;
};
}
export interface EventsPeopleImportDone extends EventsWebsiteGeneric {
people_id?: string;
error: boolean;
}
/**************************************************************************
* TYPES + INTERFACES (CAMPAIGN EVENTS)
***************************************************************************/
export interface EventsCampaignProgress extends EventsWebsiteGeneric {
campaign_id: string;
progress: number;
}
export interface EventsCampaignDispatched extends EventsWebsiteGeneric {
campaign_id: string;
}
export interface EventsCampaignRunning extends EventsWebsiteGeneric {
campaign_id: string;
running: boolean;
}
/**************************************************************************
* TYPES + INTERFACES (BROWSING EVENTS)
***************************************************************************/
export interface EventsBrowsingRequestInitiated extends EventsSessionGeneric {
browsing_id: string;
browsing_token: string;
}
export type EventsBrowsingRequestRejected = EventsSessionGeneric;
/**************************************************************************
* TYPES + INTERFACES (CALL EVENTS)
***************************************************************************/
export interface EventsCallRequestInitiated extends EventsSessionGeneric {
call_id: string;
}
export interface EventsCallRequestRejected extends EventsSessionGeneric {
call_id: string;
}
/**************************************************************************
* TYPES + INTERFACES (IDENTITY EVENTS)
***************************************************************************/
export interface EventsIdentityVerifyRequest extends EventsWebsiteGeneric {
plugin_id: string;
session_id: string;
target: string;
code: string;
confirm_url: string;
}
/**************************************************************************
* TYPES + INTERFACES (WIDGET EVENTS)
***************************************************************************/
export interface EventsWidgetActionProcessed extends EventsSessionGeneric {
plugin_id: string;
correlation_id: string;
outcome: "success" | "failure";
result?: Record<string, unknown>;
}
/**************************************************************************
* TYPES + INTERFACES (STATUS EVENTS)
***************************************************************************/
export type EventsStatusHealth = "healthy" | "sick" | "dead";
export interface EventsStatusNode {
label: string;
replica: string;
}
export interface EventsStatusHealthChanged extends EventsWebsiteGeneric {
health: EventsStatusHealth;
nodes: EventsStatusNode[];
}
/**************************************************************************
* TYPES + INTERFACES (WEBSITE EVENTS)
***************************************************************************/
export interface EventsWebsiteUpdateVisitorsCount extends EventsWebsiteGeneric {
visitors_count: number;
}
export interface EventsWebsiteUpdateOperatorsAvailability
extends EventsWebsiteGeneric {
user_id: string;
availability: {
type: EventsSessionAvailability;
};
}
export interface EventsWebsiteUsersAvailable extends EventsWebsiteGeneric {
available: boolean;
}
/**************************************************************************
* TYPES + INTERFACES (BUCKET EVENTS)
***************************************************************************/
export interface EventsBucketURLGenerated {
from: string;
id: string;
identifier: string;
resource: {
type: string;
id: string;
};
policy: {
size_limit: number;
};
type: string;
url: {
resource: string;
signed: string;
};
}
/**************************************************************************
* TYPES + INTERFACES (MEDIA EVENTS)
***************************************************************************/
export interface EventsMediaAnimationResult {
type: string;
url: string;
}
export interface EventsMediaAnimationListed {
id: number;
identifier: string;
results: EventsMediaAnimationResult[];
}
/**************************************************************************
* TYPES + INTERFACES (EMAIL EVENTS)
***************************************************************************/
export interface EventsEmailSubscribe extends EventsWebsiteGeneric {
email: string;
subscribed: boolean;
}
export interface EventsEmailTrackView extends EventsWebsiteGeneric {
type: string;
identifier: string;
mode: string;
}
/**************************************************************************
* TYPES + INTERFACES (PLUGIN EVENTS)
***************************************************************************/
export interface EventsPluginChannel extends EventsWebsiteGeneric {
type?: string;
plugin_id: string;
identifier: string;
namespace: string;
payload: unknown;
}
export interface EventsPluginEvent extends EventsWebsiteGeneric {
plugin_id: string;
urn: string;
name: string;
data: Record<string, unknown>;
}
export interface EventsPluginSubscriptionUpdated extends EventsWebsiteGeneric {
plugin_id: string;
bound: boolean;
target: string;
}
export interface EventsPluginSettingsSaved extends EventsWebsiteGeneric {
plugin_id: string;
settings: Record<string, unknown>;
}
/**************************************************************************
* TYPES + INTERFACES (PLAN EVENTS)
***************************************************************************/
export interface EventsPlanSubscriptionUpdated extends EventsWebsiteGeneric {
plan: {
id: string;
name: string;
price?: number;
trialing: boolean;
};
}
/**************************************************************************
* EVENT MAP
***************************************************************************/
/**
* Maps each event name to the shape of the payload delivered to its listener,
* whether received over WebSockets or Web Hooks.
*/
export interface EventsMap {
// Session Events
"session:update_availability": EventsSessionUpdateAvailability;
"session:update_verify": EventsSessionUpdateVerify;
"session:request:initiated": EventsSessionRequestInitiated;
"session:set_email": EventsSessionSetEmail;
"session:set_phone": EventsSessionSetPhone;
"session:set_address": EventsSessionSetAddress;
"session:set_subject": EventsSessionSetSubject;
"session:set_avatar": EventsSessionSetAvatar;
"session:set_nickname": EventsSessionSetNickname;
"session:set_origin": EventsSessionSetOrigin;
"session:set_data": EventsSessionSetData;
"session:set_segments": EventsSessionSetSegments;
"session:set_block": EventsSessionSetBlock;
"session:set_opened": EventsSessionSetOpened;
"session:set_closed": EventsSessionSetClosed;
"session:set_participants": EventsSessionSetParticipants;
"session:set_mentions": EventsSessionSetMentions;
"session:set_routing": EventsSessionSetRouting;
"session:set_inbox": EventsSessionSetInbox;
"session:set_state": EventsSessionSetState;
"session:sync:capabilities": EventsSessionSyncCapabilities;
"session:sync:geolocation": EventsSessionSyncGeolocation;
"session:sync:system": EventsSessionSyncSystem;
"session:sync:network": EventsSessionSyncNetwork;
"session:sync:timezone": EventsSessionSyncTimezone;
"session:sync:locales": EventsSessionSyncLocales;
"session:sync:pages": EventsSessionSyncPages;
"session:sync:events": EventsSessionSyncEvents;
"session:sync:rating": EventsSessionSyncRating;
"session:sync:topic": EventsSessionSyncTopic;
"session:removed": EventsSessionRemoved;
"session:error": EventsSessionError;
// Message Events
"message:updated": EventsMessageUpdated;
"message:send": EventsMessageSend;
"message:received": EventsMessageReceived;
"message:removed": EventsMessageRemoved;
"message:compose:send": EventsMessageComposeSend;
"message:compose:receive": EventsMessageComposeReceive;
"message:acknowledge:read:send": EventsMessageAcknowledge;
"message:acknowledge:read:received": EventsMessageAcknowledge;
"message:acknowledge:unread:send": EventsMessageAcknowledge;
"message:acknowledge:delivered": EventsMessageAcknowledge;
"message:acknowledge:ignored": EventsMessageAcknowledgeIgnored;
"message:notify:unread:send": EventsMessageNotifyUnread;
"message:notify:unread:received": EventsMessageNotifyUnread;
// Spam Events
"spam:message": EventsSpamMessage;
"spam:decision": EventsSpamDecision;
// People Events
"people:profile:created": EventsPeopleProfileCreated;
"people:profile:updated": EventsPeopleProfileUpdated;
"people:profile:removed": EventsPeopleProfileRemoved;
"people:bind:session": EventsPeopleBindSession;
"people:sync:profile": EventsPeopleSyncProfile;
"people:import:progress": EventsPeopleImportProgress;
"people:import:done": EventsPeopleImportDone;
// Campaign Events
"campaign:progress": EventsCampaignProgress;
"campaign:dispatched": EventsCampaignDispatched;
"campaign:running": EventsCampaignRunning;
// Browsing Events
"browsing:request:initiated": EventsBrowsingRequestInitiated;
"browsing:request:rejected": EventsBrowsingRequestRejected;
// Call Events
"call:request:initiated": EventsCallRequestInitiated;
"call:request:rejected": EventsCallRequestRejected;
// Identity Events
"identity:verify:request": EventsIdentityVerifyRequest;
// Widget Events
"widget:action:processed": EventsWidgetActionProcessed;
// Status Events
"status:health:changed": EventsStatusHealthChanged;
// Website Events
"website:update_visitors_count": EventsWebsiteUpdateVisitorsCount;
"website:update_operators_availability": EventsWebsiteUpdateOperatorsAvailability;
"website:users:available": EventsWebsiteUsersAvailable;
// Bucket Events
"bucket:url:upload:generated": EventsBucketURLGenerated;
"bucket:url:avatar:generated": EventsBucketURLGenerated;
"bucket:url:website:generated": EventsBucketURLGenerated;
"bucket:url:campaign:generated": EventsBucketURLGenerated;
"bucket:url:helpdesk:generated": EventsBucketURLGenerated;
"bucket:url:status:generated": EventsBucketURLGenerated;
"bucket:url:processing:generated": EventsBucketURLGenerated;
// Media Events
"media:animation:listed": EventsMediaAnimationListed;
// Email Events
"email:subscribe": EventsEmailSubscribe;
"email:track:view": EventsEmailTrackView;
// Plugin Events
"plugin:channel": EventsPluginChannel;
"plugin:event": EventsPluginEvent;
"plugin:subscription:updated": EventsPluginSubscriptionUpdated;
"plugin:settings:saved": EventsPluginSettingsSaved;
// Plan Events
"plan:subscription:updated": EventsPlanSubscriptionUpdated;
}
/**
* Union of all recognized event names.
*/
export type EventName = keyof EventsMap;
/**
* Shape of a Web Hook body, as received on the HTTP endpoint before being
* dispatched with 'receiveHook'.
*/
export type EventsWebHookBody<Name extends EventName = EventName> = {
[K in Name]: {
event: K;
data: EventsMap[K];
timestamp?: number;
website_id?: string;
};
}[Name];