@klozeo/sdk 0.1.0

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.
Files changed (69) hide show
  1. package/README.md +141 -0
  2. package/dist/cjs/attribute-helpers.js +43 -0
  3. package/dist/cjs/attribute-helpers.js.map +1 -0
  4. package/dist/cjs/client.js +150 -0
  5. package/dist/cjs/client.js.map +1 -0
  6. package/dist/cjs/errors.js +75 -0
  7. package/dist/cjs/errors.js.map +1 -0
  8. package/dist/cjs/filters/index.js +320 -0
  9. package/dist/cjs/filters/index.js.map +1 -0
  10. package/dist/cjs/index.js +42 -0
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/resources/leads.js +156 -0
  14. package/dist/cjs/resources/leads.js.map +1 -0
  15. package/dist/cjs/resources/notes.js +50 -0
  16. package/dist/cjs/resources/notes.js.map +1 -0
  17. package/dist/cjs/resources/scoring.js +63 -0
  18. package/dist/cjs/resources/scoring.js.map +1 -0
  19. package/dist/cjs/resources/webhooks.js +41 -0
  20. package/dist/cjs/resources/webhooks.js.map +1 -0
  21. package/dist/cjs/types.js +13 -0
  22. package/dist/cjs/types.js.map +1 -0
  23. package/dist/cjs/utils.js +179 -0
  24. package/dist/cjs/utils.js.map +1 -0
  25. package/dist/esm/attribute-helpers.js +36 -0
  26. package/dist/esm/attribute-helpers.js.map +1 -0
  27. package/dist/esm/client.js +159 -0
  28. package/dist/esm/client.js.map +1 -0
  29. package/dist/esm/errors.js +72 -0
  30. package/dist/esm/errors.js.map +1 -0
  31. package/dist/esm/filters/index.js +304 -0
  32. package/dist/esm/filters/index.js.map +1 -0
  33. package/dist/esm/index.js +26 -0
  34. package/dist/esm/index.js.map +1 -0
  35. package/dist/esm/resources/leads.js +153 -0
  36. package/dist/esm/resources/leads.js.map +1 -0
  37. package/dist/esm/resources/notes.js +47 -0
  38. package/dist/esm/resources/notes.js.map +1 -0
  39. package/dist/esm/resources/scoring.js +60 -0
  40. package/dist/esm/resources/scoring.js.map +1 -0
  41. package/dist/esm/resources/webhooks.js +38 -0
  42. package/dist/esm/resources/webhooks.js.map +1 -0
  43. package/dist/esm/types.js +10 -0
  44. package/dist/esm/types.js.map +1 -0
  45. package/dist/esm/utils.js +168 -0
  46. package/dist/esm/utils.js.map +1 -0
  47. package/dist/types/attribute-helpers.d.ts +27 -0
  48. package/dist/types/attribute-helpers.d.ts.map +1 -0
  49. package/dist/types/client.d.ts +64 -0
  50. package/dist/types/client.d.ts.map +1 -0
  51. package/dist/types/errors.d.ts +44 -0
  52. package/dist/types/errors.d.ts.map +1 -0
  53. package/dist/types/filters/index.d.ts +173 -0
  54. package/dist/types/filters/index.d.ts.map +1 -0
  55. package/dist/types/index.d.ts +23 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/dist/types/resources/leads.d.ts +67 -0
  58. package/dist/types/resources/leads.d.ts.map +1 -0
  59. package/dist/types/resources/notes.d.ts +31 -0
  60. package/dist/types/resources/notes.d.ts.map +1 -0
  61. package/dist/types/resources/scoring.d.ts +35 -0
  62. package/dist/types/resources/scoring.d.ts.map +1 -0
  63. package/dist/types/resources/webhooks.d.ts +25 -0
  64. package/dist/types/resources/webhooks.d.ts.map +1 -0
  65. package/dist/types/types.d.ts +409 -0
  66. package/dist/types/types.d.ts.map +1 -0
  67. package/dist/types/utils.d.ts +49 -0
  68. package/dist/types/utils.d.ts.map +1 -0
  69. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/resources/scoring.ts"],"names":[],"mappings":";;;AAOA,oCAAkD;AAGlD;;GAEG;AACH,MAAa,eAAe;IAC1B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC7D,8DAA8D;QAC9D,MAAM,CAAC,GAAG,GAAU,CAAC;QACrB,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,8BAAsB,CAAC;SACnD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAA6B;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/E,OAAO,IAAA,8BAAsB,EAAC,GAA8B,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,IAAA,8BAAsB,EAAC,GAA8B,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,KAA6B;QACxD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YACzE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CACjC,MAAM,EACN,UAAU,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAC7C,CAAC;QACF,8DAA8D;QAC9D,MAAM,CAAC,GAAG,GAAU,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;CACF;AA5DD,0CA4DC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhooksResource = void 0;
4
+ const utils_1 = require("../utils");
5
+ /**
6
+ * Resource class for webhook subscription operations.
7
+ */
8
+ class WebhooksResource {
9
+ constructor(http) {
10
+ this.http = http;
11
+ }
12
+ /**
13
+ * List all webhooks for this account.
14
+ */
15
+ async list() {
16
+ const raw = await this.http.request("GET", "/webhooks");
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ const r = raw;
19
+ return {
20
+ webhooks: (r.webhooks ?? []).map(utils_1.deserializeWebhook),
21
+ };
22
+ }
23
+ /**
24
+ * Create a new webhook subscription.
25
+ * The `secret` field (if provided) is used only for payload signing and
26
+ * is never returned by the API.
27
+ */
28
+ async create(input) {
29
+ const raw = await this.http.request("POST", "/webhooks", { body: input });
30
+ return (0, utils_1.deserializeWebhook)(raw);
31
+ }
32
+ /**
33
+ * Delete a webhook subscription permanently.
34
+ * @param id - UUID of the webhook to delete
35
+ */
36
+ async delete(id) {
37
+ await this.http.request("DELETE", `/webhooks/${encodeURIComponent(id)}`);
38
+ }
39
+ }
40
+ exports.WebhooksResource = WebhooksResource;
41
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/resources/webhooks.ts"],"names":[],"mappings":";;;AAKA,oCAA8C;AAG9C;;GAEG;AACH,MAAa,gBAAgB;IAC3B,YAA6B,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAEjD;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACxD,8DAA8D;QAC9D,MAAM,CAAC,GAAG,GAAU,CAAC;QACrB,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,0BAAkB,CAAC;SACrD,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,KAAyB;QACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,OAAO,IAAA,0BAAkB,EAAC,GAA8B,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF;AAhCD,4CAgCC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExportFormat = void 0;
4
+ /**
5
+ * Export format options.
6
+ */
7
+ var ExportFormat;
8
+ (function (ExportFormat) {
9
+ ExportFormat["CSV"] = "csv";
10
+ ExportFormat["JSON"] = "json";
11
+ ExportFormat["XLSX"] = "xlsx";
12
+ })(ExportFormat || (exports.ExportFormat = ExportFormat = {}));
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AAiEA;;GAEG;AACH,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,6BAAa,CAAA;IACb,6BAAa,CAAA;AACf,CAAC,EAJW,YAAY,4BAAZ,YAAY,QAIvB"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildQueryParams = buildQueryParams;
4
+ exports.parseError = parseError;
5
+ exports.sleep = sleep;
6
+ exports.backoffDelay = backoffDelay;
7
+ exports.deserializeLead = deserializeLead;
8
+ exports.serializeLeadInput = serializeLeadInput;
9
+ exports.deserializeNote = deserializeNote;
10
+ exports.deserializeScoringRule = deserializeScoringRule;
11
+ exports.deserializeWebhook = deserializeWebhook;
12
+ const errors_1 = require("./errors");
13
+ /**
14
+ * Append filter, sort, and pagination params to a URLSearchParams instance.
15
+ */
16
+ function buildQueryParams(params, opts) {
17
+ if (opts.filters) {
18
+ for (const f of opts.filters) {
19
+ params.append("filter", f.toString());
20
+ }
21
+ }
22
+ if (opts.sortBy !== undefined) {
23
+ params.set("sort_by", opts.sortBy);
24
+ }
25
+ if (opts.sortOrder !== undefined) {
26
+ params.set("sort_order", opts.sortOrder.toUpperCase());
27
+ }
28
+ if (opts.limit !== undefined) {
29
+ params.set("limit", String(opts.limit));
30
+ }
31
+ if (opts.cursor !== undefined) {
32
+ params.set("cursor", opts.cursor);
33
+ }
34
+ if (opts.format !== undefined) {
35
+ params.set("format", opts.format);
36
+ }
37
+ }
38
+ /**
39
+ * Parse an API error response body and produce a typed KlozeoError.
40
+ */
41
+ async function parseError(response) {
42
+ const retryAfterHeader = response.headers.get("Retry-After");
43
+ const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : 60;
44
+ let body = {};
45
+ try {
46
+ body = await response.json();
47
+ }
48
+ catch {
49
+ // non-JSON body — use status text
50
+ }
51
+ const message = body.message ?? body.error ?? response.statusText ?? "Unknown error";
52
+ const code = body.code ?? body.error ?? "unknown";
53
+ switch (response.status) {
54
+ case 400:
55
+ return new errors_1.BadRequestError(message, code);
56
+ case 401:
57
+ return new errors_1.UnauthorizedError(message, code);
58
+ case 403:
59
+ return new errors_1.ForbiddenError(message, code);
60
+ case 404:
61
+ return new errors_1.NotFoundError(message, code);
62
+ case 429:
63
+ return new errors_1.RateLimitedError(message, retryAfter, code);
64
+ default:
65
+ return new errors_1.KlozeoError(message, response.status, code);
66
+ }
67
+ }
68
+ /**
69
+ * Sleep for the given number of milliseconds.
70
+ */
71
+ function sleep(ms) {
72
+ return new Promise((resolve) => setTimeout(resolve, ms));
73
+ }
74
+ /**
75
+ * Compute exponential back-off delay with jitter.
76
+ * @param attempt - Zero-based attempt index.
77
+ * @param baseMs - Base delay in milliseconds (default 500).
78
+ */
79
+ function backoffDelay(attempt, baseMs = 500) {
80
+ const exp = Math.min(attempt, 8); // cap exponent
81
+ const delay = baseMs * Math.pow(2, exp);
82
+ // add ±20% jitter
83
+ const jitter = delay * 0.2 * (Math.random() * 2 - 1);
84
+ return Math.round(delay + jitter);
85
+ }
86
+ /**
87
+ * Convert a snake_case API lead object to a camelCase Lead.
88
+ */
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ function deserializeLead(raw) {
91
+ return {
92
+ id: raw.id,
93
+ name: raw.name,
94
+ source: raw.source,
95
+ score: raw.score ?? 0,
96
+ createdAt: raw.created_at,
97
+ updatedAt: raw.updated_at,
98
+ lastInteractionAt: raw.last_interaction_at,
99
+ description: raw.description,
100
+ address: raw.address,
101
+ city: raw.city,
102
+ state: raw.state,
103
+ country: raw.country,
104
+ postalCode: raw.postal_code,
105
+ latitude: raw.latitude,
106
+ longitude: raw.longitude,
107
+ phone: raw.phone,
108
+ email: raw.email,
109
+ website: raw.website,
110
+ rating: raw.rating,
111
+ reviewCount: raw.review_count,
112
+ category: raw.category,
113
+ tags: raw.tags,
114
+ sourceId: raw.source_id,
115
+ logoUrl: raw.logo_url,
116
+ attributes: raw.attributes,
117
+ };
118
+ }
119
+ /**
120
+ * Convert a camelCase CreateLeadInput / UpdateLeadInput to the snake_case
121
+ * body expected by the API.
122
+ */
123
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ function serializeLeadInput(input) {
125
+ const out = {};
126
+ const map = {
127
+ postalCode: "postal_code",
128
+ reviewCount: "review_count",
129
+ sourceId: "source_id",
130
+ logoUrl: "logo_url",
131
+ };
132
+ for (const [k, v] of Object.entries(input)) {
133
+ if (v === undefined)
134
+ continue;
135
+ out[map[k] ?? k] = v;
136
+ }
137
+ return out;
138
+ }
139
+ /**
140
+ * Deserialize a raw note object from the API.
141
+ */
142
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
+ function deserializeNote(raw) {
144
+ return {
145
+ id: raw.id,
146
+ leadId: raw.lead_id,
147
+ content: raw.content,
148
+ createdAt: raw.created_at,
149
+ updatedAt: raw.updated_at,
150
+ };
151
+ }
152
+ /**
153
+ * Deserialize a raw scoring rule from the API.
154
+ */
155
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
+ function deserializeScoringRule(raw) {
157
+ return {
158
+ id: raw.id,
159
+ name: raw.name,
160
+ expression: raw.expression,
161
+ priority: raw.priority ?? 0,
162
+ createdAt: raw.created_at,
163
+ updatedAt: raw.updated_at,
164
+ };
165
+ }
166
+ /**
167
+ * Deserialize a raw webhook from the API.
168
+ */
169
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
170
+ function deserializeWebhook(raw) {
171
+ return {
172
+ id: raw.id,
173
+ url: raw.url,
174
+ events: raw.events ?? [],
175
+ active: raw.active ?? true,
176
+ createdAt: raw.created_at,
177
+ };
178
+ }
179
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Create a text attribute.
3
+ * @example textAttr("industry", "Software")
4
+ */
5
+ export function textAttr(name, value) {
6
+ return { name, type: "text", value };
7
+ }
8
+ /**
9
+ * Create a numeric attribute.
10
+ * @example numberAttr("employees", 500)
11
+ */
12
+ export function numberAttr(name, value) {
13
+ return { name, type: "number", value };
14
+ }
15
+ /**
16
+ * Create a boolean attribute.
17
+ * @example boolAttr("verified", true)
18
+ */
19
+ export function boolAttr(name, value) {
20
+ return { name, type: "bool", value };
21
+ }
22
+ /**
23
+ * Create a list attribute.
24
+ * @example listAttr("products", ["CRM", "ERP"])
25
+ */
26
+ export function listAttr(name, value) {
27
+ return { name, type: "list", value };
28
+ }
29
+ /**
30
+ * Create an object attribute.
31
+ * @example objectAttr("social", { linkedin: "https://linkedin.com/company/acme" })
32
+ */
33
+ export function objectAttr(name, value) {
34
+ return { name, type: "object", value };
35
+ }
36
+ //# sourceMappingURL=attribute-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-helpers.js","sourceRoot":"","sources":["../../src/attribute-helpers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAa;IAClD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAc;IACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,KAAe;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAA8B;IACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { parseError, sleep, backoffDelay } from "./utils.js";
2
+ import { RateLimitedError } from "./errors.js";
3
+ import { LeadsResource } from "./resources/leads.js";
4
+ import { NotesResource } from "./resources/notes.js";
5
+ import { ScoringResource } from "./resources/scoring.js";
6
+ import { WebhooksResource } from "./resources/webhooks.js";
7
+ const DEFAULT_BASE_URL = "https://app.klozeo.com/api/v1";
8
+ const DEFAULT_TIMEOUT = 30_000;
9
+ const DEFAULT_MAX_RETRIES = 3;
10
+ /**
11
+ * Main Klozeo API client.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { Klozeo } from "@klozeo/sdk";
16
+ *
17
+ * const client = new Klozeo("sk_live_your_api_key");
18
+ * const lead = await client.leads.get("cl_...");
19
+ * ```
20
+ */
21
+ export class Klozeo {
22
+ /** Leads resource — CRUD, batch, pagination, export */
23
+ leads;
24
+ /** Notes resource — create, list, update, delete */
25
+ notes;
26
+ /** Scoring resource — rules management and score recalculation */
27
+ scoring;
28
+ /** Webhooks resource — create, list, delete */
29
+ webhooks;
30
+ apiKey;
31
+ baseUrl;
32
+ timeout;
33
+ maxRetries;
34
+ fetchImpl;
35
+ _rateLimitState = null;
36
+ constructor(apiKey, options) {
37
+ if (!apiKey || typeof apiKey !== "string") {
38
+ throw new TypeError("Klozeo: apiKey must be a non-empty string");
39
+ }
40
+ this.apiKey = apiKey;
41
+ this.baseUrl = (options?.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
42
+ this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;
43
+ this.maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;
44
+ this.fetchImpl = options?.fetch ?? globalThis.fetch.bind(globalThis);
45
+ this.leads = new LeadsResource(this);
46
+ this.notes = new NotesResource(this);
47
+ this.scoring = new ScoringResource(this);
48
+ this.webhooks = new WebhooksResource(this);
49
+ }
50
+ /**
51
+ * Returns the last observed rate-limit state from response headers,
52
+ * or `null` if no request has been made yet.
53
+ */
54
+ rateLimitState() {
55
+ return this._rateLimitState;
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Internal HTTP helpers (implements HttpClient)
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Make a JSON API request with automatic retry on 429 / 5xx.
62
+ * @internal
63
+ */
64
+ async request(method, path, opts = {}) {
65
+ const url = `${this.baseUrl}${path}`;
66
+ const headers = {
67
+ "X-API-Key": this.apiKey,
68
+ "Content-Type": "application/json",
69
+ Accept: "application/json",
70
+ };
71
+ const init = {
72
+ method,
73
+ headers,
74
+ ...(opts.body !== undefined
75
+ ? { body: JSON.stringify(opts.body) }
76
+ : {}),
77
+ };
78
+ return this._executeWithRetry(url, init, false);
79
+ }
80
+ /**
81
+ * Make a request that returns a Blob (used by the export endpoint).
82
+ * @internal
83
+ */
84
+ async requestBlob(method, path) {
85
+ const url = `${this.baseUrl}${path}`;
86
+ const init = {
87
+ method,
88
+ headers: {
89
+ "X-API-Key": this.apiKey,
90
+ },
91
+ };
92
+ return this._executeWithRetry(url, init, true);
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Private helpers
96
+ // ---------------------------------------------------------------------------
97
+ async _executeWithRetry(url, init, blobResponse) {
98
+ let lastError;
99
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
100
+ const response = await this._fetchWithTimeout(url, init);
101
+ // Update rate-limit state from every response
102
+ this._updateRateLimitState(response);
103
+ if (response.ok) {
104
+ if (blobResponse) {
105
+ return response.blob();
106
+ }
107
+ // 204 No Content — return empty object
108
+ if (response.status === 204) {
109
+ return {};
110
+ }
111
+ return response.json();
112
+ }
113
+ // Build a typed error
114
+ const error = await parseError(response);
115
+ // Retry on 429 and 5xx
116
+ const shouldRetry = attempt < this.maxRetries &&
117
+ (response.status === 429 || response.status >= 500);
118
+ if (!shouldRetry) {
119
+ throw error;
120
+ }
121
+ // For 429, respect the Retry-After header
122
+ if (error instanceof RateLimitedError) {
123
+ await sleep(error.retryAfter * 1000);
124
+ }
125
+ else {
126
+ await sleep(backoffDelay(attempt));
127
+ }
128
+ lastError = error;
129
+ }
130
+ // Should not reach here, but satisfy TypeScript
131
+ throw lastError ?? new Error("Request failed after retries");
132
+ }
133
+ async _fetchWithTimeout(url, init) {
134
+ if (typeof AbortController === "undefined") {
135
+ // Environments without AbortController (very old runtimes)
136
+ return this.fetchImpl(url, init);
137
+ }
138
+ const controller = new AbortController();
139
+ const timer = setTimeout(() => controller.abort(), this.timeout);
140
+ try {
141
+ return await this.fetchImpl(url, { ...init, signal: controller.signal });
142
+ }
143
+ finally {
144
+ clearTimeout(timer);
145
+ }
146
+ }
147
+ _updateRateLimitState(response) {
148
+ const limit = response.headers.get("X-RateLimit-Limit");
149
+ const remaining = response.headers.get("X-RateLimit-Remaining");
150
+ if (limit !== null && remaining !== null) {
151
+ const parsedLimit = parseInt(limit, 10);
152
+ const parsedRemaining = parseInt(remaining, 10);
153
+ if (!isNaN(parsedLimit) && !isNaN(parsedRemaining)) {
154
+ this._rateLimitState = { limit: parsedLimit, remaining: parsedRemaining };
155
+ }
156
+ }
157
+ }
158
+ }
159
+ //# 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,72 @@
1
+ /**
2
+ * Base error class for all Klozeo API errors.
3
+ */
4
+ export class KlozeoError extends Error {
5
+ /** HTTP status code */
6
+ statusCode;
7
+ /** API error code (e.g. "not_found", "rate_limit_exceeded") */
8
+ code;
9
+ constructor(message, statusCode, code) {
10
+ super(message);
11
+ this.name = "KlozeoError";
12
+ this.statusCode = statusCode;
13
+ this.code = code;
14
+ // Maintain proper prototype chain for instanceof checks
15
+ Object.setPrototypeOf(this, new.target.prototype);
16
+ }
17
+ }
18
+ /**
19
+ * Thrown when the API returns 404 Not Found.
20
+ */
21
+ export class NotFoundError extends KlozeoError {
22
+ constructor(message, code = "not_found") {
23
+ super(message, 404, code);
24
+ this.name = "NotFoundError";
25
+ Object.setPrototypeOf(this, new.target.prototype);
26
+ }
27
+ }
28
+ /**
29
+ * Thrown when the API returns 401 Unauthorized (missing or invalid API key).
30
+ */
31
+ export class UnauthorizedError extends KlozeoError {
32
+ constructor(message, code = "unauthorized") {
33
+ super(message, 401, code);
34
+ this.name = "UnauthorizedError";
35
+ Object.setPrototypeOf(this, new.target.prototype);
36
+ }
37
+ }
38
+ /**
39
+ * Thrown when the API returns 403 Forbidden (e.g. leads limit reached).
40
+ */
41
+ export class ForbiddenError extends KlozeoError {
42
+ constructor(message, code = "forbidden") {
43
+ super(message, 403, code);
44
+ this.name = "ForbiddenError";
45
+ Object.setPrototypeOf(this, new.target.prototype);
46
+ }
47
+ }
48
+ /**
49
+ * Thrown when the API returns 429 Too Many Requests.
50
+ * Check `retryAfter` (seconds) before retrying.
51
+ */
52
+ export class RateLimitedError extends KlozeoError {
53
+ /** Number of seconds to wait before retrying */
54
+ retryAfter;
55
+ constructor(message, retryAfter, code = "rate_limit_exceeded") {
56
+ super(message, 429, code);
57
+ this.name = "RateLimitedError";
58
+ this.retryAfter = retryAfter;
59
+ Object.setPrototypeOf(this, new.target.prototype);
60
+ }
61
+ }
62
+ /**
63
+ * Thrown when the API returns 400 Bad Request.
64
+ */
65
+ export class BadRequestError extends KlozeoError {
66
+ constructor(message, code = "bad_request") {
67
+ super(message, 400, code);
68
+ this.name = "BadRequestError";
69
+ Object.setPrototypeOf(this, new.target.prototype);
70
+ }
71
+ }
72
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,uBAAuB;IACd,UAAU,CAAS;IAC5B,+DAA+D;IACtD,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,UAAkB,EAAE,IAAY;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,wDAAwD;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C,YAAY,OAAe,EAAE,IAAI,GAAG,WAAW;QAC7C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IAChD,YAAY,OAAe,EAAE,IAAI,GAAG,cAAc;QAChD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC7C,YAAY,OAAe,EAAE,IAAI,GAAG,WAAW;QAC7C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IAC/C,gDAAgD;IACvC,UAAU,CAAS;IAE5B,YAAY,OAAe,EAAE,UAAkB,EAAE,IAAI,GAAG,qBAAqB;QAC3E,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,YAAY,OAAe,EAAE,IAAI,GAAG,aAAa;QAC/C,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF"}