@arisnetxsolutions/qwa-sdk 0.0.1 β 0.0.2
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 +9 -10
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,18 +18,18 @@ Importa `QWAClient` y crea una instancia con tus credenciales:
|
|
|
18
18
|
import { QWAClient } from '@arisnetxsolutions/qwa-sdk';
|
|
19
19
|
|
|
20
20
|
const client = new QWAClient({
|
|
21
|
-
baseUrl: 'https://api.wa.a.arisnetxsolutions.com',
|
|
22
21
|
sessionId: 'c7cb0771-3fb8-4fe4-98b8-34c5f294bd80',
|
|
23
22
|
chatId: '120363040929106526@g.us',
|
|
24
23
|
apiKey: 'owa_k1_...',
|
|
25
24
|
});
|
|
26
25
|
```
|
|
27
26
|
|
|
27
|
+
> **π‘ Nota:** La `baseUrl` ya viene preconfigurada apuntando a `https://api.wa.a.arisnetxsolutions.com`. Solo necesitas proporcionarla si usas un endpoint diferente.
|
|
28
|
+
|
|
28
29
|
> **π‘ RecomendaciΓ³n:** No hardcodees las credenciales. Usa variables de entorno:
|
|
29
30
|
|
|
30
31
|
```typescript
|
|
31
32
|
const client = new QWAClient({
|
|
32
|
-
baseUrl: process.env.QWA_BASE_URL!,
|
|
33
33
|
sessionId: process.env.QWA_SESSION_ID!,
|
|
34
34
|
chatId: process.env.QWA_CHAT_ID!,
|
|
35
35
|
apiKey: process.env.QWA_API_KEY!,
|
|
@@ -108,7 +108,6 @@ try {
|
|
|
108
108
|
import { QWAClient, QWAError } from '@arisnetxsolutions/qwa-sdk';
|
|
109
109
|
|
|
110
110
|
const client = new QWAClient({
|
|
111
|
-
baseUrl: process.env.QWA_BASE_URL!,
|
|
112
111
|
sessionId: process.env.QWA_SESSION_ID!,
|
|
113
112
|
chatId: process.env.QWA_CHAT_ID!,
|
|
114
113
|
apiKey: process.env.QWA_API_KEY!,
|
|
@@ -140,14 +139,14 @@ main();
|
|
|
140
139
|
|
|
141
140
|
Crea una nueva instancia del cliente.
|
|
142
141
|
|
|
143
|
-
| Campo | Tipo
|
|
144
|
-
|
|
145
|
-
| `baseUrl` | `string` | URL base de la API
|
|
146
|
-
| `sessionId` | `string` | ID de la sesiΓ³n de WhatsApp
|
|
147
|
-
| `chatId` | `string` | ID del chat o grupo de WhatsApp por defecto
|
|
148
|
-
| `apiKey` | `string` | API key para autenticaciΓ³n
|
|
142
|
+
| Campo | Tipo | Obligatorio | DescripciΓ³n |
|
|
143
|
+
|-------------|-----------|-------------|----------------------------------------------------------|
|
|
144
|
+
| `baseUrl` | `string` | β No | URL base de la API. Por defecto: `https://api.wa.a.arisnetxsolutions.com` |
|
|
145
|
+
| `sessionId` | `string` | β
SΓ | ID de la sesiΓ³n de WhatsApp |
|
|
146
|
+
| `chatId` | `string` | β
SΓ | ID del chat o grupo de WhatsApp por defecto |
|
|
147
|
+
| `apiKey` | `string` | β
SΓ | API key para autenticaciΓ³n |
|
|
149
148
|
|
|
150
|
-
> β οΈ
|
|
149
|
+
> β οΈ `sessionId`, `chatId` y `apiKey` son obligatorios. Si falta alguno, el constructor lanza un error.
|
|
151
150
|
|
|
152
151
|
#### `sendText(payload: SendTextPayload | string): Promise<QWAResponse>`
|
|
153
152
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/client.ts
|
|
4
|
+
var DEFAULT_BASE_URL = "https://api.wa.a.arisnetxsolutions.com";
|
|
4
5
|
var QWAClient = class {
|
|
5
6
|
config;
|
|
6
7
|
constructor(config) {
|
|
7
|
-
if (!config.baseUrl) throw new Error("baseUrl is required");
|
|
8
8
|
if (!config.sessionId) throw new Error("sessionId is required");
|
|
9
9
|
if (!config.chatId) throw new Error("chatId is required");
|
|
10
10
|
if (!config.apiKey) throw new Error("apiKey is required");
|
|
11
|
+
const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
11
12
|
this.config = {
|
|
12
13
|
...config,
|
|
13
|
-
baseUrl
|
|
14
|
+
baseUrl
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
17
|
/**
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAOA,IAAM,gBAAA,GAAmB,wCAAA;AAkBlB,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACxD,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAGxD,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEvE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,OAAA,GAAkC;AAC5C,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,WAAA,EAAa,KAAK,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,IAAA,CACZ,QAAA,EACA,IAAA,EACoB;AACpB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,iBAAiB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAA;AAEnF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QAC7D,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,SACJ,OAAA,EACsB;AACtB,IAAA,MAAM,UAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,EAAM,SAAQ,GAC5C,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA,CAAK,OAAO,MAAA,EAAO;AAEjE,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClB,UAAA;AAAA,EACA,IAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,IAAA,EAAe;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF","file":"index.cjs","sourcesContent":["// βββββββββββββββββββββββββββββββββββββββββββββββ\r\n// QOpenWA Client - Main SDK class\r\n// βββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nimport type { QWAConfig, SendTextPayload, QWAResponse } from './types.js';\r\n\r\n/** URL base por defecto de la API de QOpenWA */\r\nconst DEFAULT_BASE_URL = 'https://api.wa.a.arisnetxsolutions.com';\r\n\r\n/**\r\n * QOpenWA Client for sending WhatsApp messages.\r\n *\r\n * @example\r\n * ```ts\r\n * import { QWAClient } from '@arisnetxsolutions/qwa-sdk';\r\n *\r\n * const client = new QWAClient({\r\n * sessionId: 'your-session-id',\r\n * chatId: 'your-chat-id',\r\n * apiKey: 'your-api-key',\r\n * });\r\n *\r\n * await client.sendText({ text: 'Hello from QWA SDK!' });\r\n * ```\r\n */\r\nexport class QWAClient {\r\n private readonly config: Required<Pick<QWAConfig, 'baseUrl'>> & QWAConfig;\r\n\r\n constructor(config: QWAConfig) {\r\n if (!config.sessionId) throw new Error('sessionId is required');\r\n if (!config.chatId) throw new Error('chatId is required');\r\n if (!config.apiKey) throw new Error('apiKey is required');\r\n\r\n // Normalize baseUrl: remove trailing slash\r\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\r\n\r\n this.config = {\r\n ...config,\r\n baseUrl,\r\n };\r\n }\r\n\r\n /**\r\n * Get the HTTP headers used for all requests.\r\n */\r\n private get headers(): Record<string, string> {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.config.apiKey,\r\n };\r\n }\r\n\r\n /**\r\n * Make a POST request to the QOpenWA API.\r\n */\r\n private async post<TBody, TResponse>(\r\n endpoint: string,\r\n body: TBody,\r\n ): Promise<TResponse> {\r\n const url = `${this.config.baseUrl}/api/sessions/${this.config.sessionId}${endpoint}`;\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({}));\r\n throw new QWAError(\r\n `API request failed: ${response.status} ${response.statusText}`,\r\n response.status,\r\n errorBody,\r\n );\r\n }\r\n\r\n return response.json() as Promise<TResponse>;\r\n }\r\n\r\n /**\r\n * Send a text message to the configured chat.\r\n *\r\n * @param payload - The text message payload. If a string is passed, it will be\r\n * used as the message text with the configured chatId.\r\n * @returns The API response.\r\n *\r\n * @example\r\n * ```ts\r\n * await client.sendText({ text: 'Hello, World!' });\r\n * await client.sendText('Hello, World!'); // shorthand\r\n * ```\r\n */\r\n async sendText(\r\n payload: SendTextPayload | string,\r\n ): Promise<QWAResponse> {\r\n const normalized: SendTextPayload =\r\n typeof payload === 'string'\r\n ? { chatId: this.config.chatId, text: payload }\r\n : { ...payload, chatId: payload.chatId ?? this.config.chatId };\r\n\r\n return this.post<SendTextPayload, QWAResponse>(\r\n '/messages/send-text',\r\n normalized,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for QWA API errors.\r\n */\r\nexport class QWAError extends Error {\r\n public readonly statusCode: number;\r\n public readonly body: unknown;\r\n\r\n constructor(message: string, statusCode: number, body: unknown) {\r\n super(message);\r\n this.name = 'QWAError';\r\n this.statusCode = statusCode;\r\n this.body = body;\r\n }\r\n}\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Configuration options for the QOpenWA client */
|
|
2
2
|
interface QWAConfig {
|
|
3
|
-
/** Base URL of the QOpenWA API
|
|
4
|
-
baseUrl
|
|
3
|
+
/** Base URL of the QOpenWA API. Por defecto: https://api.wa.a.arisnetxsolutions.com */
|
|
4
|
+
baseUrl?: string;
|
|
5
5
|
/** Session identifier */
|
|
6
6
|
sessionId: string;
|
|
7
7
|
/** WhatsApp chat/group ID */
|
|
@@ -41,7 +41,6 @@ type QWAResponse = QWASuccessResponse | QWAErrorResponse;
|
|
|
41
41
|
* import { QWAClient } from '@arisnetxsolutions/qwa-sdk';
|
|
42
42
|
*
|
|
43
43
|
* const client = new QWAClient({
|
|
44
|
-
* baseUrl: 'https://api.wa.a.arisnetxsolutions.com',
|
|
45
44
|
* sessionId: 'your-session-id',
|
|
46
45
|
* chatId: 'your-chat-id',
|
|
47
46
|
* apiKey: 'your-api-key',
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** Configuration options for the QOpenWA client */
|
|
2
2
|
interface QWAConfig {
|
|
3
|
-
/** Base URL of the QOpenWA API
|
|
4
|
-
baseUrl
|
|
3
|
+
/** Base URL of the QOpenWA API. Por defecto: https://api.wa.a.arisnetxsolutions.com */
|
|
4
|
+
baseUrl?: string;
|
|
5
5
|
/** Session identifier */
|
|
6
6
|
sessionId: string;
|
|
7
7
|
/** WhatsApp chat/group ID */
|
|
@@ -41,7 +41,6 @@ type QWAResponse = QWASuccessResponse | QWAErrorResponse;
|
|
|
41
41
|
* import { QWAClient } from '@arisnetxsolutions/qwa-sdk';
|
|
42
42
|
*
|
|
43
43
|
* const client = new QWAClient({
|
|
44
|
-
* baseUrl: 'https://api.wa.a.arisnetxsolutions.com',
|
|
45
44
|
* sessionId: 'your-session-id',
|
|
46
45
|
* chatId: 'your-chat-id',
|
|
47
46
|
* apiKey: 'your-api-key',
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
// src/client.ts
|
|
2
|
+
var DEFAULT_BASE_URL = "https://api.wa.a.arisnetxsolutions.com";
|
|
2
3
|
var QWAClient = class {
|
|
3
4
|
config;
|
|
4
5
|
constructor(config) {
|
|
5
|
-
if (!config.baseUrl) throw new Error("baseUrl is required");
|
|
6
6
|
if (!config.sessionId) throw new Error("sessionId is required");
|
|
7
7
|
if (!config.chatId) throw new Error("chatId is required");
|
|
8
8
|
if (!config.apiKey) throw new Error("apiKey is required");
|
|
9
|
+
const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
9
10
|
this.config = {
|
|
10
11
|
...config,
|
|
11
|
-
baseUrl
|
|
12
|
+
baseUrl
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
15
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";AAOA,IAAM,gBAAA,GAAmB,wCAAA;AAkBlB,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC9D,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACxD,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAGxD,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAEvE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAY,OAAA,GAAkC;AAC5C,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,kBAAA;AAAA,MAChB,WAAA,EAAa,KAAK,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,IAAA,CACZ,QAAA,EACA,IAAA,EACoB;AACpB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,OAAO,iBAAiB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAA;AAEnF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,QAC7D,QAAA,CAAS,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,SACJ,OAAA,EACsB;AACtB,IAAA,MAAM,UAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,EAAM,SAAQ,GAC5C,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA,CAAK,OAAO,MAAA,EAAO;AAEjE,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACV,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAKO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClB,UAAA;AAAA,EACA,IAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,IAAA,EAAe;AAC9D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF","file":"index.js","sourcesContent":["// βββββββββββββββββββββββββββββββββββββββββββββββ\r\n// QOpenWA Client - Main SDK class\r\n// βββββββββββββββββββββββββββββββββββββββββββββββ\r\n\r\nimport type { QWAConfig, SendTextPayload, QWAResponse } from './types.js';\r\n\r\n/** URL base por defecto de la API de QOpenWA */\r\nconst DEFAULT_BASE_URL = 'https://api.wa.a.arisnetxsolutions.com';\r\n\r\n/**\r\n * QOpenWA Client for sending WhatsApp messages.\r\n *\r\n * @example\r\n * ```ts\r\n * import { QWAClient } from '@arisnetxsolutions/qwa-sdk';\r\n *\r\n * const client = new QWAClient({\r\n * sessionId: 'your-session-id',\r\n * chatId: 'your-chat-id',\r\n * apiKey: 'your-api-key',\r\n * });\r\n *\r\n * await client.sendText({ text: 'Hello from QWA SDK!' });\r\n * ```\r\n */\r\nexport class QWAClient {\r\n private readonly config: Required<Pick<QWAConfig, 'baseUrl'>> & QWAConfig;\r\n\r\n constructor(config: QWAConfig) {\r\n if (!config.sessionId) throw new Error('sessionId is required');\r\n if (!config.chatId) throw new Error('chatId is required');\r\n if (!config.apiKey) throw new Error('apiKey is required');\r\n\r\n // Normalize baseUrl: remove trailing slash\r\n const baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\r\n\r\n this.config = {\r\n ...config,\r\n baseUrl,\r\n };\r\n }\r\n\r\n /**\r\n * Get the HTTP headers used for all requests.\r\n */\r\n private get headers(): Record<string, string> {\r\n return {\r\n 'Content-Type': 'application/json',\r\n 'x-api-key': this.config.apiKey,\r\n };\r\n }\r\n\r\n /**\r\n * Make a POST request to the QOpenWA API.\r\n */\r\n private async post<TBody, TResponse>(\r\n endpoint: string,\r\n body: TBody,\r\n ): Promise<TResponse> {\r\n const url = `${this.config.baseUrl}/api/sessions/${this.config.sessionId}${endpoint}`;\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: this.headers,\r\n body: JSON.stringify(body),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorBody = await response.json().catch(() => ({}));\r\n throw new QWAError(\r\n `API request failed: ${response.status} ${response.statusText}`,\r\n response.status,\r\n errorBody,\r\n );\r\n }\r\n\r\n return response.json() as Promise<TResponse>;\r\n }\r\n\r\n /**\r\n * Send a text message to the configured chat.\r\n *\r\n * @param payload - The text message payload. If a string is passed, it will be\r\n * used as the message text with the configured chatId.\r\n * @returns The API response.\r\n *\r\n * @example\r\n * ```ts\r\n * await client.sendText({ text: 'Hello, World!' });\r\n * await client.sendText('Hello, World!'); // shorthand\r\n * ```\r\n */\r\n async sendText(\r\n payload: SendTextPayload | string,\r\n ): Promise<QWAResponse> {\r\n const normalized: SendTextPayload =\r\n typeof payload === 'string'\r\n ? { chatId: this.config.chatId, text: payload }\r\n : { ...payload, chatId: payload.chatId ?? this.config.chatId };\r\n\r\n return this.post<SendTextPayload, QWAResponse>(\r\n '/messages/send-text',\r\n normalized,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for QWA API errors.\r\n */\r\nexport class QWAError extends Error {\r\n public readonly statusCode: number;\r\n public readonly body: unknown;\r\n\r\n constructor(message: string, statusCode: number, body: unknown) {\r\n super(message);\r\n this.name = 'QWAError';\r\n this.statusCode = statusCode;\r\n this.body = body;\r\n }\r\n}\r\n"]}
|