keplars 1.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 +227 -0
- package/dist/cjs/audiences.js +32 -0
- package/dist/cjs/audiences.js.map +1 -0
- package/dist/cjs/automations.js +32 -0
- package/dist/cjs/automations.js.map +1 -0
- package/dist/cjs/client.js +135 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/contacts.js +38 -0
- package/dist/cjs/contacts.js.map +1 -0
- package/dist/cjs/domains.js +34 -0
- package/dist/cjs/domains.js.map +1 -0
- package/dist/cjs/emails.js +101 -0
- package/dist/cjs/emails.js.map +1 -0
- package/dist/cjs/errors.js +87 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.js +87 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/audiences.js +28 -0
- package/dist/esm/audiences.js.map +1 -0
- package/dist/esm/automations.js +28 -0
- package/dist/esm/automations.js.map +1 -0
- package/dist/esm/client.js +131 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/contacts.js +34 -0
- package/dist/esm/contacts.js.map +1 -0
- package/dist/esm/domains.js +30 -0
- package/dist/esm/domains.js.map +1 -0
- package/dist/esm/emails.js +97 -0
- package/dist/esm/emails.js.map +1 -0
- package/dist/esm/errors.js +72 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.js +76 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/types/audiences.d.ts +11 -0
- package/dist/types/audiences.d.ts.map +1 -0
- package/dist/types/automations.d.ts +11 -0
- package/dist/types/automations.d.ts.map +1 -0
- package/dist/types/client.d.ts +24 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/contacts.d.ts +12 -0
- package/dist/types/contacts.d.ts.map +1 -0
- package/dist/types/domains.d.ts +22 -0
- package/dist/types/domains.d.ts.map +1 -0
- package/dist/types/emails.d.ts +16 -0
- package/dist/types/emails.d.ts.map +1 -0
- package/dist/types/errors.d.ts +48 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/types.d.ts +162 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/utils.d.ts +10 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NetworkError = exports.InternalError = exports.ConflictError = exports.QuotaExceededError = exports.PlanLimitError = exports.NotFoundError = exports.RateLimitError = exports.DomainNotVerifiedError = exports.AuthorizationError = exports.AuthenticationError = exports.ValidationError = exports.KeplarsError = void 0;
|
|
4
|
+
class KeplarsError extends Error {
|
|
5
|
+
constructor(message, code, requestId, statusCode) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = this.constructor.name;
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.requestId = requestId;
|
|
10
|
+
this.statusCode = statusCode;
|
|
11
|
+
Error.captureStackTrace(this, this.constructor);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.KeplarsError = KeplarsError;
|
|
15
|
+
class ValidationError extends KeplarsError {
|
|
16
|
+
constructor(message, details, requestId) {
|
|
17
|
+
super(message, 'VALIDATION_ERROR', requestId, 400);
|
|
18
|
+
this.details = details;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.ValidationError = ValidationError;
|
|
22
|
+
class AuthenticationError extends KeplarsError {
|
|
23
|
+
constructor(message, requestId) {
|
|
24
|
+
super(message, 'AUTHENTICATION_ERROR', requestId, 401);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.AuthenticationError = AuthenticationError;
|
|
28
|
+
class AuthorizationError extends KeplarsError {
|
|
29
|
+
constructor(message, requestId) {
|
|
30
|
+
super(message, 'AUTHORIZATION_ERROR', requestId, 403);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.AuthorizationError = AuthorizationError;
|
|
34
|
+
class DomainNotVerifiedError extends KeplarsError {
|
|
35
|
+
constructor(message, details, requestId) {
|
|
36
|
+
super(message, 'DOMAIN_NOT_VERIFIED', requestId, 403);
|
|
37
|
+
this.details = details;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.DomainNotVerifiedError = DomainNotVerifiedError;
|
|
41
|
+
class RateLimitError extends KeplarsError {
|
|
42
|
+
constructor(message, retryAfter, requestId) {
|
|
43
|
+
super(message, 'RATE_LIMIT_EXCEEDED', requestId, 429);
|
|
44
|
+
this.retryAfter = retryAfter;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.RateLimitError = RateLimitError;
|
|
48
|
+
class NotFoundError extends KeplarsError {
|
|
49
|
+
constructor(message, requestId) {
|
|
50
|
+
super(message, 'NOT_FOUND', requestId, 404);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.NotFoundError = NotFoundError;
|
|
54
|
+
class PlanLimitError extends KeplarsError {
|
|
55
|
+
constructor(message, details, requestId) {
|
|
56
|
+
super(message, 'PLAN_LIMIT_EXCEEDED', requestId, 403);
|
|
57
|
+
this.details = details;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.PlanLimitError = PlanLimitError;
|
|
61
|
+
class QuotaExceededError extends KeplarsError {
|
|
62
|
+
constructor(message, details, requestId) {
|
|
63
|
+
super(message, 'QUOTA_EXCEEDED', requestId, 403);
|
|
64
|
+
this.details = details;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.QuotaExceededError = QuotaExceededError;
|
|
68
|
+
class ConflictError extends KeplarsError {
|
|
69
|
+
constructor(message, requestId) {
|
|
70
|
+
super(message, 'CONFLICT', requestId, 409);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.ConflictError = ConflictError;
|
|
74
|
+
class InternalError extends KeplarsError {
|
|
75
|
+
constructor(message, requestId) {
|
|
76
|
+
super(message, 'INTERNAL_ERROR', requestId, 500);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.InternalError = InternalError;
|
|
80
|
+
class NetworkError extends KeplarsError {
|
|
81
|
+
constructor(message, originalError) {
|
|
82
|
+
super(message, 'NETWORK_ERROR');
|
|
83
|
+
this.originalError = originalError;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.NetworkError = NetworkError;
|
|
87
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAa,SAAQ,KAAK;IAKrC,YACE,OAAe,EACf,IAAiC,EACjC,SAAkB,EAClB,UAAmB;QAEnB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAlBD,oCAkBC;AAED,MAAa,eAAgB,SAAQ,YAAY;IAG/C,YAAY,OAAe,EAAE,OAAuB,EAAE,SAAkB;QACtE,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAPD,0CAOC;AAED,MAAa,mBAAoB,SAAQ,YAAY;IACnD,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF;AAJD,kDAIC;AAED,MAAa,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;CACF;AAJD,gDAIC;AAED,MAAa,sBAAuB,SAAQ,YAAY;IAItD,YAAY,OAAe,EAAE,OAAiC,EAAE,SAAkB;QAChF,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AARD,wDAQC;AAED,MAAa,cAAe,SAAQ,YAAY;IAG9C,YAAY,OAAe,EAAE,UAAkB,EAAE,SAAkB;QACjE,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAPD,wCAOC;AAED,MAAa,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;CACF;AAJD,sCAIC;AAED,MAAa,cAAe,SAAQ,YAAY;IAG9C,YAAY,OAAe,EAAE,OAAiC,EAAE,SAAkB;QAChF,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAPD,wCAOC;AAED,MAAa,kBAAmB,SAAQ,YAAY;IAGlD,YAAY,OAAe,EAAE,OAAiC,EAAE,SAAkB;QAChF,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAPD,gDAOC;AAED,MAAa,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF;AAJD,sCAIC;AAED,MAAa,aAAc,SAAQ,YAAY;IAC7C,YAAY,OAAe,EAAE,SAAkB;QAC7C,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;CACF;AAJD,sCAIC;AAED,MAAa,YAAa,SAAQ,YAAY;IAG5C,YAAY,OAAe,EAAE,aAAoB;QAC/C,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAPD,oCAOC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderTemplate = exports.verifyWebhookSignature = exports.normalizeEmail = exports.validateScheduleDate = exports.validateEmail = exports.NetworkError = exports.InternalError = exports.ConflictError = exports.QuotaExceededError = exports.PlanLimitError = exports.NotFoundError = exports.RateLimitError = exports.DomainNotVerifiedError = exports.AuthorizationError = exports.AuthenticationError = exports.ValidationError = exports.KeplarsError = exports.Domains = exports.Automations = exports.Audiences = exports.Contacts = exports.Emails = exports.Keplars = void 0;
|
|
4
|
+
var client_1 = require("./client");
|
|
5
|
+
Object.defineProperty(exports, "Keplars", { enumerable: true, get: function () { return client_1.Keplars; } });
|
|
6
|
+
var emails_1 = require("./emails");
|
|
7
|
+
Object.defineProperty(exports, "Emails", { enumerable: true, get: function () { return emails_1.Emails; } });
|
|
8
|
+
var contacts_1 = require("./contacts");
|
|
9
|
+
Object.defineProperty(exports, "Contacts", { enumerable: true, get: function () { return contacts_1.Contacts; } });
|
|
10
|
+
var audiences_1 = require("./audiences");
|
|
11
|
+
Object.defineProperty(exports, "Audiences", { enumerable: true, get: function () { return audiences_1.Audiences; } });
|
|
12
|
+
var automations_1 = require("./automations");
|
|
13
|
+
Object.defineProperty(exports, "Automations", { enumerable: true, get: function () { return automations_1.Automations; } });
|
|
14
|
+
var domains_1 = require("./domains");
|
|
15
|
+
Object.defineProperty(exports, "Domains", { enumerable: true, get: function () { return domains_1.Domains; } });
|
|
16
|
+
var errors_1 = require("./errors");
|
|
17
|
+
Object.defineProperty(exports, "KeplarsError", { enumerable: true, get: function () { return errors_1.KeplarsError; } });
|
|
18
|
+
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
|
|
19
|
+
Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return errors_1.AuthenticationError; } });
|
|
20
|
+
Object.defineProperty(exports, "AuthorizationError", { enumerable: true, get: function () { return errors_1.AuthorizationError; } });
|
|
21
|
+
Object.defineProperty(exports, "DomainNotVerifiedError", { enumerable: true, get: function () { return errors_1.DomainNotVerifiedError; } });
|
|
22
|
+
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
|
|
23
|
+
Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_1.NotFoundError; } });
|
|
24
|
+
Object.defineProperty(exports, "PlanLimitError", { enumerable: true, get: function () { return errors_1.PlanLimitError; } });
|
|
25
|
+
Object.defineProperty(exports, "QuotaExceededError", { enumerable: true, get: function () { return errors_1.QuotaExceededError; } });
|
|
26
|
+
Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return errors_1.ConflictError; } });
|
|
27
|
+
Object.defineProperty(exports, "InternalError", { enumerable: true, get: function () { return errors_1.InternalError; } });
|
|
28
|
+
Object.defineProperty(exports, "NetworkError", { enumerable: true, get: function () { return errors_1.NetworkError; } });
|
|
29
|
+
var utils_1 = require("./utils");
|
|
30
|
+
Object.defineProperty(exports, "validateEmail", { enumerable: true, get: function () { return utils_1.validateEmail; } });
|
|
31
|
+
Object.defineProperty(exports, "validateScheduleDate", { enumerable: true, get: function () { return utils_1.validateScheduleDate; } });
|
|
32
|
+
Object.defineProperty(exports, "normalizeEmail", { enumerable: true, get: function () { return utils_1.normalizeEmail; } });
|
|
33
|
+
Object.defineProperty(exports, "verifyWebhookSignature", { enumerable: true, get: function () { return utils_1.verifyWebhookSignature; } });
|
|
34
|
+
Object.defineProperty(exports, "renderTemplate", { enumerable: true, get: function () { return utils_1.renderTemplate; } });
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AAA1B,iGAAA,OAAO,OAAA;AAChB,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAEhB,mCAakB;AAZhB,sGAAA,YAAY,OAAA;AACZ,yGAAA,eAAe,OAAA;AACf,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,wGAAA,cAAc,OAAA;AACd,uGAAA,aAAa,OAAA;AACb,wGAAA,cAAc,OAAA;AACd,4GAAA,kBAAkB,OAAA;AAClB,uGAAA,aAAa,OAAA;AACb,uGAAA,aAAa,OAAA;AACb,sGAAA,YAAY,OAAA;AAkCd,iCAMiB;AALf,sGAAA,aAAa,OAAA;AACb,6GAAA,oBAAoB,OAAA;AACpB,uGAAA,cAAc,OAAA;AACd,+GAAA,sBAAsB,OAAA;AACtB,uGAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sleep = sleep;
|
|
4
|
+
exports.calculateExponentialBackoff = calculateExponentialBackoff;
|
|
5
|
+
exports.verifyWebhookSignature = verifyWebhookSignature;
|
|
6
|
+
exports.renderTemplate = renderTemplate;
|
|
7
|
+
exports.normalizeEmail = normalizeEmail;
|
|
8
|
+
exports.validateEmail = validateEmail;
|
|
9
|
+
exports.validateEmailList = validateEmailList;
|
|
10
|
+
exports.buildQueryString = buildQueryString;
|
|
11
|
+
exports.validateScheduleDate = validateScheduleDate;
|
|
12
|
+
const crypto_1 = require("crypto");
|
|
13
|
+
async function sleep(ms) {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
15
|
+
}
|
|
16
|
+
function calculateExponentialBackoff(retryCount, baseDelay) {
|
|
17
|
+
const exponentialDelay = baseDelay * Math.pow(2, retryCount);
|
|
18
|
+
const jitter = Math.random() * 0.3 * exponentialDelay;
|
|
19
|
+
return Math.min(exponentialDelay + jitter, 30000);
|
|
20
|
+
}
|
|
21
|
+
function verifyWebhookSignature(payload, signature, timestamp, secret, toleranceSeconds = 300) {
|
|
22
|
+
const currentTimestamp = Math.floor(Date.now() / 1000);
|
|
23
|
+
const payloadTimestamp = parseInt(timestamp, 10);
|
|
24
|
+
if (Math.abs(currentTimestamp - payloadTimestamp) > toleranceSeconds) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const signedPayload = `${timestamp}.${payload}`;
|
|
28
|
+
const expectedSignature = (0, crypto_1.createHmac)('sha256', secret).update(signedPayload).digest('hex');
|
|
29
|
+
try {
|
|
30
|
+
return (0, crypto_1.timingSafeEqual)(Buffer.from(signature), Buffer.from(expectedSignature));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function renderTemplate(template, variables) {
|
|
37
|
+
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
38
|
+
const value = variables[key];
|
|
39
|
+
return value !== undefined ? String(value) : match;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function normalizeEmail(email) {
|
|
43
|
+
return email.trim().toLowerCase();
|
|
44
|
+
}
|
|
45
|
+
function validateEmail(email) {
|
|
46
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
47
|
+
return emailRegex.test(email);
|
|
48
|
+
}
|
|
49
|
+
function validateEmailList(emails) {
|
|
50
|
+
const emailList = Array.isArray(emails) ? emails : [emails];
|
|
51
|
+
emailList.forEach((email) => {
|
|
52
|
+
if (!validateEmail(email)) {
|
|
53
|
+
throw new Error(`Invalid email address: ${email}`);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
return emailList;
|
|
57
|
+
}
|
|
58
|
+
function buildQueryString(params) {
|
|
59
|
+
const filteredParams = Object.entries(params)
|
|
60
|
+
.filter(([_, value]) => value !== undefined && value !== null)
|
|
61
|
+
.map(([key, value]) => {
|
|
62
|
+
if (Array.isArray(value)) {
|
|
63
|
+
return value
|
|
64
|
+
.map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)
|
|
65
|
+
.join('&');
|
|
66
|
+
}
|
|
67
|
+
return `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;
|
|
68
|
+
})
|
|
69
|
+
.join('&');
|
|
70
|
+
return filteredParams ? `?${filteredParams}` : '';
|
|
71
|
+
}
|
|
72
|
+
function validateScheduleDate(dateString) {
|
|
73
|
+
const scheduledDate = new Date(dateString);
|
|
74
|
+
if (isNaN(scheduledDate.getTime())) {
|
|
75
|
+
throw new Error('Invalid scheduled_for date format. Use ISO 8601 format (e.g., 2025-02-14T09:00:00Z)');
|
|
76
|
+
}
|
|
77
|
+
const now = new Date();
|
|
78
|
+
const minScheduleTime = new Date(now.getTime() + 60000); // 1 minute from now
|
|
79
|
+
const maxScheduleTime = new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000); // 365 days from now
|
|
80
|
+
if (scheduledDate < minScheduleTime) {
|
|
81
|
+
throw new Error('scheduled_for must be at least 1 minute in the future');
|
|
82
|
+
}
|
|
83
|
+
if (scheduledDate > maxScheduleTime) {
|
|
84
|
+
throw new Error('scheduled_for cannot be more than 365 days in the future');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;AAEA,sBAEC;AAED,kEAIC;AAED,wDAsBC;AAED,wCAKC;AAED,wCAEC;AAED,sCAGC;AAED,8CAUC;AAED,4CAcC;AAED,oDAoBC;AApGD,mCAAqD;AAE9C,KAAK,UAAU,KAAK,CAAC,EAAU;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,2BAA2B,CAAC,UAAkB,EAAE,SAAiB;IAC/E,MAAM,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,gBAAgB,CAAC;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,sBAAsB,CACpC,OAAe,EACf,SAAiB,EACjB,SAAiB,EACjB,MAAc,EACd,mBAA2B,GAAG;IAE9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAEjD,IAAI,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;IAChD,MAAM,iBAAiB,GAAG,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAE3F,IAAI,CAAC;QACH,OAAO,IAAA,wBAAe,EAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB,EAAE,SAAkC;IACjF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE;QACvE,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,4BAA4B,CAAC;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAyB;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE5D,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAA+B;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;SAC7D,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK;iBACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzE,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,SAAgB,oBAAoB,CAAC,UAAkB;IACrD,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3C,IAAI,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB;IAC7E,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,oBAAoB;IAEjG,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class Audiences {
|
|
2
|
+
constructor(client) {
|
|
3
|
+
this.client = client;
|
|
4
|
+
}
|
|
5
|
+
async create(name, description) {
|
|
6
|
+
const { data } = await this.client.request('POST', '/api/v1/public/audiences/add-audience', { name, description });
|
|
7
|
+
return data;
|
|
8
|
+
}
|
|
9
|
+
async list(page, limit) {
|
|
10
|
+
const params = new URLSearchParams();
|
|
11
|
+
if (page)
|
|
12
|
+
params.append('page', page.toString());
|
|
13
|
+
if (limit)
|
|
14
|
+
params.append('limit', limit.toString());
|
|
15
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
16
|
+
const { data } = await this.client.request('GET', `/api/v1/public/audiences/get-audiences${query}`);
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
async get(id) {
|
|
20
|
+
const { data } = await this.client.request('GET', `/api/v1/public/audiences/get-audience?id=${encodeURIComponent(id)}`);
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
async delete(id) {
|
|
24
|
+
const { data } = await this.client.request('DELETE', `/api/v1/public/audiences/delete-audience?id=${encodeURIComponent(id)}`);
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=audiences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audiences.js","sourceRoot":"","sources":["../../src/audiences.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,SAAS;IACpB,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,WAAoB;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,uCAAuC,EACvC,EAAE,IAAI,EAAE,WAAW,EAAE,CACtB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAa,EAAE,KAAc;QACtC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,yCAAyC,KAAK,EAAE,CACjD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,4CAA4C,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACrE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,QAAQ,EACR,+CAA+C,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACxE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class Automations {
|
|
2
|
+
constructor(client) {
|
|
3
|
+
this.client = client;
|
|
4
|
+
}
|
|
5
|
+
async list(page, limit) {
|
|
6
|
+
const params = new URLSearchParams();
|
|
7
|
+
if (page)
|
|
8
|
+
params.append('page', page.toString());
|
|
9
|
+
if (limit)
|
|
10
|
+
params.append('limit', limit.toString());
|
|
11
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
12
|
+
const { data } = await this.client.request('GET', `/api/v1/public/automations/get-all${query}`);
|
|
13
|
+
return data;
|
|
14
|
+
}
|
|
15
|
+
async get(id) {
|
|
16
|
+
const { data } = await this.client.request('GET', `/api/v1/public/automations/get-automation/${encodeURIComponent(id)}`);
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
async enroll(id, email) {
|
|
20
|
+
const { data } = await this.client.request('POST', `/api/v1/public/automations/add-automation/${encodeURIComponent(id)}/enroll`, { email });
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
async unenroll(id, email) {
|
|
24
|
+
const { data } = await this.client.request('DELETE', `/api/v1/public/automations/delete-automation/${encodeURIComponent(id)}/subscribers`, { email });
|
|
25
|
+
return data;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=automations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automations.js","sourceRoot":"","sources":["../../src/automations.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,WAAW;IACtB,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,KAAK,CAAC,IAAI,CAAC,IAAa,EAAE,KAAc;QACtC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,qCAAqC,KAAK,EAAE,CAC7C,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,6CAA6C,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACtE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,KAAa;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,6CAA6C,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAC5E,EAAE,KAAK,EAAE,CACV,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,KAAa;QACtC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,QAAQ,EACR,gDAAgD,kBAAkB,CAAC,EAAE,CAAC,cAAc,EACpF,EAAE,KAAK,EAAE,CACV,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { KeplarsError, ValidationError, AuthenticationError, AuthorizationError, RateLimitError, NotFoundError, ConflictError, InternalError, NetworkError, } from './errors';
|
|
2
|
+
import { Emails } from './emails';
|
|
3
|
+
import { Contacts } from './contacts';
|
|
4
|
+
import { Audiences } from './audiences';
|
|
5
|
+
import { Automations } from './automations';
|
|
6
|
+
import { Domains } from './domains';
|
|
7
|
+
import { calculateExponentialBackoff, sleep } from './utils';
|
|
8
|
+
const DEFAULT_BASE_URL = 'https://api.keplars.com';
|
|
9
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
10
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
11
|
+
const DEFAULT_RETRY_DELAY = 1000;
|
|
12
|
+
export class Keplars {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
if (!config.apiKey) {
|
|
15
|
+
throw new Error('API key is required');
|
|
16
|
+
}
|
|
17
|
+
this.validateApiKey(config.apiKey);
|
|
18
|
+
const baseUrl = config.baseUrl ||
|
|
19
|
+
(typeof process !== 'undefined' ? process.env.KEPLARS_BASE_URL : undefined) ||
|
|
20
|
+
DEFAULT_BASE_URL;
|
|
21
|
+
this.config = {
|
|
22
|
+
apiKey: config.apiKey,
|
|
23
|
+
baseUrl: baseUrl.replace(/\/$/, ''),
|
|
24
|
+
timeout: config.timeout || DEFAULT_TIMEOUT,
|
|
25
|
+
maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,
|
|
26
|
+
retryDelay: config.retryDelay || DEFAULT_RETRY_DELAY,
|
|
27
|
+
};
|
|
28
|
+
this.emails = new Emails(this);
|
|
29
|
+
this.contacts = new Contacts(this);
|
|
30
|
+
this.audiences = new Audiences(this);
|
|
31
|
+
this.automations = new Automations(this);
|
|
32
|
+
this.domains = new Domains(this);
|
|
33
|
+
}
|
|
34
|
+
validateApiKey(apiKey) {
|
|
35
|
+
const apiKeyRegex = /^kms_[a-f0-9]+\.(live|adm)_[a-f0-9]+$/;
|
|
36
|
+
if (!apiKeyRegex.test(apiKey)) {
|
|
37
|
+
throw new Error('Invalid API key format. Expected: kms_<id>.live_<secret> or kms_<id>.adm_<secret>');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async request(method, path, body, retryCount = 0) {
|
|
41
|
+
const url = `${this.config.baseUrl}${path}`;
|
|
42
|
+
const controller = new AbortController();
|
|
43
|
+
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(url, {
|
|
46
|
+
method,
|
|
47
|
+
headers: {
|
|
48
|
+
Authorization: `Bearer ${this.config.apiKey}`,
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'User-Agent': '@keplars/email-sdk/1.0.0',
|
|
51
|
+
},
|
|
52
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
53
|
+
signal: controller.signal,
|
|
54
|
+
});
|
|
55
|
+
clearTimeout(timeoutId);
|
|
56
|
+
const rateLimitInfo = this.extractRateLimitInfo(response);
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
await this.handleErrorResponse(response, retryCount);
|
|
59
|
+
}
|
|
60
|
+
const data = (await response.json());
|
|
61
|
+
return { data, rateLimitInfo };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
clearTimeout(timeoutId);
|
|
65
|
+
if (error instanceof KeplarsError) {
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
if (this.isRetryableError(error) && retryCount < this.config.maxRetries) {
|
|
69
|
+
const delay = calculateExponentialBackoff(retryCount, this.config.retryDelay);
|
|
70
|
+
await sleep(delay);
|
|
71
|
+
return this.request(method, path, body, retryCount + 1);
|
|
72
|
+
}
|
|
73
|
+
throw new NetworkError(`Network request failed: ${error instanceof Error ? error.message : 'Unknown error'}`, error instanceof Error ? error : new Error(String(error)));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
extractRateLimitInfo(response) {
|
|
77
|
+
const limit = response.headers.get('X-RateLimit-Limit');
|
|
78
|
+
const remaining = response.headers.get('X-RateLimit-Remaining');
|
|
79
|
+
const reset = response.headers.get('X-RateLimit-Reset');
|
|
80
|
+
if (limit && remaining && reset) {
|
|
81
|
+
return {
|
|
82
|
+
limit: parseInt(limit, 10),
|
|
83
|
+
remaining: parseInt(remaining, 10),
|
|
84
|
+
reset: parseInt(reset, 10),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
async handleErrorResponse(response, retryCount) {
|
|
90
|
+
let errorBody;
|
|
91
|
+
try {
|
|
92
|
+
errorBody = (await response.json());
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
throw new KeplarsError(`HTTP ${response.status}: ${response.statusText}`, 'INTERNAL_ERROR', undefined, response.status);
|
|
96
|
+
}
|
|
97
|
+
const message = errorBody.message || `HTTP ${response.status}`;
|
|
98
|
+
switch (response.status) {
|
|
99
|
+
case 400:
|
|
100
|
+
throw new ValidationError(message, undefined, undefined);
|
|
101
|
+
case 401:
|
|
102
|
+
throw new AuthenticationError(message, undefined);
|
|
103
|
+
case 403:
|
|
104
|
+
throw new AuthorizationError(message, undefined);
|
|
105
|
+
case 404:
|
|
106
|
+
throw new NotFoundError(message, undefined);
|
|
107
|
+
case 409:
|
|
108
|
+
throw new ConflictError(message, undefined);
|
|
109
|
+
case 429:
|
|
110
|
+
throw new RateLimitError(message, 60, undefined);
|
|
111
|
+
case 500:
|
|
112
|
+
case 502:
|
|
113
|
+
case 503:
|
|
114
|
+
if (retryCount < this.config.maxRetries) {
|
|
115
|
+
const delay = calculateExponentialBackoff(retryCount, this.config.retryDelay);
|
|
116
|
+
await sleep(delay);
|
|
117
|
+
}
|
|
118
|
+
throw new InternalError(message, undefined);
|
|
119
|
+
default:
|
|
120
|
+
throw new KeplarsError(message, 'INTERNAL_ERROR', undefined, response.status);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
isRetryableError(error) {
|
|
124
|
+
if (error instanceof Error) {
|
|
125
|
+
const networkErrors = ['ECONNRESET', 'ETIMEDOUT', 'ENOTFOUND', 'AbortError'];
|
|
126
|
+
return networkErrors.some((errCode) => error.message.includes(errCode));
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class Contacts {
|
|
2
|
+
constructor(client) {
|
|
3
|
+
this.client = client;
|
|
4
|
+
}
|
|
5
|
+
async add(params) {
|
|
6
|
+
const { data } = await this.client.request('POST', '/api/v1/public/contacts/add-contact', params);
|
|
7
|
+
return data;
|
|
8
|
+
}
|
|
9
|
+
async get(email) {
|
|
10
|
+
const { data } = await this.client.request('GET', `/api/v1/public/contacts/get-contact?email=${encodeURIComponent(email)}`);
|
|
11
|
+
return data;
|
|
12
|
+
}
|
|
13
|
+
async list(audienceId, page, limit) {
|
|
14
|
+
const params = new URLSearchParams();
|
|
15
|
+
if (audienceId)
|
|
16
|
+
params.append('audience_id', audienceId);
|
|
17
|
+
if (page)
|
|
18
|
+
params.append('page', page.toString());
|
|
19
|
+
if (limit)
|
|
20
|
+
params.append('limit', limit.toString());
|
|
21
|
+
const query = params.toString() ? `?${params.toString()}` : '';
|
|
22
|
+
const { data } = await this.client.request('GET', `/api/v1/public/contacts/get-contacts${query}`);
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
async update(email, params) {
|
|
26
|
+
const { data } = await this.client.request('PATCH', `/api/v1/public/contacts/update-contact?email=${encodeURIComponent(email)}`, params);
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
async delete(email) {
|
|
30
|
+
const { data } = await this.client.request('DELETE', `/api/v1/public/contacts/delete-contact?email=${encodeURIComponent(email)}`);
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=contacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/contacts.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,QAAQ;IACnB,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAC,MAAyB;QACjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,qCAAqC,EACrC,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAa;QACrB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,CACzE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAAmB,EACnB,IAAa,EACb,KAAc;QAEd,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,UAAU;YAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACzD,IAAI,IAAI;YAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE/D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,uCAAuC,KAAK,EAAE,CAC/C,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,MAA4B;QACtD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,OAAO,EACP,gDAAgD,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAC3E,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,QAAQ,EACR,gDAAgD,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAC5E,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class Domains {
|
|
2
|
+
constructor(client) {
|
|
3
|
+
this.client = client;
|
|
4
|
+
}
|
|
5
|
+
async add(domain) {
|
|
6
|
+
const { data } = await this.client.request('POST', '/api/v1/public/domains/add-domain', { domain });
|
|
7
|
+
return data;
|
|
8
|
+
}
|
|
9
|
+
async list() {
|
|
10
|
+
const { data } = await this.client.request('GET', '/api/v1/public/domains/get-domains');
|
|
11
|
+
return data;
|
|
12
|
+
}
|
|
13
|
+
async getStatus(domainId) {
|
|
14
|
+
const { data } = await this.client.request('GET', `/api/v1/public/domains/domain-status/${encodeURIComponent(domainId)}`);
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
async verify(domainId) {
|
|
18
|
+
const { data } = await this.client.request('POST', `/api/v1/public/domains/verify-domain/${encodeURIComponent(domainId)}`);
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
async delete(domainId) {
|
|
22
|
+
const { data } = await this.client.request('DELETE', `/api/v1/public/domains/delete-domain/${encodeURIComponent(domainId)}`);
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
25
|
+
async createApiKey(params) {
|
|
26
|
+
const { data } = await this.client.request('POST', '/api/v1/public/domains/api-keys/create', params);
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/domains.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,OAAO;IAClB,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,mCAAmC,EACnC,EAAE,MAAM,EAAE,CACX,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,oCAAoC,CACrC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,KAAK,EACL,wCAAwC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CACvE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,wCAAwC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CACvE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,QAAQ,EACR,wCAAwC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CACvE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA4C;QAC7D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,MAAM,EACN,wCAAwC,EACxC,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { validateEmail, validateScheduleDate } from './utils';
|
|
2
|
+
export class Emails {
|
|
3
|
+
constructor(client) {
|
|
4
|
+
this.client = client;
|
|
5
|
+
}
|
|
6
|
+
async sendInstant(request) {
|
|
7
|
+
this.validateEmailRequest(request);
|
|
8
|
+
const { data } = await this.client.request('POST', '/api/v1/public/send-email/instant', request);
|
|
9
|
+
return data;
|
|
10
|
+
}
|
|
11
|
+
async sendHigh(request) {
|
|
12
|
+
this.validateEmailRequest(request);
|
|
13
|
+
const { data } = await this.client.request('POST', '/api/v1/public/send-email/high', request);
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
async sendAsync(request) {
|
|
17
|
+
this.validateEmailRequest(request);
|
|
18
|
+
const { data } = await this.client.request('POST', '/api/v1/public/send-email/async', request);
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
async sendBulk(request) {
|
|
22
|
+
this.validateEmailRequest(request);
|
|
23
|
+
const { data } = await this.client.request('POST', '/api/v1/public/send-email/bulk', request);
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
async send(request) {
|
|
27
|
+
return this.sendAsync(request);
|
|
28
|
+
}
|
|
29
|
+
async schedule(request) {
|
|
30
|
+
this.validateEmailRequest(request);
|
|
31
|
+
if (!request.scheduled_for) {
|
|
32
|
+
throw new Error('scheduled_for is required for scheduling emails');
|
|
33
|
+
}
|
|
34
|
+
validateScheduleDate(request.scheduled_for);
|
|
35
|
+
const { data } = await this.client.request('POST', '/api/v1/public/send-email/schedule', request);
|
|
36
|
+
return data;
|
|
37
|
+
}
|
|
38
|
+
validateEmailRequest(request) {
|
|
39
|
+
if (!request.to) {
|
|
40
|
+
throw new Error('To recipient is required');
|
|
41
|
+
}
|
|
42
|
+
if (!request.from) {
|
|
43
|
+
throw new Error('From email is required');
|
|
44
|
+
}
|
|
45
|
+
if (!request.subject) {
|
|
46
|
+
throw new Error('Subject is required');
|
|
47
|
+
}
|
|
48
|
+
this.validateRecipientField(request.to, 'to');
|
|
49
|
+
if (request.cc) {
|
|
50
|
+
this.validateRecipientList(request.cc, 'cc');
|
|
51
|
+
}
|
|
52
|
+
if (request.bcc) {
|
|
53
|
+
this.validateRecipientList(request.bcc, 'bcc');
|
|
54
|
+
}
|
|
55
|
+
const hasContent = request.html || request.text;
|
|
56
|
+
const hasTemplate = request.template_id;
|
|
57
|
+
if (!hasContent && !hasTemplate) {
|
|
58
|
+
throw new Error('Either html/text or template_id is required');
|
|
59
|
+
}
|
|
60
|
+
if (hasContent && hasTemplate) {
|
|
61
|
+
throw new Error('Cannot use both content (html/text) and template_id');
|
|
62
|
+
}
|
|
63
|
+
if (request.subject.length > 998) {
|
|
64
|
+
throw new Error('Subject cannot exceed 998 characters');
|
|
65
|
+
}
|
|
66
|
+
if (request.html && request.html.length > 524288) {
|
|
67
|
+
throw new Error('HTML content cannot exceed 512KB');
|
|
68
|
+
}
|
|
69
|
+
if (request.text && request.text.length > 524288) {
|
|
70
|
+
throw new Error('Text content cannot exceed 512KB');
|
|
71
|
+
}
|
|
72
|
+
if (request.custom_headers && Object.keys(request.custom_headers).length > 50) {
|
|
73
|
+
throw new Error('Maximum 50 custom headers allowed');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
validateRecipientField(to, field) {
|
|
77
|
+
if (typeof to === 'string') {
|
|
78
|
+
if (!validateEmail(to)) {
|
|
79
|
+
throw new Error(`Invalid email address in ${field}: ${to}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (Array.isArray(to)) {
|
|
83
|
+
this.validateRecipientList(to, field);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
validateRecipientList(recipients, field) {
|
|
87
|
+
if (recipients.length === 0) {
|
|
88
|
+
throw new Error(`${field} cannot be empty`);
|
|
89
|
+
}
|
|
90
|
+
for (const recipient of recipients) {
|
|
91
|
+
if (!validateEmail(recipient.email)) {
|
|
92
|
+
throw new Error(`Invalid email address in ${field}: ${recipient.email}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=emails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails.js","sourceRoot":"","sources":["../../src/emails.ts"],"names":[],"mappings":"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"}
|