@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 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 | DescripciΓ³n |
144
- |-------------|----------|--------------------------------------------------|
145
- | `baseUrl` | `string` | URL base de la API de QOpenWA |
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
- > ⚠️ Todos los campos son obligatorios. Si falta alguno, el constructor lanza un error.
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: config.baseUrl.replace(/\/+$/, "")
14
+ baseUrl
14
15
  };
15
16
  }
16
17
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;AAuBO,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAC1D,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,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE;AAAA,KAC5C;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/**\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 * baseUrl: 'https://api.wa.a.arisnetxsolutions.com',\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: QWAConfig;\r\n\r\n constructor(config: QWAConfig) {\r\n if (!config.baseUrl) throw new Error('baseUrl is required');\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 this.config = {\r\n ...config,\r\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\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"]}
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 (e.g. https://api.wa.a.arisnetxsolutions.com) */
4
- baseUrl: string;
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 (e.g. https://api.wa.a.arisnetxsolutions.com) */
4
- baseUrl: string;
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: config.baseUrl.replace(/\/+$/, "")
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":";AAuBO,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAC1D,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,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE;AAAA,KAC5C;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/**\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 * baseUrl: 'https://api.wa.a.arisnetxsolutions.com',\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: QWAConfig;\r\n\r\n constructor(config: QWAConfig) {\r\n if (!config.baseUrl) throw new Error('baseUrl is required');\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 this.config = {\r\n ...config,\r\n baseUrl: config.baseUrl.replace(/\\/+$/, ''),\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"]}
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arisnetxsolutions/qwa-sdk",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "SDK para la API de QOpenWA - EnvΓ­o de mensajes de WhatsApp",
5
5
  "keywords": [
6
6
  "whatsapp",