meta-cloud-api 0.0.3 → 0.0.4
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 +216 -0
- package/package.json +2 -2
- package/src/api/base.ts +0 -19
- package/src/api/encryption.ts +0 -34
- package/src/api/flow.ts +0 -253
- package/src/api/index.ts +0 -24
- package/src/api/media.ts +0 -52
- package/src/api/messages.ts +0 -160
- package/src/api/phoneNumber.ts +0 -59
- package/src/api/qrCode.ts +0 -64
- package/src/api/registration.ts +0 -38
- package/src/api/template.ts +0 -70
- package/src/api/twoStepVerification.ts +0 -24
- package/src/api/waba.ts +0 -55
- package/src/httpsClient.ts +0 -83
- package/src/index.ts +0 -3
- package/src/request.ts +0 -104
- package/src/types/base.ts +0 -5
- package/src/types/config.ts +0 -68
- package/src/types/encryption.ts +0 -11
- package/src/types/enums.ts +0 -563
- package/src/types/flow.ts +0 -274
- package/src/types/httpsClient.ts +0 -28
- package/src/types/index.ts +0 -16
- package/src/types/logger.ts +0 -7
- package/src/types/media.ts +0 -31
- package/src/types/messages.ts +0 -453
- package/src/types/phoneNumber.ts +0 -111
- package/src/types/qrCode.ts +0 -30
- package/src/types/registration.ts +0 -17
- package/src/types/request.ts +0 -66
- package/src/types/template.ts +0 -134
- package/src/types/twoStepVerification.ts +0 -9
- package/src/types/waba.ts +0 -18
- package/src/types/whatsapp.ts +0 -31
- package/src/utils/.gitkeep +0 -0
- package/src/utils/generateXHub256Sig.ts +0 -5
- package/src/utils/importConfig.ts +0 -55
- package/src/utils/index.ts +0 -2
- package/src/utils/isMetaError.ts +0 -44
- package/src/utils/logger.ts +0 -46
- package/src/utils/objectToQueryString.ts +0 -16
- package/src/whatsapp.ts +0 -96
package/src/api/messages.ts
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import type { WabaConfigType } from '../types/config';
|
|
2
|
-
import { ComponentTypesEnum, HttpMethodsEnum, MessageTypesEnum, WabaConfigEnum } from '../types/enums';
|
|
3
|
-
|
|
4
|
-
import * as m from '../types/messages';
|
|
5
|
-
import type { RequesterClass, RequesterResponseInterface } from '../types/request';
|
|
6
|
-
import BaseAPI from './base';
|
|
7
|
-
|
|
8
|
-
export default class MessagesApi extends BaseAPI implements m.MessagesClass {
|
|
9
|
-
private readonly commonMethod = HttpMethodsEnum.Post;
|
|
10
|
-
private readonly commonEndpoint = 'messages';
|
|
11
|
-
|
|
12
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
13
|
-
super(config, client);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
bodyBuilder<T extends MessageTypesEnum, C extends ComponentTypesEnum>(
|
|
17
|
-
type: T,
|
|
18
|
-
payload:
|
|
19
|
-
| m.AudioMediaObject
|
|
20
|
-
| [m.ContactObject]
|
|
21
|
-
| m.DocumentMediaObject
|
|
22
|
-
| m.ImageMediaObject
|
|
23
|
-
| m.InteractiveObject
|
|
24
|
-
| m.LocationObject
|
|
25
|
-
| m.MessageTemplateObject<C>
|
|
26
|
-
| m.StickerMediaObject
|
|
27
|
-
| m.TextObject
|
|
28
|
-
| m.VideoMediaObject,
|
|
29
|
-
toNumber: string,
|
|
30
|
-
replyMessageId?: string,
|
|
31
|
-
) {
|
|
32
|
-
const body: m.MessageRequestBody<T> = {
|
|
33
|
-
messaging_product: 'whatsapp',
|
|
34
|
-
recipient_type: 'individual',
|
|
35
|
-
to: toNumber,
|
|
36
|
-
type: type,
|
|
37
|
-
[type]: payload,
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
if (replyMessageId) body['context'] = { message_id: replyMessageId };
|
|
41
|
-
|
|
42
|
-
return body;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
private send(body: BodyInit | null): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
46
|
-
return this.client.sendRequest(
|
|
47
|
-
this.commonMethod,
|
|
48
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.commonEndpoint}`,
|
|
49
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
50
|
-
body,
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async audio(
|
|
55
|
-
body: m.AudioMediaObject,
|
|
56
|
-
recipient: number,
|
|
57
|
-
replyMessageId?: string,
|
|
58
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
59
|
-
return this.send(
|
|
60
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Audio, body, recipient.toString(), replyMessageId)),
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async contacts(
|
|
65
|
-
body: [m.ContactObject],
|
|
66
|
-
recipient: number,
|
|
67
|
-
replyMessageId?: string,
|
|
68
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
69
|
-
return this.send(
|
|
70
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Contacts, body, recipient.toString(), replyMessageId)),
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async document(
|
|
75
|
-
body: m.DocumentMediaObject,
|
|
76
|
-
recipient: number,
|
|
77
|
-
replyMessageId?: string,
|
|
78
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
79
|
-
return this.send(
|
|
80
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Document, body, recipient.toString(), replyMessageId)),
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
async image(
|
|
85
|
-
body: m.ImageMediaObject,
|
|
86
|
-
recipient: number,
|
|
87
|
-
replyMessageId?: string,
|
|
88
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
89
|
-
return this.send(
|
|
90
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Image, body, recipient.toString(), replyMessageId)),
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async interactive(
|
|
95
|
-
body: m.InteractiveObject,
|
|
96
|
-
recipient: number,
|
|
97
|
-
replyMessageId?: string,
|
|
98
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
99
|
-
return this.send(
|
|
100
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Interactive, body, recipient.toString(), replyMessageId)),
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async location(
|
|
105
|
-
body: m.LocationObject,
|
|
106
|
-
recipient: number,
|
|
107
|
-
replyMessageId?: string,
|
|
108
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
109
|
-
return this.send(
|
|
110
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Location, body, recipient.toString(), replyMessageId)),
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
async sticker(
|
|
115
|
-
body: m.StickerMediaObject,
|
|
116
|
-
recipient: number,
|
|
117
|
-
replyMessageId?: string,
|
|
118
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
119
|
-
return this.send(
|
|
120
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Sticker, body, recipient.toString(), replyMessageId)),
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async template(
|
|
125
|
-
body: m.MessageTemplateObject<ComponentTypesEnum>,
|
|
126
|
-
recipient: number,
|
|
127
|
-
replyMessageId?: string,
|
|
128
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
129
|
-
return this.send(
|
|
130
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Template, body, recipient.toString(), replyMessageId)),
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
async text(
|
|
135
|
-
body: m.TextObject,
|
|
136
|
-
recipient: number,
|
|
137
|
-
replyMessageId?: string,
|
|
138
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
139
|
-
return this.send(
|
|
140
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Text, body, recipient.toString(), replyMessageId)),
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async video(
|
|
145
|
-
body: m.VideoMediaObject,
|
|
146
|
-
recipient: number,
|
|
147
|
-
replyMessageId?: string,
|
|
148
|
-
): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
149
|
-
return this.send(
|
|
150
|
-
JSON.stringify(this.bodyBuilder(MessageTypesEnum.Video, body, recipient.toString(), replyMessageId)),
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async status(body: m.StatusObject): Promise<RequesterResponseInterface<m.MessagesResponse>> {
|
|
155
|
-
const mp: m.GeneralMessageBody = { messaging_product: 'whatsapp' };
|
|
156
|
-
const bodyToSend: m.StatusRequestBody = Object.assign(mp, body);
|
|
157
|
-
|
|
158
|
-
return this.send(JSON.stringify(bodyToSend));
|
|
159
|
-
}
|
|
160
|
-
}
|
package/src/api/phoneNumber.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PhoneNumberClass,
|
|
3
|
-
PhoneNumberResponse,
|
|
4
|
-
PhoneNumbersResponse,
|
|
5
|
-
RequestVerificationCodeRequest,
|
|
6
|
-
VerifyCodeRequest,
|
|
7
|
-
} from 'src/types/phoneNumber';
|
|
8
|
-
import { objectToQueryString } from 'src/utils/objectToQueryString';
|
|
9
|
-
import type { WabaConfigType } from '../types/config';
|
|
10
|
-
import { HttpMethodsEnum, WabaConfigEnum } from '../types/enums';
|
|
11
|
-
import type { RequesterClass, RequesterResponseInterface, ResponseSuccess } from '../types/request';
|
|
12
|
-
import BaseAPI from './base';
|
|
13
|
-
|
|
14
|
-
export default class PhoneNumberApi extends BaseAPI implements PhoneNumberClass {
|
|
15
|
-
private readonly endpoint = 'phone_numbers';
|
|
16
|
-
|
|
17
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
18
|
-
super(config, client);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async getPhoneNumberById(fields?: string): Promise<RequesterResponseInterface<PhoneNumberResponse>> {
|
|
22
|
-
const queryParams = fields ? objectToQueryString({ fields }) : '';
|
|
23
|
-
return this.client.sendRequest(
|
|
24
|
-
HttpMethodsEnum.Get,
|
|
25
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}${queryParams}`,
|
|
26
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
27
|
-
null,
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async getPhoneNumbers(): Promise<RequesterResponseInterface<PhoneNumbersResponse>> {
|
|
32
|
-
return this.client.sendRequest(
|
|
33
|
-
HttpMethodsEnum.Get,
|
|
34
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/${this.endpoint}`,
|
|
35
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
36
|
-
null,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async requestVerificationCode(
|
|
41
|
-
requestVerificationCodeRequest: RequestVerificationCodeRequest,
|
|
42
|
-
): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
43
|
-
return this.client.sendRequest(
|
|
44
|
-
HttpMethodsEnum.Post,
|
|
45
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/request_code`,
|
|
46
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
47
|
-
JSON.stringify(requestVerificationCodeRequest),
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async verifyCode(verifyCodeRequest: VerifyCodeRequest): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
52
|
-
return this.client.sendRequest(
|
|
53
|
-
HttpMethodsEnum.Post,
|
|
54
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/verify_code`,
|
|
55
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
56
|
-
JSON.stringify(verifyCodeRequest),
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
}
|
package/src/api/qrCode.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { HttpMethodsEnum, WabaConfigEnum } from '../types/enums';
|
|
2
|
-
import type { WabaConfigType } from '../types/config';
|
|
3
|
-
import type { RequesterClass, RequesterResponseInterface, ResponseSuccess } from '../types/request';
|
|
4
|
-
import BaseAPI from './base';
|
|
5
|
-
import {
|
|
6
|
-
CreateQrCodeRequest,
|
|
7
|
-
QrCodeClass,
|
|
8
|
-
QrCodeResponse,
|
|
9
|
-
QrCodesResponse,
|
|
10
|
-
UpdateQrCodeRequest,
|
|
11
|
-
} from '../types/qrCode';
|
|
12
|
-
|
|
13
|
-
export default class QrCodeAPI extends BaseAPI implements QrCodeClass {
|
|
14
|
-
private readonly endpoint = 'message_qrdls';
|
|
15
|
-
|
|
16
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
17
|
-
super(config, client);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async createQrCode(request: CreateQrCodeRequest): Promise<RequesterResponseInterface<QrCodeResponse>> {
|
|
21
|
-
return this.client.sendRequest(
|
|
22
|
-
HttpMethodsEnum.Post,
|
|
23
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.endpoint}`,
|
|
24
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
25
|
-
JSON.stringify(request),
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async getQrCodes(): Promise<RequesterResponseInterface<QrCodesResponse>> {
|
|
30
|
-
return this.client.sendRequest(
|
|
31
|
-
HttpMethodsEnum.Get,
|
|
32
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.endpoint}`,
|
|
33
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
34
|
-
null,
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async getQrCode(qrCodeId: string): Promise<RequesterResponseInterface<QrCodeResponse>> {
|
|
39
|
-
return this.client.sendRequest(
|
|
40
|
-
HttpMethodsEnum.Get,
|
|
41
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.endpoint}/${qrCodeId}`,
|
|
42
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
43
|
-
null,
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async updateQrCode(request: UpdateQrCodeRequest): Promise<RequesterResponseInterface<QrCodeResponse>> {
|
|
48
|
-
return this.client.sendRequest(
|
|
49
|
-
HttpMethodsEnum.Post,
|
|
50
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.endpoint}`,
|
|
51
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
52
|
-
JSON.stringify(request),
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async deleteQrCode(qrCodeId: string): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
57
|
-
return this.client.sendRequest(
|
|
58
|
-
HttpMethodsEnum.Delete,
|
|
59
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/${this.endpoint}/${qrCodeId}`,
|
|
60
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
61
|
-
null,
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
}
|
package/src/api/registration.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { RegistrationClass } from '../types/registration';
|
|
2
|
-
import type { WabaConfigType } from '../types/config';
|
|
3
|
-
import { HttpMethodsEnum, WabaConfigEnum, DataLocalizationRegionEnum } from '../types/enums';
|
|
4
|
-
import type { RequesterClass, RequesterResponseInterface, ResponseSuccess } from '../types/request';
|
|
5
|
-
import BaseAPI from './base';
|
|
6
|
-
|
|
7
|
-
export default class RegistrationAPI extends BaseAPI implements RegistrationClass {
|
|
8
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
9
|
-
super(config, client);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async register(
|
|
13
|
-
pin: string,
|
|
14
|
-
dataLocalizationRegion?: DataLocalizationRegionEnum,
|
|
15
|
-
): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
16
|
-
const body = {
|
|
17
|
-
messaging_product: 'whatsapp',
|
|
18
|
-
pin,
|
|
19
|
-
...(dataLocalizationRegion && { data_localization_region: dataLocalizationRegion }),
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
return this.client.sendRequest(
|
|
23
|
-
HttpMethodsEnum.Post,
|
|
24
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/register`,
|
|
25
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
26
|
-
JSON.stringify(body),
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async deregister(): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
31
|
-
return this.client.sendRequest(
|
|
32
|
-
HttpMethodsEnum.Post,
|
|
33
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}/deregister`,
|
|
34
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
35
|
-
null,
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
}
|
package/src/api/template.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { objectToQueryString } from 'src/utils/objectToQueryString';
|
|
2
|
-
import type { WabaConfigType } from '../types/config';
|
|
3
|
-
import { HttpMethodsEnum, WabaConfigEnum } from '../types/enums';
|
|
4
|
-
import type { RequesterClass, RequesterResponseInterface, ResponsePagination, ResponseSuccess } from '../types/request';
|
|
5
|
-
import type {
|
|
6
|
-
TemplateClass,
|
|
7
|
-
TemplateDeleteParams,
|
|
8
|
-
TemplateGetParams,
|
|
9
|
-
TemplateRequestBody,
|
|
10
|
-
TemplateResponse,
|
|
11
|
-
} from '../types/template';
|
|
12
|
-
import BaseAPI from './base';
|
|
13
|
-
|
|
14
|
-
export default class TemplateApi extends BaseAPI implements TemplateClass {
|
|
15
|
-
private readonly endpoint = 'message_templates';
|
|
16
|
-
|
|
17
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
18
|
-
super(config, client);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async getTemplate(templateId: string): Promise<RequesterResponseInterface<TemplateResponse>> {
|
|
22
|
-
return this.client.sendRequest(
|
|
23
|
-
HttpMethodsEnum.Get,
|
|
24
|
-
`${templateId}`,
|
|
25
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
26
|
-
null,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async updateTemplate(
|
|
31
|
-
templateId: string,
|
|
32
|
-
template: Partial<TemplateRequestBody>,
|
|
33
|
-
): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
34
|
-
return this.client.sendRequest(
|
|
35
|
-
HttpMethodsEnum.Post,
|
|
36
|
-
`${templateId}`,
|
|
37
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
38
|
-
JSON.stringify(template),
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async getTemplates(
|
|
43
|
-
params: TemplateGetParams,
|
|
44
|
-
): Promise<RequesterResponseInterface<ResponsePagination<TemplateResponse>>> {
|
|
45
|
-
return this.client.sendRequest(
|
|
46
|
-
HttpMethodsEnum.Get,
|
|
47
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/${this.endpoint}${objectToQueryString(params)}`,
|
|
48
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
49
|
-
null,
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async createTemplate(template: TemplateRequestBody): Promise<RequesterResponseInterface<TemplateResponse>> {
|
|
54
|
-
return this.client.sendRequest(
|
|
55
|
-
HttpMethodsEnum.Post,
|
|
56
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/${this.endpoint}`,
|
|
57
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
58
|
-
JSON.stringify(template),
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async deleteTemplate(params: TemplateDeleteParams): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
63
|
-
return this.client.sendRequest(
|
|
64
|
-
HttpMethodsEnum.Delete,
|
|
65
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/${this.endpoint}${objectToQueryString(params)}`,
|
|
66
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
67
|
-
null,
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { TwoStepVerificationClass } from '../types/twoStepVerification';
|
|
2
|
-
import type { WabaConfigType } from '../types/config';
|
|
3
|
-
import { HttpMethodsEnum, WabaConfigEnum } from '../types/enums';
|
|
4
|
-
import type { RequesterClass, RequesterResponseInterface, ResponseSuccess } from '../types/request';
|
|
5
|
-
import BaseAPI from './base';
|
|
6
|
-
|
|
7
|
-
export default class TwoStepVerificationAPI extends BaseAPI implements TwoStepVerificationClass {
|
|
8
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
9
|
-
super(config, client);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async setTwoStepVerificationCode(pin: string): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
13
|
-
const body = {
|
|
14
|
-
pin,
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
return this.client.sendRequest(
|
|
18
|
-
HttpMethodsEnum.Post,
|
|
19
|
-
`${this.config[WabaConfigEnum.PhoneNumberId]}`,
|
|
20
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
21
|
-
JSON.stringify(body),
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
}
|
package/src/api/waba.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { HttpMethodsEnum, WabaConfigEnum } from '../types/enums';
|
|
2
|
-
import type { WabaConfigType } from '../types/config';
|
|
3
|
-
import type { RequesterClass, RequesterResponseInterface, ResponseSuccess } from '../types/request';
|
|
4
|
-
import BaseAPI from './base';
|
|
5
|
-
import { WABAClass, WabaSubscriptions } from '../types/waba';
|
|
6
|
-
|
|
7
|
-
export default class WabaAPI extends BaseAPI implements WABAClass {
|
|
8
|
-
constructor(config: WabaConfigType, client: RequesterClass) {
|
|
9
|
-
super(config, client);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async getAllWabaSubscriptions(): Promise<RequesterResponseInterface<WabaSubscriptions>> {
|
|
13
|
-
return this.client.sendRequest(
|
|
14
|
-
HttpMethodsEnum.Get,
|
|
15
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/subscribed_apps`,
|
|
16
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
17
|
-
null,
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async subscribeToWaba(): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
22
|
-
return this.client.sendRequest(
|
|
23
|
-
HttpMethodsEnum.Post,
|
|
24
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/subscribed_apps`,
|
|
25
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
26
|
-
null,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async unsubscribeFromWaba(): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
31
|
-
return this.client.sendRequest(
|
|
32
|
-
HttpMethodsEnum.Delete,
|
|
33
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/subscribed_apps`,
|
|
34
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
35
|
-
null,
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async overrideWabaWebhook(
|
|
40
|
-
webhookUrl: string,
|
|
41
|
-
verifyToken: string,
|
|
42
|
-
): Promise<RequesterResponseInterface<ResponseSuccess>> {
|
|
43
|
-
const body = {
|
|
44
|
-
url: webhookUrl,
|
|
45
|
-
verify_token: verifyToken,
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
return this.client.sendRequest(
|
|
49
|
-
HttpMethodsEnum.Post,
|
|
50
|
-
`${this.config[WabaConfigEnum.BusinessAcctId]}/webhooks`,
|
|
51
|
-
this.config[WabaConfigEnum.RequestTimeout],
|
|
52
|
-
JSON.stringify(body),
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
}
|
package/src/httpsClient.ts
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { Agent } from 'https';
|
|
2
|
-
|
|
3
|
-
import Logger from './utils/logger';
|
|
4
|
-
import { HttpMethodsEnum } from './types/enums';
|
|
5
|
-
import { HttpsClientClass, HttpsClientResponseClass, ResponseHeaders, ResponseJSONBody } from './types/httpsClient';
|
|
6
|
-
|
|
7
|
-
const LIB_NAME = 'HttpsClient';
|
|
8
|
-
const LOG_LOCAL = false;
|
|
9
|
-
const LOGGER = new Logger(LIB_NAME, process.env.DEBUG === 'true' || LOG_LOCAL);
|
|
10
|
-
|
|
11
|
-
export default class HttpsClient implements HttpsClientClass {
|
|
12
|
-
agent: Agent;
|
|
13
|
-
|
|
14
|
-
constructor() {
|
|
15
|
-
this.agent = new Agent({ keepAlive: true });
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
clearSockets(): boolean {
|
|
19
|
-
this.agent.destroy();
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async sendRequest(
|
|
24
|
-
hostname: string,
|
|
25
|
-
path: string,
|
|
26
|
-
method: HttpMethodsEnum,
|
|
27
|
-
headers: HeadersInit,
|
|
28
|
-
timeout: number,
|
|
29
|
-
body?: BodyInit | null,
|
|
30
|
-
): Promise<HttpsClientResponseClass> {
|
|
31
|
-
const url = `https://${hostname}/${path}`;
|
|
32
|
-
const controller = new AbortController();
|
|
33
|
-
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
34
|
-
|
|
35
|
-
try {
|
|
36
|
-
const response = await fetch(url, {
|
|
37
|
-
method,
|
|
38
|
-
headers,
|
|
39
|
-
body,
|
|
40
|
-
signal: controller.signal,
|
|
41
|
-
});
|
|
42
|
-
LOGGER.log(`${method} : ${url} - ${JSON.stringify(response)}`);
|
|
43
|
-
|
|
44
|
-
clearTimeout(timeoutId);
|
|
45
|
-
return new HttpsClientResponse(response);
|
|
46
|
-
} catch (error) {
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export class HttpsClientResponse implements HttpsClientResponseClass {
|
|
53
|
-
res: Response;
|
|
54
|
-
respStatusCode: number;
|
|
55
|
-
respHeaders: ResponseHeaders;
|
|
56
|
-
|
|
57
|
-
constructor(resp: Response) {
|
|
58
|
-
this.res = resp;
|
|
59
|
-
this.respStatusCode = resp.status;
|
|
60
|
-
this.respHeaders = Object.fromEntries(resp.headers.entries());
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
statusCode(): number {
|
|
64
|
-
return this.respStatusCode;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
headers(): ResponseHeaders {
|
|
68
|
-
return this.respHeaders;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
rawResponse(): Response {
|
|
72
|
-
return this.res;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
async json(): Promise<ResponseJSONBody> {
|
|
76
|
-
try {
|
|
77
|
-
return (await this.res.json()) as ResponseJSONBody;
|
|
78
|
-
} catch (err) {
|
|
79
|
-
// TODO Error Handling
|
|
80
|
-
throw new Error('Failed to parse response body to JSON: ' + (err as Error).message);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
package/src/index.ts
DELETED
package/src/request.ts
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import HttpsClient from './httpsClient';
|
|
2
|
-
import Logger from './utils/logger';
|
|
3
|
-
import type { HttpMethodsEnum } from './types/enums';
|
|
4
|
-
import type { RequesterClass } from './types/request';
|
|
5
|
-
import { MetaError } from './utils/isMetaError';
|
|
6
|
-
import { isMetaError } from './utils/isMetaError';
|
|
7
|
-
|
|
8
|
-
const LIB_NAME = 'REQUESTER';
|
|
9
|
-
const LOG_LOCAL = false;
|
|
10
|
-
const LOGGER = new Logger(LIB_NAME, process.env.DEBUG === 'true' || LOG_LOCAL);
|
|
11
|
-
|
|
12
|
-
export default class Requester implements RequesterClass {
|
|
13
|
-
client: Readonly<HttpsClient>;
|
|
14
|
-
accessToken: Readonly<string>;
|
|
15
|
-
phoneNumberId: Readonly<number>;
|
|
16
|
-
businessAcctId: Readonly<string>;
|
|
17
|
-
apiVersion: Readonly<string>;
|
|
18
|
-
userAgent: Readonly<string>;
|
|
19
|
-
host: Readonly<string>;
|
|
20
|
-
protocol: Readonly<string> = 'https:';
|
|
21
|
-
|
|
22
|
-
constructor(
|
|
23
|
-
host: string,
|
|
24
|
-
apiVersion: string,
|
|
25
|
-
phoneNumberId: number,
|
|
26
|
-
accessToken: string,
|
|
27
|
-
businessAcctId: string,
|
|
28
|
-
userAgent: string,
|
|
29
|
-
) {
|
|
30
|
-
this.client = new HttpsClient();
|
|
31
|
-
this.host = host;
|
|
32
|
-
this.apiVersion = apiVersion;
|
|
33
|
-
this.phoneNumberId = phoneNumberId;
|
|
34
|
-
this.accessToken = accessToken;
|
|
35
|
-
this.businessAcctId = businessAcctId;
|
|
36
|
-
this.userAgent = userAgent;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
buildHeader(contentType: string): HeadersInit {
|
|
40
|
-
const headers: HeadersInit = {
|
|
41
|
-
'Content-Type': contentType,
|
|
42
|
-
Authorization: `Bearer ${this.accessToken}`,
|
|
43
|
-
'User-Agent': this.userAgent,
|
|
44
|
-
};
|
|
45
|
-
return headers;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
buildCAPIPath(endpoint: string): string {
|
|
49
|
-
return `v${this.apiVersion}.0/${endpoint}`;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
async sendRequest(method: HttpMethodsEnum, endpoint: string, timeout: number, body?: any) {
|
|
53
|
-
const contentType = 'application/json';
|
|
54
|
-
const path = `${this.protocol.toLowerCase()}//${this.host}/${this.buildCAPIPath(endpoint)}`;
|
|
55
|
-
|
|
56
|
-
LOGGER.log(`${method} : ${path}`);
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
const response = await this.client.sendRequest(
|
|
60
|
-
this.host,
|
|
61
|
-
this.buildCAPIPath(endpoint),
|
|
62
|
-
method,
|
|
63
|
-
this.buildHeader(contentType),
|
|
64
|
-
timeout,
|
|
65
|
-
method === 'POST' || method === 'PUT' ? body : undefined,
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
if (!response.rawResponse().ok) {
|
|
69
|
-
const errorData = await response.json();
|
|
70
|
-
if (isMetaError(errorData)) {
|
|
71
|
-
throw errorData;
|
|
72
|
-
}
|
|
73
|
-
// If the error doesn't match Meta's format, create a generic MetaError
|
|
74
|
-
throw {
|
|
75
|
-
name: 'MetaError',
|
|
76
|
-
message: 'Unknown error occurred',
|
|
77
|
-
error: {
|
|
78
|
-
message: errorData.message || 'Unknown error occurred',
|
|
79
|
-
type: 'UnknownError',
|
|
80
|
-
code: response.statusCode(),
|
|
81
|
-
fbtrace_id: '',
|
|
82
|
-
},
|
|
83
|
-
} as MetaError;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return response;
|
|
87
|
-
} catch (error) {
|
|
88
|
-
if (isMetaError(error)) {
|
|
89
|
-
throw error;
|
|
90
|
-
}
|
|
91
|
-
// Handle network errors or other unexpected errors
|
|
92
|
-
throw {
|
|
93
|
-
name: 'MetaError',
|
|
94
|
-
message: error instanceof Error ? error.message : 'Network error occurred',
|
|
95
|
-
error: {
|
|
96
|
-
message: error instanceof Error ? error.message : 'Network error occurred',
|
|
97
|
-
type: 'NetworkError',
|
|
98
|
-
code: 500,
|
|
99
|
-
fbtrace_id: '',
|
|
100
|
-
},
|
|
101
|
-
} as MetaError;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|