@qrvey/sms 0.0.2 → 0.0.3

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
@@ -1,7 +1,7 @@
1
1
  # @qrvey/sms
2
2
 
3
3
  ![install size](https://packagephobia.now.sh/badge?p=%40qrvey%2Fsms)
4
- ![coverage](https://img.shields.io/badge/unit_test_coverage-88%25-brightgreen)
4
+ ![coverage](https://img.shields.io/badge/unit_test_coverage-87%25-brightgreen)
5
5
 
6
6
  **@qrvey/sms** is a lightweight and reliable library to send manage sms messages. It supports different clients such SNS (AWS), ACS (Azure), Twilio, and Vonage.
7
7
 
@@ -10,30 +10,19 @@ class TwilioSMSSenderClient {
10
10
  to: phone,
11
11
  body: message,
12
12
  });
13
- if (constants_1.USERNAME && constants_1.PASSWORD)
13
+ if (constants_1.USERNAME && constants_1.PASSWORD && constants_1.FROM)
14
14
  this.client = new twilio_1.Twilio(constants_1.USERNAME, constants_1.PASSWORD);
15
15
  else
16
16
  throw new errors_1.NotProvidedCredentialsError();
17
17
  }
18
18
  async send(phones = [], message) {
19
- const sentMessages = await Promise.all(phones.map((phone) => this.sendOne(phone, message)));
20
19
  const result = {
21
20
  sent: [],
22
21
  failed: [],
23
22
  };
24
- sentMessages.forEach((message) => {
25
- if (message.errorMessage) {
26
- result.failed.push({
27
- phone: message.to,
28
- error: message.errorMessage,
29
- });
30
- }
31
- else {
32
- result.sent.push({
33
- phone: message.to,
34
- });
35
- }
36
- });
23
+ await Promise.all(phones.map((phone) => this.sendOne(phone, message)
24
+ .then(() => result.sent.push({ phone }))
25
+ .catch((error) => result.failed.push({ phone, error: error.message }))));
37
26
  return result;
38
27
  }
39
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"twilioSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/twilioSmsSender.client.ts"],"names":[],"mappings":";;AACA,mCAAgC;AAChC,qDAAiE;AAGjE,yCAA2D;AAE3D,MAAqB,qBAAqB;IAEtC;QAiCQ,YAAO,GAAG,CACd,KAAa,EACb,OAAe,EACS,EAAE,CAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,gBAAI;YACV,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO;SAChB,CAAC,CAAC;QAxCH,IAAI,oBAAQ,IAAI,oBAAQ;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,oBAAQ,EAAE,oBAAQ,CAAC,CAAC;;YAClE,MAAM,IAAI,oCAA2B,EAAE,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,SAAmB,EAAE,EACrB,OAAe;QAEf,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CACtD,CAAC;QAEF,MAAM,MAAM,GAAe;YACvB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACb,CAAC;QACF,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,CAAC,YAAY,EAAE;gBACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,OAAO,CAAC,EAAE;oBACjB,KAAK,EAAE,OAAO,CAAC,YAAY;iBAC9B,CAAC,CAAC;aACN;iBAAM;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;oBACb,KAAK,EAAE,OAAO,CAAC,EAAE;iBACpB,CAAC,CAAC;aACN;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;CAWJ;AA5CD,wCA4CC"}
1
+ {"version":3,"file":"twilioSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/twilioSmsSender.client.ts"],"names":[],"mappings":";;AACA,mCAAgC;AAChC,qDAAiE;AAGjE,yCAA2D;AAE3D,MAAqB,qBAAqB;IAEtC;QA4BQ,YAAO,GAAG,CACd,KAAa,EACb,OAAe,EACS,EAAE,CAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxB,IAAI,EAAE,gBAAI;YACV,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO;SAChB,CAAC,CAAC;QAnCH,IAAI,oBAAQ,IAAI,oBAAQ,IAAI,gBAAI;YAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,oBAAQ,EAAE,oBAAQ,CAAC,CAAC;;YAC5C,MAAM,IAAI,oCAA2B,EAAE,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,IAAI,CACb,SAAmB,EAAE,EACrB,OAAe;QAEf,MAAM,MAAM,GAAe;YACvB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;aACvB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CACtD,CACR,CACJ,CAAC;QAEF,OAAO,MAAM,CAAC;IAClB,CAAC;CAWJ;AAvCD,wCAuCC"}
@@ -24,9 +24,18 @@ class VonageSMSSenderClient {
24
24
  sent: [],
25
25
  failed: [],
26
26
  };
27
- await Promise.all(phones.map((phone) => this.sendOne(phone, message)
28
- .then(() => result.sent.push({ phone }))
29
- .catch((error) => result.failed.push({ phone, error: error.message }))));
27
+ await Promise.all(phones.map((phone) => this.sendOne(phone, message).then((data) => {
28
+ var _a;
29
+ if ((_a = data.messages) === null || _a === void 0 ? void 0 : _a.some((message) => message.status !== '0')) {
30
+ result.failed.push({
31
+ phone,
32
+ error: data.messages[0].errorText,
33
+ });
34
+ }
35
+ else {
36
+ result.sent.push({ phone });
37
+ }
38
+ })));
30
39
  return result;
31
40
  }
32
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"vonageSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/vonageSmsSender.client.ts"],"names":[],"mappings":";;AAEA,mDAA4C;AAC5C,uCAAoC;AACpC,qDAAiE;AACjE,yCAA2D;AAG3D,MAAqB,qBAAqB;IAEtC;QA6BQ,YAAO,GAAG,CAAC,KAAa,EAAE,OAAe,EAAwB,EAAE,CACvE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAc;SACvB,CAAC,CAAC;QAjCH,IAAI,CAAC,CAAC,oBAAQ,IAAI,oBAAQ,IAAI,gBAAI,CAAC;YAC/B,MAAM,IAAI,oCAA2B,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,WAAI,CAAC;YACxB,MAAM,EAAE,oBAAQ;YAChB,SAAS,EAAE,oBAAQ;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAgB,EAAE,OAAe;QAC/C,MAAM,MAAM,GAAe;YACvB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;aACvB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CACtD,CACR,CACJ,CAAC;QAEF,OAAO,MAAM,CAAC;IAClB,CAAC;CAQJ;AArCD,wCAqCC"}
1
+ {"version":3,"file":"vonageSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/vonageSmsSender.client.ts"],"names":[],"mappings":";;AAEA,mDAA4C;AAC5C,uCAAoC;AACpC,qDAAiE;AACjE,yCAA2D;AAG3D,MAAqB,qBAAqB;IAEtC;QAoCQ,YAAO,GAAG,CAAC,KAAa,EAAE,OAAe,EAAwB,EAAE,CACvE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAc;SACvB,CAAC,CAAC;QAxCH,IAAI,CAAC,CAAC,oBAAQ,IAAI,oBAAQ,IAAI,gBAAI,CAAC;YAC/B,MAAM,IAAI,oCAA2B,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,WAAI,CAAC;YACxB,MAAM,EAAE,oBAAQ;YAChB,SAAS,EAAE,oBAAQ;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAM,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAgB,EAAE,OAAe;QAC/C,MAAM,MAAM,GAAe;YACvB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;;YACvC,IACI,MAAA,IAAI,CAAC,QAAQ,0CAAE,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,EAC1D;gBACE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,KAAK;oBACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;iBACpC,CAAC,CAAC;aACN;iBAAM;gBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;aAC/B;QACL,CAAC,CAAC,CACL,CACJ,CAAC;QAEF,OAAO,MAAM,CAAC;IAClB,CAAC;CAQJ;AA5CD,wCA4CC"}
@@ -12,10 +12,10 @@ var SMSSenderFactory = class {
12
12
  }
13
13
  };
14
14
  SMSSenderFactory.providerModules = {
15
- twilio: () => import('./twilioSmsSender.client-OKXZ2R67.mjs'),
15
+ twilio: () => import('./twilioSmsSender.client-SSZMXU4M.mjs'),
16
16
  aws: () => import('./awsSmsSender.client-4AURYPI4.mjs'),
17
17
  azure: () => import('./azureSmsSender.client-K6MPTIU7.mjs'),
18
- vonage: () => import('./vonageSmsSender.client-TOAW6CJU.mjs')
18
+ vonage: () => import('./vonageSmsSender.client-FSND4BQX.mjs')
19
19
  };
20
20
 
21
21
  // src/services/smsSender.service.ts
@@ -8,35 +8,27 @@ var TwilioSMSSenderClient = class {
8
8
  to: phone,
9
9
  body: message
10
10
  });
11
- if (USERNAME && PASSWORD)
11
+ if (USERNAME && PASSWORD && FROM)
12
12
  this.client = new Twilio(USERNAME, PASSWORD);
13
13
  else
14
14
  throw new NotProvidedCredentialsError();
15
15
  }
16
16
  async send(phones = [], message) {
17
- const sentMessages = await Promise.all(
18
- phones.map((phone) => this.sendOne(phone, message))
19
- );
20
17
  const result = {
21
18
  sent: [],
22
19
  failed: []
23
20
  };
24
- sentMessages.forEach((message2) => {
25
- if (message2.errorMessage) {
26
- result.failed.push({
27
- phone: message2.to,
28
- error: message2.errorMessage
29
- });
30
- } else {
31
- result.sent.push({
32
- phone: message2.to
33
- });
34
- }
35
- });
21
+ await Promise.all(
22
+ phones.map(
23
+ (phone) => this.sendOne(phone, message).then(() => result.sent.push({ phone })).catch(
24
+ (error) => result.failed.push({ phone, error: error.message })
25
+ )
26
+ )
27
+ );
36
28
  return result;
37
29
  }
38
30
  };
39
31
 
40
32
  export { TwilioSMSSenderClient as default };
41
33
  //# sourceMappingURL=out.js.map
42
- //# sourceMappingURL=twilioSmsSender.client-OKXZ2R67.mjs.map
34
+ //# sourceMappingURL=twilioSmsSender.client-SSZMXU4M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/clients/twilioSmsSender.client.ts"],"names":[],"mappings":";;;;;;;;AACA,SAAS,cAAc;AAMvB,IAAqB,wBAArB,MAAiE;AAAA,EAE7D,cAAc;AA4Bd,SAAQ,UAAU,CACd,OACA,YAEA,KAAK,OAAO,SAAS,OAAO;AAAA,MACxB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,IACV,CAAC;AAnCD,QAAI,YAAY,YAAY;AACxB,WAAK,SAAS,IAAI,OAAO,UAAU,QAAQ;AAAA;AAC1C,YAAM,IAAI,4BAA4B;AAAA,EAC/C;AAAA,EAEA,MAAa,KACT,SAAmB,CAAC,GACpB,SACmB;AACnB,UAAM,SAAqB;AAAA,MACvB,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACb;AAEA,UAAM,QAAQ;AAAA,MACV,OAAO;AAAA,QAAI,CAAC,UACR,KAAK,QAAQ,OAAO,OAAO,EACtB,KAAK,MAAM,OAAO,KAAK,KAAK,EAAE,MAAM,CAAC,CAAC,EACtC;AAAA,UAAM,CAAC,UACJ,OAAO,OAAO,KAAK,EAAE,OAAO,OAAO,MAAM,QAAQ,CAAC;AAAA,QACtD;AAAA,MACR;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAWJ","sourcesContent":["import { ISMSSender } from '../../interfaces/smsSender.interface';\nimport { Twilio } from 'twilio';\nimport { USERNAME, PASSWORD, FROM } from '../../utils/constants';\nimport { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message';\nimport { SendResult } from '../../types/sendResult.type';\nimport { NotProvidedCredentialsError } from '../../errors';\n\nexport default class TwilioSMSSenderClient implements ISMSSender {\n private client: Twilio;\n constructor() {\n if (USERNAME && PASSWORD && FROM)\n this.client = new Twilio(USERNAME, PASSWORD);\n else throw new NotProvidedCredentialsError();\n }\n\n public async send(\n phones: string[] = [],\n message: string,\n ): Promise<SendResult> {\n const result: SendResult = {\n sent: [],\n failed: [],\n };\n\n await Promise.all(\n phones.map((phone) =>\n this.sendOne(phone, message)\n .then(() => result.sent.push({ phone }))\n .catch((error) =>\n result.failed.push({ phone, error: error.message }),\n ),\n ),\n );\n\n return result;\n }\n\n private sendOne = (\n phone: string,\n message: string,\n ): Promise<MessageInstance> =>\n this.client.messages.create({\n from: FROM,\n to: phone,\n body: message,\n });\n}\n"]}
@@ -24,9 +24,17 @@ var VonageSMSSenderClient = class {
24
24
  };
25
25
  await Promise.all(
26
26
  phones.map(
27
- (phone) => this.sendOne(phone, message).then(() => result.sent.push({ phone })).catch(
28
- (error) => result.failed.push({ phone, error: error.message })
29
- )
27
+ (phone) => this.sendOne(phone, message).then((data) => {
28
+ var _a;
29
+ if ((_a = data.messages) == null ? void 0 : _a.some((message2) => message2.status !== "0")) {
30
+ result.failed.push({
31
+ phone,
32
+ error: data.messages[0].errorText
33
+ });
34
+ } else {
35
+ result.sent.push({ phone });
36
+ }
37
+ })
30
38
  )
31
39
  );
32
40
  return result;
@@ -35,4 +43,4 @@ var VonageSMSSenderClient = class {
35
43
 
36
44
  export { VonageSMSSenderClient as default };
37
45
  //# sourceMappingURL=out.js.map
38
- //# sourceMappingURL=vonageSmsSender.client-TOAW6CJU.mjs.map
46
+ //# sourceMappingURL=vonageSmsSender.client-FSND4BQX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/clients/vonageSmsSender.client.ts"],"names":["message"],"mappings":";;;;;;;;AAEA,SAAS,cAAc;AACvB,SAAS,YAAY;AAKrB,IAAqB,wBAArB,MAAiE;AAAA,EAE7D,cAAc;AAoCd,SAAQ,UAAU,CAAC,OAAe,YAC9B,KAAK,OAAO,IAAI,KAAK;AAAA,MACjB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,IACV,CAAC;AAxCD,QAAI,EAAE,YAAY,YAAY;AAC1B,YAAM,IAAI,4BAA4B;AAC1C,UAAM,aAAa,IAAI,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,WAAW;AAAA,IACf,CAAC;AACD,SAAK,SAAS,IAAI,OAAO,UAAU;AAAA,EACvC;AAAA,EAEA,MAAa,KAAK,QAAkB,SAAsC;AACtE,UAAM,SAAqB;AAAA,MACvB,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACb;AAEA,UAAM,QAAQ;AAAA,MACV,OAAO;AAAA,QAAI,CAAC,UACR,KAAK,QAAQ,OAAO,OAAO,EAAE,KAAK,CAAC,SAAS;AA5B5D;AA6BoB,eACI,UAAK,aAAL,mBAAe,KAAK,CAACA,aAAYA,SAAQ,WAAW,MACtD;AACE,mBAAO,OAAO,KAAK;AAAA,cACf;AAAA,cACA,OAAO,KAAK,SAAS,CAAC,EAAE;AAAA,YAC5B,CAAC;AAAA,UACL,OAAO;AACH,mBAAO,KAAK,KAAK,EAAE,MAAM,CAAC;AAAA,UAC9B;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAQJ","sourcesContent":["import { ISMSSender } from '../../interfaces';\nimport { SendResult } from '../../types';\nimport { Vonage } from '@vonage/server-sdk';\nimport { Auth } from '@vonage/auth';\nimport { USERNAME, PASSWORD, FROM } from '../../utils/constants';\nimport { NotProvidedCredentialsError } from '../../errors';\nimport { SMSMessages } from '@vonage/sms/dist/lib/types/SMSMessages';\n\nexport default class VonageSMSSenderClient implements ISMSSender {\n private client: Vonage;\n constructor() {\n if (!(USERNAME && PASSWORD && FROM))\n throw new NotProvidedCredentialsError();\n const vonageAuth = new Auth({\n apiKey: USERNAME,\n apiSecret: PASSWORD,\n });\n this.client = new Vonage(vonageAuth);\n }\n\n public async send(phones: string[], message: string): Promise<SendResult> {\n const result: SendResult = {\n sent: [],\n failed: [],\n };\n\n await Promise.all(\n phones.map((phone) =>\n this.sendOne(phone, message).then((data) => {\n if (\n data.messages?.some((message) => message.status !== '0')\n ) {\n result.failed.push({\n phone,\n error: data.messages[0].errorText,\n });\n } else {\n result.sent.push({ phone });\n }\n }),\n ),\n );\n\n return result;\n }\n\n private sendOne = (phone: string, message: string): Promise<SMSMessages> =>\n this.client.sms.send({\n to: phone,\n text: message,\n from: FROM as string,\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qrvey/sms",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "types": "dist/types/index.d.ts",
5
5
  "main": "dist/cjs/index.js",
6
6
  "exports": {
@@ -27,6 +27,7 @@ jest.mock('twilio', () => {
27
27
  jest.mock('../../utils/constants', () => ({
28
28
  USERNAME: 'qrvey',
29
29
  PASSWORD: '123456',
30
+ FROM: '+123456789',
30
31
  }));
31
32
 
32
33
  describe('TwilioSMSSender tests.', () => {
@@ -8,7 +8,8 @@ import { NotProvidedCredentialsError } from '../../errors';
8
8
  export default class TwilioSMSSenderClient implements ISMSSender {
9
9
  private client: Twilio;
10
10
  constructor() {
11
- if (USERNAME && PASSWORD) this.client = new Twilio(USERNAME, PASSWORD);
11
+ if (USERNAME && PASSWORD && FROM)
12
+ this.client = new Twilio(USERNAME, PASSWORD);
12
13
  else throw new NotProvidedCredentialsError();
13
14
  }
14
15
 
@@ -16,26 +17,20 @@ export default class TwilioSMSSenderClient implements ISMSSender {
16
17
  phones: string[] = [],
17
18
  message: string,
18
19
  ): Promise<SendResult> {
19
- const sentMessages = await Promise.all(
20
- phones.map((phone) => this.sendOne(phone, message)),
21
- );
22
-
23
20
  const result: SendResult = {
24
21
  sent: [],
25
22
  failed: [],
26
23
  };
27
- sentMessages.forEach((message) => {
28
- if (message.errorMessage) {
29
- result.failed.push({
30
- phone: message.to,
31
- error: message.errorMessage,
32
- });
33
- } else {
34
- result.sent.push({
35
- phone: message.to,
36
- });
37
- }
38
- });
24
+
25
+ await Promise.all(
26
+ phones.map((phone) =>
27
+ this.sendOne(phone, message)
28
+ .then(() => result.sent.push({ phone }))
29
+ .catch((error) =>
30
+ result.failed.push({ phone, error: error.message }),
31
+ ),
32
+ ),
33
+ );
39
34
 
40
35
  return result;
41
36
  }
@@ -26,11 +26,18 @@ export default class VonageSMSSenderClient implements ISMSSender {
26
26
 
27
27
  await Promise.all(
28
28
  phones.map((phone) =>
29
- this.sendOne(phone, message)
30
- .then(() => result.sent.push({ phone }))
31
- .catch((error) =>
32
- result.failed.push({ phone, error: error.message }),
33
- ),
29
+ this.sendOne(phone, message).then((data) => {
30
+ if (
31
+ data.messages?.some((message) => message.status !== '0')
32
+ ) {
33
+ result.failed.push({
34
+ phone,
35
+ error: data.messages[0].errorText,
36
+ });
37
+ } else {
38
+ result.sent.push({ phone });
39
+ }
40
+ }),
34
41
  ),
35
42
  );
36
43
 
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/clients/twilioSmsSender.client.ts"],"names":["message"],"mappings":";;;;;;;;AACA,SAAS,cAAc;AAMvB,IAAqB,wBAArB,MAAiE;AAAA,EAE7D,cAAc;AAiCd,SAAQ,UAAU,CACd,OACA,YAEA,KAAK,OAAO,SAAS,OAAO;AAAA,MACxB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,IACV,CAAC;AAxCD,QAAI,YAAY;AAAU,WAAK,SAAS,IAAI,OAAO,UAAU,QAAQ;AAAA;AAChE,YAAM,IAAI,4BAA4B;AAAA,EAC/C;AAAA,EAEA,MAAa,KACT,SAAmB,CAAC,GACpB,SACmB;AACnB,UAAM,eAAe,MAAM,QAAQ;AAAA,MAC/B,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,OAAO,OAAO,CAAC;AAAA,IACtD;AAEA,UAAM,SAAqB;AAAA,MACvB,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACb;AACA,iBAAa,QAAQ,CAACA,aAAY;AAC9B,UAAIA,SAAQ,cAAc;AACtB,eAAO,OAAO,KAAK;AAAA,UACf,OAAOA,SAAQ;AAAA,UACf,OAAOA,SAAQ;AAAA,QACnB,CAAC;AAAA,MACL,OAAO;AACH,eAAO,KAAK,KAAK;AAAA,UACb,OAAOA,SAAQ;AAAA,QACnB,CAAC;AAAA,MACL;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,EACX;AAWJ","sourcesContent":["import { ISMSSender } from '../../interfaces/smsSender.interface';\nimport { Twilio } from 'twilio';\nimport { USERNAME, PASSWORD, FROM } from '../../utils/constants';\nimport { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message';\nimport { SendResult } from '../../types/sendResult.type';\nimport { NotProvidedCredentialsError } from '../../errors';\n\nexport default class TwilioSMSSenderClient implements ISMSSender {\n private client: Twilio;\n constructor() {\n if (USERNAME && PASSWORD) this.client = new Twilio(USERNAME, PASSWORD);\n else throw new NotProvidedCredentialsError();\n }\n\n public async send(\n phones: string[] = [],\n message: string,\n ): Promise<SendResult> {\n const sentMessages = await Promise.all(\n phones.map((phone) => this.sendOne(phone, message)),\n );\n\n const result: SendResult = {\n sent: [],\n failed: [],\n };\n sentMessages.forEach((message) => {\n if (message.errorMessage) {\n result.failed.push({\n phone: message.to,\n error: message.errorMessage,\n });\n } else {\n result.sent.push({\n phone: message.to,\n });\n }\n });\n\n return result;\n }\n\n private sendOne = (\n phone: string,\n message: string,\n ): Promise<MessageInstance> =>\n this.client.messages.create({\n from: FROM,\n to: phone,\n body: message,\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/services/clients/vonageSmsSender.client.ts"],"names":[],"mappings":";;;;;;;;AAEA,SAAS,cAAc;AACvB,SAAS,YAAY;AAKrB,IAAqB,wBAArB,MAAiE;AAAA,EAE7D,cAAc;AA6Bd,SAAQ,UAAU,CAAC,OAAe,YAC9B,KAAK,OAAO,IAAI,KAAK;AAAA,MACjB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,IACV,CAAC;AAjCD,QAAI,EAAE,YAAY,YAAY;AAC1B,YAAM,IAAI,4BAA4B;AAC1C,UAAM,aAAa,IAAI,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,WAAW;AAAA,IACf,CAAC;AACD,SAAK,SAAS,IAAI,OAAO,UAAU;AAAA,EACvC;AAAA,EAEA,MAAa,KAAK,QAAkB,SAAsC;AACtE,UAAM,SAAqB;AAAA,MACvB,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACb;AAEA,UAAM,QAAQ;AAAA,MACV,OAAO;AAAA,QAAI,CAAC,UACR,KAAK,QAAQ,OAAO,OAAO,EACtB,KAAK,MAAM,OAAO,KAAK,KAAK,EAAE,MAAM,CAAC,CAAC,EACtC;AAAA,UAAM,CAAC,UACJ,OAAO,OAAO,KAAK,EAAE,OAAO,OAAO,MAAM,QAAQ,CAAC;AAAA,QACtD;AAAA,MACR;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAQJ","sourcesContent":["import { ISMSSender } from '../../interfaces';\nimport { SendResult } from '../../types';\nimport { Vonage } from '@vonage/server-sdk';\nimport { Auth } from '@vonage/auth';\nimport { USERNAME, PASSWORD, FROM } from '../../utils/constants';\nimport { NotProvidedCredentialsError } from '../../errors';\nimport { SMSMessages } from '@vonage/sms/dist/lib/types/SMSMessages';\n\nexport default class VonageSMSSenderClient implements ISMSSender {\n private client: Vonage;\n constructor() {\n if (!(USERNAME && PASSWORD && FROM))\n throw new NotProvidedCredentialsError();\n const vonageAuth = new Auth({\n apiKey: USERNAME,\n apiSecret: PASSWORD,\n });\n this.client = new Vonage(vonageAuth);\n }\n\n public async send(phones: string[], message: string): Promise<SendResult> {\n const result: SendResult = {\n sent: [],\n failed: [],\n };\n\n await Promise.all(\n phones.map((phone) =>\n this.sendOne(phone, message)\n .then(() => result.sent.push({ phone }))\n .catch((error) =>\n result.failed.push({ phone, error: error.message }),\n ),\n ),\n );\n\n return result;\n }\n\n private sendOne = (phone: string, message: string): Promise<SMSMessages> =>\n this.client.sms.send({\n to: phone,\n text: message,\n from: FROM as string,\n });\n}\n"]}