@qrvey/sms 0.0.1
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 +74 -0
- package/__tests__/__mocks__/SMSSender.mock.ts +10 -0
- package/coverageReader.sh +50 -0
- package/dist/cjs/errors/index.js +19 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/errors/notProvidedCredentials.error.js +11 -0
- package/dist/cjs/errors/notProvidedCredentials.error.js.map +1 -0
- package/dist/cjs/errors/unknownProvider.error.js +11 -0
- package/dist/cjs/errors/unknownProvider.error.js.map +1 -0
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/index.js +18 -0
- package/dist/cjs/interfaces/index.js.map +1 -0
- package/dist/cjs/interfaces/smsSender.interface.js +3 -0
- package/dist/cjs/interfaces/smsSender.interface.js.map +1 -0
- package/dist/cjs/services/clients/awsSmsSender.client.js +37 -0
- package/dist/cjs/services/clients/awsSmsSender.client.js.map +1 -0
- package/dist/cjs/services/clients/azureSmsSender.client.js +36 -0
- package/dist/cjs/services/clients/azureSmsSender.client.js.map +1 -0
- package/dist/cjs/services/clients/twilioSmsSender.client.js +41 -0
- package/dist/cjs/services/clients/twilioSmsSender.client.js.map +1 -0
- package/dist/cjs/services/clients/vonageSmsSender.client.js +34 -0
- package/dist/cjs/services/clients/vonageSmsSender.client.js.map +1 -0
- package/dist/cjs/services/index.js +18 -0
- package/dist/cjs/services/index.js.map +1 -0
- package/dist/cjs/services/smsSender.service.js +17 -0
- package/dist/cjs/services/smsSender.service.js.map +1 -0
- package/dist/cjs/services/smsSenderFactory.service.js +45 -0
- package/dist/cjs/services/smsSenderFactory.service.js.map +1 -0
- package/dist/cjs/types/index.js +19 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/sendResult.type.js +3 -0
- package/dist/cjs/types/sendResult.type.js.map +1 -0
- package/dist/cjs/types/smsProviderModule.type.js +3 -0
- package/dist/cjs/types/smsProviderModule.type.js.map +1 -0
- package/dist/cjs/utils/constants.js +9 -0
- package/dist/cjs/utils/constants.js.map +1 -0
- package/dist/esm/awsSmsSender.client-DGZ2JYIG.mjs +41 -0
- package/dist/esm/awsSmsSender.client-DGZ2JYIG.mjs.map +1 -0
- package/dist/esm/azureSmsSender.client-K6MPTIU7.mjs +36 -0
- package/dist/esm/azureSmsSender.client-K6MPTIU7.mjs.map +1 -0
- package/dist/esm/chunk-NCQDKWNI.mjs +26 -0
- package/dist/esm/chunk-NCQDKWNI.mjs.map +1 -0
- package/dist/esm/index.d.mts +20 -0
- package/dist/esm/index.mjs +36 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/twilioSmsSender.client-2Z4R25US.mjs +42 -0
- package/dist/esm/twilioSmsSender.client-2Z4R25US.mjs.map +1 -0
- package/dist/esm/vonageSmsSender.client-23U65FBQ.mjs +38 -0
- package/dist/esm/vonageSmsSender.client-23U65FBQ.mjs.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/jest.config.ts +15 -0
- package/package.json +80 -0
- package/src/errors/index.test.ts +13 -0
- package/src/errors/index.ts +2 -0
- package/src/errors/notProvidedCredentials.error.ts +6 -0
- package/src/errors/unknownProvider.error.ts +6 -0
- package/src/index.test.ts +7 -0
- package/src/index.ts +2 -0
- package/src/interfaces/index.ts +1 -0
- package/src/interfaces/smsSender.interface.ts +5 -0
- package/src/services/clients/awsSmsSender.client.test.ts +39 -0
- package/src/services/clients/awsSmsSender.client.ts +57 -0
- package/src/services/clients/azureSmsSender.client.test.ts +46 -0
- package/src/services/clients/azureSmsSender.client.ts +38 -0
- package/src/services/clients/index.test.ts +50 -0
- package/src/services/clients/index.ts +4 -0
- package/src/services/clients/twilioSmsSender.client.test.ts +48 -0
- package/src/services/clients/twilioSmsSender.client.ts +52 -0
- package/src/services/clients/voangeSmsSender.client.test.ts +48 -0
- package/src/services/clients/vonageSmsSender.client.ts +49 -0
- package/src/services/index.test.ts +12 -0
- package/src/services/index.ts +1 -0
- package/src/services/smsSender.service.ts +16 -0
- package/src/services/smsSenderFactory.service.test.ts +16 -0
- package/src/services/smsSenderFactory.service.ts +24 -0
- package/src/types/index.ts +2 -0
- package/src/types/sendResult.type.ts +9 -0
- package/src/types/smsProviderModule.type.ts +5 -0
- package/src/utils/constants.ts +6 -0
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +17 -0
- package/tsup.config.cjs.ts +9 -0
- package/tsup.config.esm.ts +10 -0
- package/tsup.config.types.ts +9 -0
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# @qrvey/sms
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+
|
|
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
|
+
|
|
8
|
+
## Installation
|
|
9
|
+
|
|
10
|
+
You can install the **@qrvey/sms** package via npm. Run the following command in your terminal:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @qrvey/sms
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
To work properly, the package need some env variables. To set the sms provider, you must set the `SMS_PROVIDER` env variable with one of these values:
|
|
19
|
+
- `AWS`
|
|
20
|
+
- `AZURE`
|
|
21
|
+
- `TWILIO`
|
|
22
|
+
- `VONAGE`
|
|
23
|
+
|
|
24
|
+
In case the `SMS_PROVIDER` env variable is set with an unknown value, you will get a `UnknownProvider` error. Depending on the provider you must set some variables:
|
|
25
|
+
|
|
26
|
+
### AWS
|
|
27
|
+
If you set `SMS_PROVIDER = AWS`, the following env variables are required:
|
|
28
|
+
- `SMS_PROVIDER_USERNAME` which is `AWS_ACCESS_KEY_ID` in aws context.
|
|
29
|
+
- `SMS_PROVIDER_PASSWORD` which is `AWS_SECRET_ACCESS_KEY` in aws context.
|
|
30
|
+
- `SMS_PROVIDER_REGION` which is `AWS_REGION` in aws context.
|
|
31
|
+
|
|
32
|
+
### AZURE
|
|
33
|
+
If you set `SMS_PROVIDER = AZURE`, the following env variables are required:
|
|
34
|
+
- `SMS_PROVIDER_USERNAME` which is `resource-name` in azure `connectionString` context.
|
|
35
|
+
- `SMS_PROVIDER_PASSWORD` which is `access-key` in azure `connectionString` context.
|
|
36
|
+
- `SMS_PROVIDER_FROM_NUMBER` which is the ACS-registered number in azure context. This must be in E.164 format, example: "+123456789"
|
|
37
|
+
|
|
38
|
+
**Note**: The azure `connectionString` for `Azure Communication Services` looks like this: `endpoint=https://<resource-name>.communication.azure.com/;accesskey=<access-key>`.
|
|
39
|
+
|
|
40
|
+
### TWILIO
|
|
41
|
+
If you set `SMS_PROVIDER = TWILIO`, the following env variables are required:
|
|
42
|
+
- `SMS_PROVIDER_USERNAME` which is `TWILIO_ACCOUNT_SID` in twilio context.
|
|
43
|
+
- `SMS_PROVIDER_PASSWORD` which is `TWILIO_AUTH_TOKEN` in twilio context.
|
|
44
|
+
|
|
45
|
+
### VONAGE
|
|
46
|
+
If you set `SMS_PROVIDER = VONAGE`, the following env variables are required:
|
|
47
|
+
- `SMS_PROVIDER_USERNAME` which is `VONAGE_API_KEY` in vonage context.
|
|
48
|
+
- `SMS_PROVIDER_PASSWORD` which is `VONAGE_API_SECRET` in vonage context.
|
|
49
|
+
- `SMS_PROVIDER_FROM_NUMBER` which can be one of the next:
|
|
50
|
+
- An alphanumeric ID. Example: "MyCompanyBrand"
|
|
51
|
+
- A Vonage-registered number in E.164 format. Example: "+123456789".
|
|
52
|
+
- A local-registered short number. Example: "12345".
|
|
53
|
+
|
|
54
|
+
## API Documentation
|
|
55
|
+
|
|
56
|
+
### Available Methods
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
send: (phones: string[], message: string) => Promise<SendResult>;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## Example Usage
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
const phones: string[] = [
|
|
67
|
+
"+123456789",
|
|
68
|
+
"+9876543210"
|
|
69
|
+
];
|
|
70
|
+
const message = "Hello world!";
|
|
71
|
+
|
|
72
|
+
const smsSenderService = new SMSSenderService();
|
|
73
|
+
await smsSenderService.send(phones, message);
|
|
74
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ISMSSender } from '../../src/interfaces';
|
|
2
|
+
import { SendResult } from '../../src/types';
|
|
3
|
+
|
|
4
|
+
export class SMSSender implements ISMSSender {
|
|
5
|
+
send = (phones: string[], message: string): Promise<SendResult> =>
|
|
6
|
+
Promise.resolve({
|
|
7
|
+
sent: phones.map((phone) => ({phone})),
|
|
8
|
+
failed: [{phone: '+0987654321', error: "Something went wrong"}],
|
|
9
|
+
});
|
|
10
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
lcovFilePath="./coverage/lcov.info"
|
|
4
|
+
|
|
5
|
+
# Read lcov.info
|
|
6
|
+
if [ ! -f "$lcovFilePath" ]; then
|
|
7
|
+
echo "Error: $lcovFilePath not found."
|
|
8
|
+
exit 1
|
|
9
|
+
fi
|
|
10
|
+
|
|
11
|
+
totalLines=0
|
|
12
|
+
coveredLines=0
|
|
13
|
+
|
|
14
|
+
while read -r line; do
|
|
15
|
+
if [[ "$line" == "LF:"* ]]; then
|
|
16
|
+
found=$(echo "$line" | cut -d':' -f2)
|
|
17
|
+
totalLines=$((totalLines + found))
|
|
18
|
+
elif [[ "$line" == "LH:"* ]]; then
|
|
19
|
+
hit=$(echo "$line" | cut -d':' -f2)
|
|
20
|
+
coveredLines=$((coveredLines + hit))
|
|
21
|
+
fi
|
|
22
|
+
done <"$lcovFilePath"
|
|
23
|
+
|
|
24
|
+
# Calculate coverage percent
|
|
25
|
+
if [ "$totalLines" -ne 0 ]; then
|
|
26
|
+
coveragePercentage=$(echo "scale=2; ($coveredLines / $totalLines) * 100" | bc)
|
|
27
|
+
coveragePercentage=$(printf "%.0f" "$coveragePercentage")
|
|
28
|
+
else
|
|
29
|
+
coveragePercentage=0
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
# Update README.md
|
|
33
|
+
updateReadme() {
|
|
34
|
+
local readmePath="./README.md"
|
|
35
|
+
local badgeRegex="(https://img.shields.io/badge/unit_test_coverage-)[0-9.]+(%25-brightgreen)"
|
|
36
|
+
local badgeURL="https://img.shields.io/badge/unit_test_coverage-${coveragePercentage}%25-brightgreen"
|
|
37
|
+
|
|
38
|
+
# Read current content of README.md
|
|
39
|
+
readmeContent=$(<"$readmePath")
|
|
40
|
+
|
|
41
|
+
# Replace coverage percent before the '%' character in the badge
|
|
42
|
+
newReadmeContent=$(echo "$readmeContent" | sed -E "s|${badgeRegex}|${badgeURL}|")
|
|
43
|
+
|
|
44
|
+
# Overwrite README.md file with the modified content
|
|
45
|
+
echo "$newReadmeContent" >"$readmePath"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
updateReadme
|
|
49
|
+
|
|
50
|
+
echo "Coverage percent: ${coveragePercentage}%"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./unknownProvider.error"), exports);
|
|
18
|
+
__exportStar(require("./notProvidedCredentials.error"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/errors/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC;AACxC,iEAA+C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotProvidedCredentialsError = void 0;
|
|
4
|
+
class NotProvidedCredentialsError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('SMS sender credentials not provided.');
|
|
7
|
+
this.name = 'NotProvidedCredentialsError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.NotProvidedCredentialsError = NotProvidedCredentialsError;
|
|
11
|
+
//# sourceMappingURL=notProvidedCredentials.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notProvidedCredentials.error.js","sourceRoot":"","sources":["../../../src/errors/notProvidedCredentials.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,2BAA4B,SAAQ,KAAK;IAClD;QACI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC9C,CAAC;CACJ;AALD,kEAKC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnknownProviderError = void 0;
|
|
4
|
+
class UnknownProviderError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('Unknown provider. Set PROVIDER env variable');
|
|
7
|
+
this.name = 'UnknownProviderError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.UnknownProviderError = UnknownProviderError;
|
|
11
|
+
//# sourceMappingURL=unknownProvider.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unknownProvider.error.js","sourceRoot":"","sources":["../../../src/errors/unknownProvider.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,oBAAqB,SAAQ,KAAK;IAC3C;QACI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACvC,CAAC;CACJ;AALD,oDAKC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SMSSenderService = void 0;
|
|
4
|
+
var services_1 = require("./services");
|
|
5
|
+
Object.defineProperty(exports, "SMSSenderService", { enumerable: true, get: function () { return services_1.SMSSenderService; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA8C;AAArC,4GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./smsSender.interface"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsSender.interface.js","sourceRoot":"","sources":["../../../src/interfaces/smsSender.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const errors_1 = require("../../errors");
|
|
4
|
+
const constants_1 = require("../../utils/constants");
|
|
5
|
+
const client_sns_1 = require("@aws-sdk/client-sns");
|
|
6
|
+
class AwsSMSSenderClient {
|
|
7
|
+
constructor() {
|
|
8
|
+
this._send = async (phone, message) => {
|
|
9
|
+
const command = new client_sns_1.PublishCommand({
|
|
10
|
+
Message: message,
|
|
11
|
+
PhoneNumber: phone,
|
|
12
|
+
});
|
|
13
|
+
return await this.client.send(command);
|
|
14
|
+
};
|
|
15
|
+
if (!(constants_1.USERNAME && constants_1.PASSWORD))
|
|
16
|
+
throw new errors_1.NotProvidedCredentialsError();
|
|
17
|
+
this.client = new client_sns_1.SNSClient({
|
|
18
|
+
region: constants_1.REGION,
|
|
19
|
+
credentials: {
|
|
20
|
+
accessKeyId: constants_1.USERNAME,
|
|
21
|
+
secretAccessKey: constants_1.PASSWORD,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async send(phones = [], message) {
|
|
26
|
+
const result = {
|
|
27
|
+
sent: [],
|
|
28
|
+
failed: [],
|
|
29
|
+
};
|
|
30
|
+
await Promise.all(phones.map((phone) => this._send(phone, message)
|
|
31
|
+
.then(() => result.sent.push({ phone }))
|
|
32
|
+
.catch((error) => result.failed.push({ phone, error: error.message }))));
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.default = AwsSMSSenderClient;
|
|
37
|
+
//# sourceMappingURL=awsSmsSender.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awsSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/awsSmsSender.client.ts"],"names":[],"mappings":";;AAAA,yCAA2D;AAG3D,qDAAmE;AACnE,oDAI6B;AAE7B,MAAqB,kBAAkB;IAEnC;QAiCQ,UAAK,GAAG,KAAK,EACjB,KAAa,EACb,OAAe,EACc,EAAE;YAC/B,MAAM,OAAO,GAAG,IAAI,2BAAc,CAAC;gBAC/B,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,KAAK;aACrB,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;QA1CE,IAAI,CAAC,CAAC,oBAAQ,IAAI,oBAAQ,CAAC;YAAE,MAAM,IAAI,oCAA2B,EAAE,CAAC;QACrE,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAS,CAAC;YACxB,MAAM,EAAE,kBAAM;YACd,WAAW,EAAE;gBACT,WAAW,EAAE,oBAAQ;gBACrB,eAAe,EAAE,oBAAQ;aAC5B;SACJ,CAAC,CAAC;IACP,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,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;aACrB,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;CAaJ;AA9CD,qCA8CC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const errors_1 = require("../../errors");
|
|
4
|
+
const constants_1 = require("../../utils/constants");
|
|
5
|
+
const communication_sms_1 = require("@azure/communication-sms");
|
|
6
|
+
class AzureSMSSenderClient {
|
|
7
|
+
constructor() {
|
|
8
|
+
if (!(constants_1.USERNAME && constants_1.PASSWORD && constants_1.FROM))
|
|
9
|
+
throw new errors_1.NotProvidedCredentialsError();
|
|
10
|
+
const connectionString = `endpoint=https://${constants_1.USERNAME}.communication.azure.com/;accesskey=${constants_1.PASSWORD}`;
|
|
11
|
+
this.client = new communication_sms_1.SmsClient(connectionString);
|
|
12
|
+
}
|
|
13
|
+
async send(phones, message) {
|
|
14
|
+
const result = {
|
|
15
|
+
sent: [],
|
|
16
|
+
failed: [],
|
|
17
|
+
};
|
|
18
|
+
const smsResults = await this.client.send({
|
|
19
|
+
from: constants_1.FROM,
|
|
20
|
+
to: phones,
|
|
21
|
+
message: message,
|
|
22
|
+
});
|
|
23
|
+
smsResults.forEach((smsResult) => {
|
|
24
|
+
if (smsResult.errorMessage)
|
|
25
|
+
result.failed.push({
|
|
26
|
+
phone: smsResult.to,
|
|
27
|
+
error: smsResult.errorMessage,
|
|
28
|
+
});
|
|
29
|
+
else
|
|
30
|
+
result.sent.push({ phone: smsResult.to });
|
|
31
|
+
});
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.default = AzureSMSSenderClient;
|
|
36
|
+
//# sourceMappingURL=azureSmsSender.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azureSmsSender.client.js","sourceRoot":"","sources":["../../../../src/services/clients/azureSmsSender.client.ts"],"names":[],"mappings":";;AAAA,yCAA2D;AAG3D,qDAAiE;AACjE,gEAAqD;AAErD,MAAqB,oBAAoB;IAErC;QACI,IAAI,CAAC,CAAC,oBAAQ,IAAI,oBAAQ,IAAI,gBAAI,CAAC;YAC/B,MAAM,IAAI,oCAA2B,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,oBAAoB,oBAAQ,uCAAuC,oBAAQ,EAAE,CAAC;QACvG,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAgB,EAAE,OAAe;QAC/C,MAAM,MAAM,GAAe;YACvB,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,EAAE;SACb,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,IAAI,EAAE,gBAAc;YACpB,EAAE,EAAE,MAAM;YACV,OAAO,EAAE,OAAO;SACnB,CAAC,CAAC;QAEH,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;YAC7B,IAAI,SAAS,CAAC,YAAY;gBACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,KAAK,EAAE,SAAS,CAAC,EAAE;oBACnB,KAAK,EAAE,SAAS,CAAC,YAAY;iBAChC,CAAC,CAAC;;gBACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AA/BD,uCA+BC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const twilio_1 = require("twilio");
|
|
4
|
+
const constants_1 = require("../../utils/constants");
|
|
5
|
+
const errors_1 = require("../../errors");
|
|
6
|
+
class TwilioSMSSenderClient {
|
|
7
|
+
constructor() {
|
|
8
|
+
this._send = (phone, message) => this.client.messages.create({
|
|
9
|
+
from: constants_1.FROM,
|
|
10
|
+
to: phone,
|
|
11
|
+
body: message,
|
|
12
|
+
});
|
|
13
|
+
if (constants_1.USERNAME && constants_1.PASSWORD)
|
|
14
|
+
this.client = new twilio_1.Twilio(constants_1.USERNAME, constants_1.PASSWORD);
|
|
15
|
+
else
|
|
16
|
+
throw new errors_1.NotProvidedCredentialsError();
|
|
17
|
+
}
|
|
18
|
+
async send(phones = [], message) {
|
|
19
|
+
const sentMessages = await Promise.all(phones.map((phone) => this._send(phone, message)));
|
|
20
|
+
const result = {
|
|
21
|
+
sent: [],
|
|
22
|
+
failed: [],
|
|
23
|
+
};
|
|
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
|
+
});
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.default = TwilioSMSSenderClient;
|
|
41
|
+
//# sourceMappingURL=twilioSmsSender.client.js.map
|
|
@@ -0,0 +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,UAAK,GAAG,CACZ,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,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CACpD,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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const server_sdk_1 = require("@vonage/server-sdk");
|
|
4
|
+
const auth_1 = require("@vonage/auth");
|
|
5
|
+
const constants_1 = require("../../utils/constants");
|
|
6
|
+
const errors_1 = require("../../errors");
|
|
7
|
+
class VonageSMSSenderClient {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.send = async (phones, message) => {
|
|
10
|
+
const result = {
|
|
11
|
+
sent: [],
|
|
12
|
+
failed: [],
|
|
13
|
+
};
|
|
14
|
+
await Promise.all(phones.map((phone) => this._send(phone, message)
|
|
15
|
+
.then(() => result.sent.push({ phone }))
|
|
16
|
+
.catch((error) => result.failed.push({ phone, error: error.message }))));
|
|
17
|
+
return result;
|
|
18
|
+
};
|
|
19
|
+
this._send = (phone, message) => this.client.sms.send({
|
|
20
|
+
to: phone,
|
|
21
|
+
text: message,
|
|
22
|
+
from: constants_1.FROM,
|
|
23
|
+
});
|
|
24
|
+
if (!(constants_1.USERNAME && constants_1.PASSWORD && constants_1.FROM))
|
|
25
|
+
throw new errors_1.NotProvidedCredentialsError();
|
|
26
|
+
const vonageAuth = new auth_1.Auth({
|
|
27
|
+
apiKey: constants_1.USERNAME,
|
|
28
|
+
apiSecret: constants_1.PASSWORD,
|
|
29
|
+
});
|
|
30
|
+
this.client = new server_sdk_1.Vonage(vonageAuth);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = VonageSMSSenderClient;
|
|
34
|
+
//# sourceMappingURL=vonageSmsSender.client.js.map
|
|
@@ -0,0 +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;QAUO,SAAI,GAAG,KAAK,EACf,MAAgB,EAChB,OAAe,EACI,EAAE;YACrB,MAAM,MAAM,GAAe;gBACvB,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,EAAE;aACb,CAAC;YAEF,MAAM,OAAO,CAAC,GAAG,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;iBACrB,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;iBACvC,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;YAEF,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC;QAEM,UAAK,GAAG,CAAC,KAAa,EAAE,OAAe,EAAwB,EAAE,CACrE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,gBAAc;SACvB,CAAC,CAAC;QApCH,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;CA8BJ;AAxCD,wCAwCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./smsSender.service"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SMSSenderService = void 0;
|
|
4
|
+
const smsSenderFactory_service_1 = require("./smsSenderFactory.service");
|
|
5
|
+
class SMSSenderService {
|
|
6
|
+
constructor() {
|
|
7
|
+
/**
|
|
8
|
+
* Send a message to one or more phones.
|
|
9
|
+
* @param phones - phone numbers to send to
|
|
10
|
+
* @param message - message to send
|
|
11
|
+
* @returns {Promise<SendResult>} Send result.
|
|
12
|
+
*/
|
|
13
|
+
this.send = async (phones, message) => (await smsSenderFactory_service_1.SMSSenderFactory.getSMSSender()).send(phones, message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.SMSSenderService = SMSSenderService;
|
|
17
|
+
//# sourceMappingURL=smsSender.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsSender.service.js","sourceRoot":"","sources":["../../../src/services/smsSender.service.ts"],"names":[],"mappings":";;;AACA,yEAA8D;AAE9D,MAAa,gBAAgB;IAA7B;QACI;;;;;WAKG;QACI,SAAI,GAAG,KAAK,EACf,MAAgB,EAChB,OAAe,EACI,EAAE,CACrB,CAAC,MAAM,2CAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;CAAA;AAZD,4CAYC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.SMSSenderFactory = void 0;
|
|
27
|
+
const errors_1 = require("../errors");
|
|
28
|
+
const constants_1 = require("../utils/constants");
|
|
29
|
+
class SMSSenderFactory {
|
|
30
|
+
static async getSMSSender() {
|
|
31
|
+
const provider = constants_1.SMS_PROVIDER === null || constants_1.SMS_PROVIDER === void 0 ? void 0 : constants_1.SMS_PROVIDER.toLowerCase();
|
|
32
|
+
if (!provider)
|
|
33
|
+
throw new errors_1.UnknownProviderError();
|
|
34
|
+
const { default: SMSSender } = await this.providerModules[provider]();
|
|
35
|
+
return new SMSSender();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.SMSSenderFactory = SMSSenderFactory;
|
|
39
|
+
SMSSenderFactory.providerModules = {
|
|
40
|
+
twilio: () => Promise.resolve().then(() => __importStar(require('./clients/twilioSmsSender.client'))),
|
|
41
|
+
aws: () => Promise.resolve().then(() => __importStar(require('./clients/awsSmsSender.client'))),
|
|
42
|
+
azure: () => Promise.resolve().then(() => __importStar(require('./clients/azureSmsSender.client'))),
|
|
43
|
+
vonage: () => Promise.resolve().then(() => __importStar(require('./clients/vonageSmsSender.client'))),
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=smsSenderFactory.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsSenderFactory.service.js","sourceRoot":"","sources":["../../../src/services/smsSenderFactory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAiD;AAGjD,kDAAkD;AAElD,MAAa,gBAAgB;IAWzB,MAAM,CAAC,KAAK,CAAC,YAAY;QACrB,MAAM,QAAQ,GAAG,wBAAY,aAAZ,wBAAY,uBAAZ,wBAAY,CAAE,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,6BAAoB,EAAE,CAAC;QAEhD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,SAAS,EAAE,CAAC;IAC3B,CAAC;;AAjBL,4CAkBC;AAjBkB,gCAAe,GAG1B;IACA,MAAM,EAAE,GAAG,EAAE,mDAAQ,kCAAkC,GAAC;IACxD,GAAG,EAAE,GAAG,EAAE,mDAAQ,+BAA+B,GAAC;IAClD,KAAK,EAAE,GAAG,EAAE,mDAAQ,iCAAiC,GAAC;IACtD,MAAM,EAAE,GAAG,EAAE,mDAAQ,kCAAkC,GAAC;CAC3D,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./sendResult.type"), exports);
|
|
18
|
+
__exportStar(require("./smsProviderModule.type"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendResult.type.js","sourceRoot":"","sources":["../../../src/types/sendResult.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smsProviderModule.type.js","sourceRoot":"","sources":["../../../src/types/smsProviderModule.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REGION = exports.FROM = exports.PASSWORD = exports.USERNAME = exports.SMS_PROVIDER = void 0;
|
|
4
|
+
exports.SMS_PROVIDER = process.env.SMS_PROVIDER;
|
|
5
|
+
exports.USERNAME = process.env.SMS_PROVIDER_USERNAME;
|
|
6
|
+
exports.PASSWORD = process.env.SMS_PROVIDER_PASSWORD;
|
|
7
|
+
exports.FROM = process.env.SMS_PROVIDER_FROM_NUMBER;
|
|
8
|
+
exports.REGION = process.env.SMS_PROVIDER_REGION;
|
|
9
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAExC,QAAA,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAC7C,QAAA,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAC7C,QAAA,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;AAC5C,QAAA,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { USERNAME, PASSWORD, NotProvidedCredentialsError, REGION } from './chunk-NCQDKWNI.mjs';
|
|
2
|
+
import { PublishCommand, SNSClient } from '@aws-sdk/client-sns';
|
|
3
|
+
|
|
4
|
+
var AwsSMSSenderClient = class {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._send = async (phone, message) => {
|
|
7
|
+
const command = new PublishCommand({
|
|
8
|
+
Message: message,
|
|
9
|
+
PhoneNumber: phone
|
|
10
|
+
});
|
|
11
|
+
return await this.client.send(command);
|
|
12
|
+
};
|
|
13
|
+
if (!(USERNAME && PASSWORD))
|
|
14
|
+
throw new NotProvidedCredentialsError();
|
|
15
|
+
this.client = new SNSClient({
|
|
16
|
+
region: REGION,
|
|
17
|
+
credentials: {
|
|
18
|
+
accessKeyId: USERNAME,
|
|
19
|
+
secretAccessKey: PASSWORD
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async send(phones = [], message) {
|
|
24
|
+
const result = {
|
|
25
|
+
sent: [],
|
|
26
|
+
failed: []
|
|
27
|
+
};
|
|
28
|
+
await Promise.all(
|
|
29
|
+
phones.map(
|
|
30
|
+
(phone) => this._send(phone, message).then(() => result.sent.push({ phone })).catch(
|
|
31
|
+
(error) => result.failed.push({ phone, error: error.message })
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
);
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { AwsSMSSenderClient as default };
|
|
40
|
+
//# sourceMappingURL=out.js.map
|
|
41
|
+
//# sourceMappingURL=awsSmsSender.client-DGZ2JYIG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/clients/awsSmsSender.client.ts"],"names":[],"mappings":";;;;;;;;AAIA;AAAA,EACI;AAAA,EAEA;AAAA,OACG;AAEP,IAAqB,qBAArB,MAA8D;AAAA,EAE1D,cAAc;AAiCd,SAAQ,QAAQ,OACZ,OACA,YACgC;AAChC,YAAM,UAAU,IAAI,eAAe;AAAA,QAC/B,SAAS;AAAA,QACT,aAAa;AAAA,MACjB,CAAC;AAED,aAAO,MAAM,KAAK,OAAO,KAAK,OAAO;AAAA,IACzC;AA1CI,QAAI,EAAE,YAAY;AAAW,YAAM,IAAI,4BAA4B;AACnE,SAAK,SAAS,IAAI,UAAU;AAAA,MACxB,QAAQ;AAAA,MACR,aAAa;AAAA,QACT,aAAa;AAAA,QACb,iBAAiB;AAAA,MACrB;AAAA,IACJ,CAAC;AAAA,EACL;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,MAAM,OAAO,OAAO,EACpB,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;AAaJ","sourcesContent":["import { NotProvidedCredentialsError } from '../../errors';\nimport { ISMSSender } from '../../interfaces';\nimport { SendResult } from '../../types';\nimport { PASSWORD, REGION, USERNAME } from '../../utils/constants';\nimport {\n PublishCommand,\n PublishCommandOutput,\n SNSClient,\n} from '@aws-sdk/client-sns';\n\nexport default class AwsSMSSenderClient implements ISMSSender {\n private client: SNSClient;\n constructor() {\n if (!(USERNAME && PASSWORD)) throw new NotProvidedCredentialsError();\n this.client = new SNSClient({\n region: REGION,\n credentials: {\n accessKeyId: USERNAME,\n secretAccessKey: PASSWORD,\n },\n });\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._send(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 _send = async (\n phone: string,\n message: string,\n ): Promise<PublishCommandOutput> => {\n const command = new PublishCommand({\n Message: message,\n PhoneNumber: phone,\n });\n\n return await this.client.send(command);\n };\n}\n"]}
|