@zapyapi/sdk 1.0.0-beta.4 → 1.0.0-beta.6

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/README.md CHANGED
@@ -202,12 +202,16 @@ await client.webhooks.deleteConfig();
202
202
 
203
203
  ## Error Handling
204
204
 
205
+ The SDK provides detailed error classes for different failure scenarios:
206
+
205
207
  ```typescript
206
208
  import {
207
209
  ZapyClient,
208
210
  ZapyApiError,
209
211
  AuthenticationError,
210
212
  RateLimitError,
213
+ NetworkError,
214
+ TimeoutError,
211
215
  ValidationError,
212
216
  } from '@zapyapi/sdk';
213
217
 
@@ -217,17 +221,46 @@ try {
217
221
  text: 'Hello!',
218
222
  });
219
223
  } catch (error) {
220
- if (error instanceof AuthenticationError) {
224
+ if (error instanceof TimeoutError) {
225
+ // Request timed out
226
+ console.error(`Request timed out after ${error.timeout}ms`);
227
+ console.error(`Request: ${error.method} ${error.url}`);
228
+ } else if (error instanceof NetworkError) {
229
+ // Network failure (no response received)
230
+ console.error(`Network error: ${error.message}`);
231
+ console.error(`Error code: ${error.code}`); // e.g., ECONNREFUSED
232
+ } else if (error instanceof AuthenticationError) {
221
233
  console.error('Invalid API key');
222
234
  } else if (error instanceof RateLimitError) {
223
235
  console.error(`Rate limited. Retry after: ${error.retryAfter}ms`);
236
+ console.error(`Retry at: ${error.getRetryAfterDate()}`);
224
237
  } else if (error instanceof ZapyApiError) {
225
238
  console.error(`API Error [${error.code}]: ${error.message}`);
239
+ console.error(`Status: ${error.statusCode}`);
226
240
  console.error(`Request ID: ${error.requestId}`);
241
+ console.error(`Request: ${error.method} ${error.url}`);
242
+
243
+ // For debugging/logging
244
+ console.error(error.toDetailedString());
245
+ // Or serialize to JSON
246
+ console.error(JSON.stringify(error.toJSON(), null, 2));
227
247
  }
228
248
  }
229
249
  ```
230
250
 
251
+ ### Error Classes
252
+
253
+ | Error Class | Description |
254
+ |-------------|-------------|
255
+ | `ZapyError` | Base error class for all SDK errors |
256
+ | `ZapyApiError` | API returned an error response (4xx, 5xx) |
257
+ | `AuthenticationError` | Invalid or missing API key (401) |
258
+ | `RateLimitError` | Rate limit exceeded (429) |
259
+ | `NetworkError` | Network failure, no response received |
260
+ | `TimeoutError` | Request timed out |
261
+ | `ValidationError` | Input validation failed |
262
+ | `InstanceNotFoundError` | Instance not found (404) |
263
+
231
264
  ## Utilities
232
265
 
233
266
  ```typescript
package/index.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
  var axios = require('axios');
4
4
 
5
5
  /** SDK version - auto-generated from package.json */
6
- const SDK_VERSION = '1.0.0-beta.4';
6
+ const SDK_VERSION = '1.0.0-beta.6';
7
7
 
8
8
  /**
9
9
  * Custom error classes for @zapyapi/sdk
@@ -12,11 +12,30 @@ const SDK_VERSION = '1.0.0-beta.4';
12
12
  * Base error class for all ZapyAPI errors
13
13
  */
14
14
  class ZapyError extends Error {
15
- constructor(message) {
16
- super(message);
15
+ /**
16
+ * Original error that caused this error (if any)
17
+ */
18
+ cause;
19
+ constructor(message, cause) {
20
+ super(message, {
21
+ cause
22
+ });
17
23
  this.name = 'ZapyError';
18
24
  Object.setPrototypeOf(this, ZapyError.prototype);
19
25
  }
26
+ /**
27
+ * Get a detailed string representation of the error
28
+ */
29
+ toDetailedString() {
30
+ let result = `${this.name}: ${this.message}`;
31
+ if (this.cause) {
32
+ result += `\nCaused by: ${this.cause.message}`;
33
+ if (this.cause.stack) {
34
+ result += `\n${this.cause.stack}`;
35
+ }
36
+ }
37
+ return result;
38
+ }
20
39
  }
21
40
  /**
22
41
  * Error thrown when the API returns an error response
@@ -38,13 +57,28 @@ class ZapyApiError extends ZapyError {
38
57
  * Additional error details
39
58
  */
40
59
  details;
41
- constructor(message, statusCode, code, requestId, details) {
42
- super(message);
60
+ /**
61
+ * HTTP method used in the request
62
+ */
63
+ method;
64
+ /**
65
+ * URL that was requested
66
+ */
67
+ url;
68
+ /**
69
+ * Raw response body (for debugging)
70
+ */
71
+ responseBody;
72
+ constructor(message, statusCode, code, options) {
73
+ super(message, options?.cause);
43
74
  this.name = 'ZapyApiError';
44
75
  this.statusCode = statusCode;
45
76
  this.code = code;
46
- this.requestId = requestId;
47
- this.details = details;
77
+ this.requestId = options?.requestId;
78
+ this.details = options?.details;
79
+ this.method = options?.method;
80
+ this.url = options?.url;
81
+ this.responseBody = options?.responseBody;
48
82
  Object.setPrototypeOf(this, ZapyApiError.prototype);
49
83
  }
50
84
  /**
@@ -54,10 +88,81 @@ class ZapyApiError extends ZapyError {
54
88
  const statusCode = error.response?.status ?? 500;
55
89
  const data = error.response?.data;
56
90
  const requestId = error.response?.headers?.['x-request-id'];
57
- if (data && typeof data === 'object' && 'code' in data) {
58
- return new ZapyApiError(data.message || error.message, statusCode, data.code, requestId || data.requestId, data.details);
91
+ const method = error.config?.method?.toUpperCase();
92
+ const url = error.config?.url;
93
+ // Build a descriptive message
94
+ let message;
95
+ if (data && typeof data === 'object' && 'message' in data && data.message) {
96
+ message = data.message;
97
+ } else if (error.message) {
98
+ message = error.message;
99
+ } else {
100
+ message = `Request failed with status ${statusCode}`;
101
+ }
102
+ // Add context to the message
103
+ const context = [];
104
+ if (method && url) {
105
+ context.push(`${method} ${url}`);
106
+ }
107
+ if (statusCode) {
108
+ context.push(`Status: ${statusCode}`);
59
109
  }
60
- return new ZapyApiError(error.message || 'An unexpected error occurred', statusCode, 'UNKNOWN_ERROR', requestId);
110
+ if (requestId) {
111
+ context.push(`Request ID: ${requestId}`);
112
+ }
113
+ const fullMessage = context.length > 0 ? `${message} [${context.join(' | ')}]` : message;
114
+ const code = data && typeof data === 'object' && 'code' in data && data.code ? data.code : 'UNKNOWN_ERROR';
115
+ const details = data && typeof data === 'object' && 'details' in data ? data.details : undefined;
116
+ return new ZapyApiError(fullMessage, statusCode, code, {
117
+ requestId: requestId || (data && typeof data === 'object' && 'requestId' in data ? data.requestId : undefined),
118
+ details,
119
+ method,
120
+ url,
121
+ responseBody: data,
122
+ cause: error
123
+ });
124
+ }
125
+ /**
126
+ * Get a detailed string representation for logging
127
+ */
128
+ toDetailedString() {
129
+ const lines = [`${this.name}: ${this.message}`, ` Status Code: ${this.statusCode}`, ` Error Code: ${this.code}`];
130
+ if (this.method && this.url) {
131
+ lines.push(` Request: ${this.method} ${this.url}`);
132
+ }
133
+ if (this.requestId) {
134
+ lines.push(` Request ID: ${this.requestId}`);
135
+ }
136
+ if (this.details && Object.keys(this.details).length > 0) {
137
+ lines.push(` Details: ${JSON.stringify(this.details, null, 2)}`);
138
+ }
139
+ if (this.responseBody && typeof this.responseBody === 'object') {
140
+ lines.push(` Response Body: ${JSON.stringify(this.responseBody, null, 2)}`);
141
+ }
142
+ if (this.cause) {
143
+ lines.push(` Caused by: ${this.cause.message}`);
144
+ if (this.cause.stack) {
145
+ lines.push(` Stack: ${this.cause.stack.split('\n').slice(1, 4).join('\n ')}`);
146
+ }
147
+ }
148
+ return lines.join('\n');
149
+ }
150
+ /**
151
+ * Convert to a plain object for logging/serialization
152
+ */
153
+ toJSON() {
154
+ return {
155
+ name: this.name,
156
+ message: this.message,
157
+ statusCode: this.statusCode,
158
+ code: this.code,
159
+ requestId: this.requestId,
160
+ method: this.method,
161
+ url: this.url,
162
+ details: this.details,
163
+ responseBody: this.responseBody,
164
+ cause: this.cause?.message
165
+ };
61
166
  }
62
167
  }
63
168
  /**
@@ -74,16 +179,32 @@ class ValidationError extends ZapyError {
74
179
  this.details = details;
75
180
  Object.setPrototypeOf(this, ValidationError.prototype);
76
181
  }
182
+ toDetailedString() {
183
+ const fieldErrors = Object.entries(this.details).map(([field, errors]) => ` ${field}: ${errors.join(', ')}`).join('\n');
184
+ return `${this.name}: ${this.message}\n${fieldErrors}`;
185
+ }
186
+ toJSON() {
187
+ return {
188
+ name: this.name,
189
+ message: this.message,
190
+ details: this.details
191
+ };
192
+ }
77
193
  }
78
194
  /**
79
195
  * Error thrown when an instance is not found
80
196
  */
81
197
  class InstanceNotFoundError extends ZapyApiError {
82
- constructor(instanceId, requestId) {
83
- super(`Instance '${instanceId}' not found`, 404, 'INSTANCE_NOT_FOUND', requestId, {
84
- instanceId
198
+ instanceId;
199
+ constructor(instanceId, options) {
200
+ super(`Instance '${instanceId}' not found`, 404, 'INSTANCE_NOT_FOUND', {
201
+ ...options,
202
+ details: {
203
+ instanceId
204
+ }
85
205
  });
86
206
  this.name = 'InstanceNotFoundError';
207
+ this.instanceId = instanceId;
87
208
  Object.setPrototypeOf(this, InstanceNotFoundError.prototype);
88
209
  }
89
210
  }
@@ -91,8 +212,8 @@ class InstanceNotFoundError extends ZapyApiError {
91
212
  * Error thrown when authentication fails
92
213
  */
93
214
  class AuthenticationError extends ZapyApiError {
94
- constructor(message = 'Invalid or missing API key', requestId) {
95
- super(message, 401, 'UNAUTHORIZED', requestId);
215
+ constructor(message = 'Invalid or missing API key', options) {
216
+ super(message, 401, 'UNAUTHORIZED', options);
96
217
  this.name = 'AuthenticationError';
97
218
  Object.setPrototypeOf(this, AuthenticationError.prototype);
98
219
  }
@@ -105,14 +226,89 @@ class RateLimitError extends ZapyApiError {
105
226
  * Timestamp when the rate limit resets (Unix ms)
106
227
  */
107
228
  retryAfter;
108
- constructor(message = 'Rate limit exceeded', retryAfter, requestId) {
109
- super(message, 429, 'RATE_LIMIT_EXCEEDED', requestId, {
110
- retryAfter
229
+ constructor(message = 'Rate limit exceeded', retryAfter, options) {
230
+ super(message, 429, 'RATE_LIMIT_EXCEEDED', {
231
+ ...options,
232
+ details: retryAfter ? {
233
+ retryAfter
234
+ } : undefined
111
235
  });
112
236
  this.name = 'RateLimitError';
113
237
  this.retryAfter = retryAfter;
114
238
  Object.setPrototypeOf(this, RateLimitError.prototype);
115
239
  }
240
+ /**
241
+ * Get the Date when the rate limit resets
242
+ */
243
+ getRetryAfterDate() {
244
+ return this.retryAfter ? new Date(this.retryAfter) : undefined;
245
+ }
246
+ }
247
+ /**
248
+ * Error thrown when a network error occurs (no response received)
249
+ */
250
+ class NetworkError extends ZapyError {
251
+ /**
252
+ * HTTP method used in the request
253
+ */
254
+ method;
255
+ /**
256
+ * URL that was requested
257
+ */
258
+ url;
259
+ /**
260
+ * Error code (e.g., ECONNREFUSED, ETIMEDOUT)
261
+ */
262
+ code;
263
+ constructor(message, options) {
264
+ super(message, options?.cause);
265
+ this.name = 'NetworkError';
266
+ this.method = options?.method;
267
+ this.url = options?.url;
268
+ this.code = options?.code;
269
+ Object.setPrototypeOf(this, NetworkError.prototype);
270
+ }
271
+ toDetailedString() {
272
+ const lines = [`${this.name}: ${this.message}`];
273
+ if (this.code) {
274
+ lines.push(` Error Code: ${this.code}`);
275
+ }
276
+ if (this.method && this.url) {
277
+ lines.push(` Request: ${this.method} ${this.url}`);
278
+ }
279
+ if (this.cause) {
280
+ lines.push(` Caused by: ${this.cause.message}`);
281
+ }
282
+ return lines.join('\n');
283
+ }
284
+ toJSON() {
285
+ return {
286
+ name: this.name,
287
+ message: this.message,
288
+ code: this.code,
289
+ method: this.method,
290
+ url: this.url,
291
+ cause: this.cause?.message
292
+ };
293
+ }
294
+ }
295
+ /**
296
+ * Error thrown when request times out
297
+ */
298
+ class TimeoutError extends NetworkError {
299
+ /**
300
+ * Timeout duration in milliseconds
301
+ */
302
+ timeout;
303
+ constructor(message = 'Request timed out', options) {
304
+ super(message, {
305
+ ...options,
306
+ code: 'ETIMEDOUT'
307
+ });
308
+ this.name = 'TimeoutError';
309
+ this.timeout = options?.timeout;
310
+ Object.setPrototypeOf(this, TimeoutError.prototype);
311
+ }
116
312
  }
117
313
 
118
314
  /**
@@ -128,18 +324,58 @@ class BaseResource {
128
324
  */
129
325
  handleError(error) {
130
326
  if (this.isAxiosError(error)) {
131
- const statusCode = error.response?.status;
132
- const retryAfter = error.response?.headers?.['retry-after'];
327
+ const method = error.config?.method?.toUpperCase();
328
+ const url = error.config?.url;
329
+ const requestId = error.response?.headers?.['x-request-id'];
330
+ // Network errors (no response received)
331
+ if (!error.response) {
332
+ const code = error.code;
333
+ // Timeout errors
334
+ if (code === 'ECONNABORTED' || code === 'ETIMEDOUT' || error.message?.includes('timeout')) {
335
+ const timeout = error.config?.timeout;
336
+ throw new TimeoutError(`Request timed out${timeout ? ` after ${timeout}ms` : ''}`, {
337
+ method,
338
+ url,
339
+ timeout,
340
+ cause: error
341
+ });
342
+ }
343
+ // Other network errors (connection refused, DNS failure, etc.)
344
+ throw new NetworkError(error.message || 'Network error occurred', {
345
+ method,
346
+ url,
347
+ code,
348
+ cause: error
349
+ });
350
+ }
351
+ const statusCode = error.response.status;
352
+ const retryAfter = error.response.headers?.['retry-after'];
133
353
  if (statusCode === 401) {
134
- throw new AuthenticationError(error.response?.data?.message || 'Invalid or missing API key', error.response?.headers?.['x-request-id']);
354
+ throw new AuthenticationError(error.response.data?.message || 'Invalid or missing API key', {
355
+ requestId,
356
+ method,
357
+ url,
358
+ cause: error
359
+ });
135
360
  }
136
361
  if (statusCode === 429) {
137
- throw new RateLimitError(error.response?.data?.message || 'Rate limit exceeded', retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined, error.response?.headers?.['x-request-id']);
362
+ const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined;
363
+ throw new RateLimitError(error.response.data?.message || 'Rate limit exceeded', retryAfterMs, {
364
+ requestId,
365
+ method,
366
+ url,
367
+ cause: error
368
+ });
138
369
  }
139
370
  throw ZapyApiError.fromAxiosError(error);
140
371
  }
372
+ if (error instanceof ZapyError) {
373
+ throw error;
374
+ }
141
375
  if (error instanceof Error) {
142
- throw new ZapyApiError(error.message, 500, 'UNKNOWN_ERROR');
376
+ throw new ZapyApiError(error.message, 500, 'UNKNOWN_ERROR', {
377
+ cause: error
378
+ });
143
379
  }
144
380
  throw new ZapyApiError('An unexpected error occurred', 500, 'UNKNOWN_ERROR');
145
381
  }
@@ -1239,6 +1475,126 @@ function isContactDeduplicatedEvent(event) {
1239
1475
  return event.event === 'contact-deduplicated';
1240
1476
  }
1241
1477
 
1478
+ /**
1479
+ * WhatsApp Message Event Types
1480
+ * Comprehensive type definitions for all WhatsApp message types
1481
+ */
1482
+ // ============================================================================
1483
+ // Message Status
1484
+ // ============================================================================
1485
+ exports.ZapyMessageStatusEnum = void 0;
1486
+ (function (ZapyMessageStatusEnum) {
1487
+ ZapyMessageStatusEnum["UNKNOWN"] = "UNKNOWN";
1488
+ ZapyMessageStatusEnum["ERROR"] = "ERROR";
1489
+ ZapyMessageStatusEnum["PENDING"] = "PENDING";
1490
+ ZapyMessageStatusEnum["SENT"] = "SENT";
1491
+ ZapyMessageStatusEnum["RECEIVED"] = "RECEIVED";
1492
+ ZapyMessageStatusEnum["READ"] = "READ";
1493
+ ZapyMessageStatusEnum["PLAYED"] = "PLAYED";
1494
+ })(exports.ZapyMessageStatusEnum || (exports.ZapyMessageStatusEnum = {}));
1495
+ exports.ZapyMessageType = void 0;
1496
+ (function (ZapyMessageType) {
1497
+ ZapyMessageType["TEXT"] = "text";
1498
+ ZapyMessageType["IMAGE"] = "image";
1499
+ ZapyMessageType["VIDEO"] = "video";
1500
+ ZapyMessageType["AUDIO"] = "audio";
1501
+ ZapyMessageType["DOCUMENT"] = "document";
1502
+ ZapyMessageType["STICKER"] = "sticker";
1503
+ ZapyMessageType["LOCATION"] = "location";
1504
+ ZapyMessageType["LIVE_LOCATION"] = "live_location";
1505
+ ZapyMessageType["CONTACT"] = "contact";
1506
+ ZapyMessageType["REACTION"] = "reaction";
1507
+ ZapyMessageType["EDITED"] = "edited";
1508
+ ZapyMessageType["DELETED"] = "deleted";
1509
+ ZapyMessageType["POLL"] = "poll";
1510
+ ZapyMessageType["POLL_VOTE"] = "poll_vote";
1511
+ ZapyMessageType["CALL"] = "call";
1512
+ ZapyMessageType["UNSUPPORTED"] = "unsupported";
1513
+ })(exports.ZapyMessageType || (exports.ZapyMessageType = {}));
1514
+ // ============================================================================
1515
+ // Type Guards
1516
+ // ============================================================================
1517
+ function isTextMessage(message) {
1518
+ return message.messageType === exports.ZapyMessageType.TEXT;
1519
+ }
1520
+ function isImageMessage(message) {
1521
+ return message.messageType === exports.ZapyMessageType.IMAGE;
1522
+ }
1523
+ function isVideoMessage(message) {
1524
+ return message.messageType === exports.ZapyMessageType.VIDEO;
1525
+ }
1526
+ function isAudioMessage(message) {
1527
+ return message.messageType === exports.ZapyMessageType.AUDIO;
1528
+ }
1529
+ function isDocumentMessage(message) {
1530
+ return message.messageType === exports.ZapyMessageType.DOCUMENT;
1531
+ }
1532
+ function isStickerMessage(message) {
1533
+ return message.messageType === exports.ZapyMessageType.STICKER;
1534
+ }
1535
+ function isLocationMessage(message) {
1536
+ return message.messageType === exports.ZapyMessageType.LOCATION;
1537
+ }
1538
+ function isLiveLocationMessage(message) {
1539
+ return message.messageType === exports.ZapyMessageType.LIVE_LOCATION;
1540
+ }
1541
+ function isContactMessage(message) {
1542
+ return message.messageType === exports.ZapyMessageType.CONTACT;
1543
+ }
1544
+ function isReactionMessage(message) {
1545
+ return message.messageType === exports.ZapyMessageType.REACTION;
1546
+ }
1547
+ function isEditedMessage(message) {
1548
+ return message.messageType === exports.ZapyMessageType.EDITED;
1549
+ }
1550
+ function isDeletedMessage(message) {
1551
+ return message.messageType === exports.ZapyMessageType.DELETED;
1552
+ }
1553
+ function isPollMessage(message) {
1554
+ return message.messageType === exports.ZapyMessageType.POLL;
1555
+ }
1556
+ function isPollVoteMessage(message) {
1557
+ return message.messageType === exports.ZapyMessageType.POLL_VOTE;
1558
+ }
1559
+ function isCallMessage(message) {
1560
+ return message.messageType === exports.ZapyMessageType.CALL;
1561
+ }
1562
+ function isUnsupportedMessage(message) {
1563
+ return message.messageType === exports.ZapyMessageType.UNSUPPORTED;
1564
+ }
1565
+ function isMediaMessage(message) {
1566
+ return [exports.ZapyMessageType.IMAGE, exports.ZapyMessageType.VIDEO, exports.ZapyMessageType.AUDIO, exports.ZapyMessageType.DOCUMENT, exports.ZapyMessageType.STICKER].includes(message.messageType);
1567
+ }
1568
+
1569
+ exports.WhatsappInstanceStatus = void 0;
1570
+ (function (WhatsappInstanceStatus) {
1571
+ WhatsappInstanceStatus["STOPPED"] = "stopped";
1572
+ WhatsappInstanceStatus["MANUALLY_STOPPED"] = "manually_stopped";
1573
+ WhatsappInstanceStatus["CONNECTING"] = "connecting";
1574
+ WhatsappInstanceStatus["PENDING_QR_CODE_SCAN"] = "pending_qr_code_scan";
1575
+ WhatsappInstanceStatus["CONNECTED"] = "connected";
1576
+ WhatsappInstanceStatus["ERROR"] = "error";
1577
+ WhatsappInstanceStatus["CREATED"] = "created";
1578
+ WhatsappInstanceStatus["QR_TIMEOUT"] = "qr_timeout";
1579
+ WhatsappInstanceStatus["PAYMENT_PENDING"] = "payment_pending";
1580
+ })(exports.WhatsappInstanceStatus || (exports.WhatsappInstanceStatus = {}));
1581
+
1582
+ // Re-export all event types
1583
+ /**
1584
+ * Event type constants for type-safe event handling
1585
+ */
1586
+ const ZapyEventTypes = {
1587
+ MESSAGE: 'message',
1588
+ MESSAGE_STATUS: 'message-status',
1589
+ REACTION: 'reaction',
1590
+ PRESENCE: 'presence',
1591
+ QR_CODE: 'qr-code',
1592
+ CONTACT_CREATED: 'contact-created',
1593
+ CONTACT_UPDATED: 'contact-updated',
1594
+ CONTACT_DEDUPLICATED: 'contact-deduplicated',
1595
+ INSTANCE_STATUS: 'instance-status'
1596
+ };
1597
+
1242
1598
  /**
1243
1599
  * Phone number utilities for @zapyapi/sdk
1244
1600
  */
@@ -1420,23 +1776,43 @@ exports.InstanceNotFoundError = InstanceNotFoundError;
1420
1776
  exports.InstanceStatus = InstanceStatus;
1421
1777
  exports.MessageAckStatus = MessageAckStatus;
1422
1778
  exports.MessageType = MessageType;
1779
+ exports.NetworkError = NetworkError;
1423
1780
  exports.RateLimitError = RateLimitError;
1781
+ exports.TimeoutError = TimeoutError;
1424
1782
  exports.ValidationError = ValidationError;
1425
1783
  exports.WebhookEventType = WebhookEventType;
1426
1784
  exports.WebhookQueueStatus = WebhookQueueStatus;
1427
1785
  exports.ZapyApiError = ZapyApiError;
1428
1786
  exports.ZapyClient = ZapyClient;
1429
1787
  exports.ZapyError = ZapyError;
1788
+ exports.ZapyEventTypes = ZapyEventTypes;
1430
1789
  exports.createClient = createClient;
1431
1790
  exports.extractPhone = extractPhone;
1791
+ exports.isAudioMessage = isAudioMessage;
1792
+ exports.isCallMessage = isCallMessage;
1432
1793
  exports.isContactCreatedEvent = isContactCreatedEvent;
1433
1794
  exports.isContactDeduplicatedEvent = isContactDeduplicatedEvent;
1795
+ exports.isContactMessage = isContactMessage;
1434
1796
  exports.isContactUpdatedEvent = isContactUpdatedEvent;
1797
+ exports.isDeletedMessage = isDeletedMessage;
1798
+ exports.isDocumentMessage = isDocumentMessage;
1799
+ exports.isEditedMessage = isEditedMessage;
1435
1800
  exports.isGroup = isGroup;
1801
+ exports.isImageMessage = isImageMessage;
1802
+ exports.isLiveLocationMessage = isLiveLocationMessage;
1803
+ exports.isLocationMessage = isLocationMessage;
1804
+ exports.isMediaMessage = isMediaMessage;
1436
1805
  exports.isMessageEvent = isMessageEvent;
1437
1806
  exports.isMessageStatusEvent = isMessageStatusEvent;
1807
+ exports.isPollMessage = isPollMessage;
1808
+ exports.isPollVoteMessage = isPollVoteMessage;
1438
1809
  exports.isQRCodeEvent = isQRCodeEvent;
1810
+ exports.isReactionMessage = isReactionMessage;
1811
+ exports.isStickerMessage = isStickerMessage;
1812
+ exports.isTextMessage = isTextMessage;
1813
+ exports.isUnsupportedMessage = isUnsupportedMessage;
1439
1814
  exports.isValidPhone = isValidPhone;
1815
+ exports.isVideoMessage = isVideoMessage;
1440
1816
  exports.normalizePhone = normalizePhone;
1441
1817
  exports.verifyWebhookSignature = verifyWebhookSignature;
1442
1818
  exports.verifyWebhookSignatureAsync = verifyWebhookSignatureAsync;