pathao-merchant-sdk 2.0.1 → 2.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.
package/dist/index.js CHANGED
@@ -19,58 +19,72 @@ var PathaoApiError = class extends Error {
19
19
  this.responseData = options.responseData;
20
20
  }
21
21
  };
22
- var PathaoApiService = class {
23
- constructor(config) {
22
+ var PathaoApiService = class _PathaoApiService {
23
+ constructor(config, options) {
24
24
  this.accessToken = null;
25
25
  this.refreshToken = null;
26
26
  this.tokenExpiry = null;
27
27
  this.isAuthenticating = false;
28
28
  this.authPromise = null;
29
- this.requestQueue = [];
30
- this.circuitBreaker = {
31
- failures: 0,
32
- lastFailureTime: 0,
33
- threshold: 5,
34
- timeout: 6e4,
35
- // 1 minute
36
- isOpen: false
37
- };
29
+ this.hasValidated = false;
30
+ this.debug = false;
31
+ const parsedTimeout = parseInt(process.env.PATHAO_TIMEOUT || "", 10);
32
+ const envTimeout = Number.isNaN(parsedTimeout) || parsedTimeout <= 0 ? 3e4 : parsedTimeout;
33
+ const timeout = config.timeout ?? envTimeout;
38
34
  this.config = {
39
35
  baseURL: config.baseURL || process.env.PATHAO_BASE_URL || "",
40
- timeout: config.timeout || parseInt(process.env.PATHAO_TIMEOUT || "30000", 10),
36
+ timeout,
41
37
  clientId: config.clientId || process.env.PATHAO_CLIENT_ID || "",
42
38
  clientSecret: config.clientSecret || process.env.PATHAO_CLIENT_SECRET || "",
43
39
  username: config.username || process.env.PATHAO_USERNAME || "",
44
40
  password: config.password || process.env.PATHAO_PASSWORD || ""
45
41
  };
42
+ this.debug = options?.debug || false;
43
+ this.circuitBreaker = {
44
+ failures: 0,
45
+ lastFailureTime: 0,
46
+ threshold: options?.circuitBreaker?.threshold ?? 5,
47
+ timeout: options?.circuitBreaker?.timeout ?? 6e4,
48
+ isOpen: false
49
+ };
46
50
  this.pathaoClient = axios__default.default.create({
47
- baseURL: this.config.baseURL || process.env.PATHAO_BASE_URL || "",
48
- timeout: this.config.timeout || parseInt(process.env.PATHAO_TIMEOUT || "30000", 10),
51
+ baseURL: this.config.baseURL,
52
+ timeout: this.config.timeout,
49
53
  headers: {
50
54
  "Content-Type": "application/json",
51
- "Accept": "application/json"
55
+ Accept: "application/json",
56
+ "User-Agent": `pathao-merchant-sdk node/${process.version}`
52
57
  }
53
58
  });
54
- if (!this.config.baseURL) {
55
- throw new Error("Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable");
56
- }
57
- if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {
58
- throw new Error("Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)");
59
- }
60
59
  this.pathaoClient.interceptors.request.use(async (config2) => {
61
60
  if (config2.url?.includes("/issue-token")) {
62
61
  return config2;
63
62
  }
63
+ this.validateConfiguration();
64
64
  await this.ensureAuthenticated();
65
65
  if (this.accessToken) {
66
66
  config2.headers.Authorization = `Bearer ${this.accessToken}`;
67
67
  }
68
+ if (this.debug) {
69
+ const safeHeaders = { ...config2.headers };
70
+ if (safeHeaders["Authorization"]) safeHeaders["Authorization"] = "Bearer [REDACTED]";
71
+ console.log(`[Pathao SDK] ${config2.method?.toUpperCase()} ${config2.url}`, {
72
+ headers: safeHeaders,
73
+ data: config2.data
74
+ });
75
+ }
68
76
  return config2;
69
77
  });
70
78
  this.pathaoClient.interceptors.response.use(
71
79
  (response) => {
72
80
  this.circuitBreaker.failures = 0;
73
81
  this.circuitBreaker.isOpen = false;
82
+ if (this.debug) {
83
+ console.log(`[Pathao SDK] Response ${response.status}`, {
84
+ url: response.config.url,
85
+ data: response.data
86
+ });
87
+ }
74
88
  return response;
75
89
  },
76
90
  async (error) => {
@@ -87,18 +101,65 @@ var PathaoApiService = class {
87
101
  return this.pathaoClient.request(error.config);
88
102
  }
89
103
  }
104
+ if (error.response?.status === 429 && error.config && !error.config._rateLimitRetry) {
105
+ error.config._rateLimitRetry = true;
106
+ const retryAfterHeader = error.response.headers["retry-after"];
107
+ const delayMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1e3 : 1e3;
108
+ await this.delay(delayMs);
109
+ return this.pathaoClient.request(error.config);
110
+ }
111
+ const status = error.response?.status;
112
+ if (status !== void 0 && status >= 500 && error.config) {
113
+ const retryCount = error.config._retryCount ?? 0;
114
+ if (retryCount < 2) {
115
+ error.config._retryCount = retryCount + 1;
116
+ await this.delay(Math.min(500 * 2 ** retryCount, 4e3));
117
+ return this.pathaoClient.request(error.config);
118
+ }
119
+ }
90
120
  this.handleCircuitBreaker();
91
121
  return Promise.reject(error);
92
122
  }
93
123
  );
94
124
  }
125
+ validateConfiguration() {
126
+ if (this.hasValidated) {
127
+ return;
128
+ }
129
+ if (!this.config.baseURL) {
130
+ throw this.toPathaoApiError(
131
+ new Error(
132
+ "Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable"
133
+ ),
134
+ "Configuration validation failed"
135
+ );
136
+ }
137
+ if (!this.config.baseURL.startsWith("https://")) {
138
+ throw this.toPathaoApiError(
139
+ new Error("Pathao API baseURL must use HTTPS (https://)"),
140
+ "Configuration validation failed"
141
+ );
142
+ }
143
+ if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {
144
+ throw this.toPathaoApiError(
145
+ new Error(
146
+ "Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)"
147
+ ),
148
+ "Configuration validation failed"
149
+ );
150
+ }
151
+ this.hasValidated = true;
152
+ }
95
153
  async ensureAuthenticated() {
96
154
  if (this.circuitBreaker.isOpen) {
97
155
  if (Date.now() - this.circuitBreaker.lastFailureTime > this.circuitBreaker.timeout) {
98
156
  this.circuitBreaker.isOpen = false;
99
157
  this.circuitBreaker.failures = 0;
100
158
  } else {
101
- throw new Error("Circuit breaker is open. Too many authentication failures.");
159
+ throw new PathaoApiError(
160
+ "Circuit breaker is open. Too many authentication failures. Try again later.",
161
+ { code: 503 }
162
+ );
102
163
  }
103
164
  }
104
165
  if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {
@@ -114,7 +175,6 @@ var PathaoApiService = class {
114
175
  } finally {
115
176
  this.isAuthenticating = false;
116
177
  this.authPromise = null;
117
- this.processRequestQueue();
118
178
  }
119
179
  }
120
180
  async performAuthentication() {
@@ -128,25 +188,18 @@ var PathaoApiService = class {
128
188
  }
129
189
  await this.authenticate();
130
190
  }
131
- processRequestQueue() {
132
- const queue = [...this.requestQueue];
133
- this.requestQueue = [];
134
- queue.forEach(({ resolve }) => {
135
- try {
136
- resolve();
137
- } catch (error) {
138
- }
139
- });
140
- }
141
191
  async authenticate() {
142
192
  try {
143
- const response = await this.pathaoClient.post("/aladdin/api/v1/issue-token", {
144
- client_id: this.config.clientId,
145
- client_secret: this.config.clientSecret,
146
- username: this.config.username,
147
- password: this.config.password,
148
- grant_type: "password"
149
- });
193
+ const response = await this.pathaoClient.post(
194
+ "/aladdin/api/v1/issue-token",
195
+ {
196
+ client_id: this.config.clientId,
197
+ client_secret: this.config.clientSecret,
198
+ username: this.config.username,
199
+ password: this.config.password,
200
+ grant_type: "password"
201
+ }
202
+ );
150
203
  this.accessToken = response.data.access_token;
151
204
  this.refreshToken = response.data.refresh_token;
152
205
  this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
@@ -158,16 +211,16 @@ var PathaoApiService = class {
158
211
  }
159
212
  }
160
213
  async refreshAccessToken() {
161
- if (!this.refreshToken) {
162
- throw new Error("No refresh token available");
163
- }
164
214
  try {
165
- const response = await this.pathaoClient.post("/aladdin/api/v1/issue-token", {
166
- client_id: this.config.clientId,
167
- client_secret: this.config.clientSecret,
168
- refresh_token: this.refreshToken,
169
- grant_type: "refresh_token"
170
- });
215
+ const response = await this.pathaoClient.post(
216
+ "/aladdin/api/v1/issue-token",
217
+ {
218
+ client_id: this.config.clientId,
219
+ client_secret: this.config.clientSecret,
220
+ refresh_token: this.refreshToken,
221
+ grant_type: "refresh_token"
222
+ }
223
+ );
171
224
  this.accessToken = response.data.access_token;
172
225
  this.refreshToken = response.data.refresh_token;
173
226
  this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
@@ -186,24 +239,29 @@ var PathaoApiService = class {
186
239
  }
187
240
  return error.message;
188
241
  }
189
- return error.message || "Unknown error";
242
+ if (error instanceof Error) return error.message;
243
+ return "Unknown error";
190
244
  }
191
245
  toPathaoApiError(error, context) {
192
246
  if (error instanceof PathaoApiError) {
193
247
  return error;
194
248
  }
195
249
  const messageFallback = this.getErrorMessage(error);
196
- const axiosLike = error instanceof axios.AxiosError ? error : typeof error === "object" && error && "response" in error ? error : null;
250
+ const hasResponse = (e) => typeof e === "object" && e !== null && "response" in e;
251
+ const axiosLike = error instanceof axios.AxiosError ? error : hasResponse(error) ? error : null;
197
252
  if (axiosLike) {
198
253
  const pathaoError = axiosLike.response?.data;
199
- return new PathaoApiError(`${context}: ${pathaoError?.message || messageFallback}`, {
200
- status: axiosLike.response?.status,
201
- code: pathaoError?.code ?? axiosLike.response?.status,
202
- type: pathaoError?.type,
203
- errors: pathaoError?.errors,
204
- validation: pathaoError?.validation,
205
- responseData: pathaoError ?? axiosLike.response?.data
206
- });
254
+ return new PathaoApiError(
255
+ `${context}: ${pathaoError?.message || messageFallback}`,
256
+ {
257
+ status: axiosLike.response?.status,
258
+ code: pathaoError?.code ?? axiosLike.response?.status,
259
+ type: pathaoError?.type,
260
+ errors: pathaoError?.errors,
261
+ validation: pathaoError?.validation,
262
+ responseData: pathaoError ?? axiosLike.response?.data
263
+ }
264
+ );
207
265
  }
208
266
  return new PathaoApiError(`${context}: ${messageFallback}`);
209
267
  }
@@ -214,10 +272,16 @@ var PathaoApiService = class {
214
272
  this.circuitBreaker.isOpen = true;
215
273
  }
216
274
  }
275
+ delay(ms) {
276
+ return new Promise((resolve) => setTimeout(resolve, ms));
277
+ }
217
278
  // Official Pathao API: Create Order
218
279
  async createOrder(orderData) {
219
280
  try {
220
- const response = await this.pathaoClient.post("/aladdin/api/v1/orders", orderData);
281
+ const response = await this.pathaoClient.post(
282
+ "/aladdin/api/v1/orders",
283
+ orderData
284
+ );
221
285
  return response.data;
222
286
  } catch (error) {
223
287
  throw this.toPathaoApiError(error, "Failed to create Pathao order");
@@ -226,16 +290,22 @@ var PathaoApiService = class {
226
290
  // Official Pathao API: Create Store
227
291
  async createStore(storeData) {
228
292
  try {
229
- const response = await this.pathaoClient.post("/aladdin/api/v1/stores", storeData);
293
+ const response = await this.pathaoClient.post(
294
+ "/aladdin/api/v1/stores",
295
+ storeData
296
+ );
230
297
  return response.data;
231
298
  } catch (error) {
232
299
  throw this.toPathaoApiError(error, "Failed to create Pathao store");
233
300
  }
234
301
  }
235
302
  // Official Pathao API: Get Store List
236
- async getStores() {
303
+ async getStores(page) {
237
304
  try {
238
- const response = await this.pathaoClient.get("/aladdin/api/v1/stores");
305
+ const response = await this.pathaoClient.get(
306
+ "/aladdin/api/v1/stores",
307
+ page !== void 0 ? { params: { page } } : void 0
308
+ );
239
309
  return response.data;
240
310
  } catch (error) {
241
311
  throw this.toPathaoApiError(error, "Failed to fetch Pathao stores");
@@ -244,7 +314,10 @@ var PathaoApiService = class {
244
314
  // Official Pathao API: Calculate Price
245
315
  async calculatePrice(priceData) {
246
316
  try {
247
- const response = await this.pathaoClient.post("/aladdin/api/v1/merchant/price-plan", priceData);
317
+ const response = await this.pathaoClient.post(
318
+ "/aladdin/api/v1/merchant/price-plan",
319
+ priceData
320
+ );
248
321
  return response.data;
249
322
  } catch (error) {
250
323
  throw this.toPathaoApiError(error, "Failed to calculate Pathao price");
@@ -253,7 +326,9 @@ var PathaoApiService = class {
253
326
  // Official Pathao API: Get Cities
254
327
  async getCities() {
255
328
  try {
256
- const response = await this.pathaoClient.get("/aladdin/api/v1/city-list");
329
+ const response = await this.pathaoClient.get(
330
+ "/aladdin/api/v1/city-list"
331
+ );
257
332
  return response.data;
258
333
  } catch (error) {
259
334
  throw this.toPathaoApiError(error, "Failed to fetch Pathao cities");
@@ -262,7 +337,9 @@ var PathaoApiService = class {
262
337
  // Official Pathao API: Get Zones for a City
263
338
  async getZones(cityId) {
264
339
  try {
265
- const response = await this.pathaoClient.get(`/aladdin/api/v1/cities/${cityId}/zone-list`);
340
+ const response = await this.pathaoClient.get(
341
+ `/aladdin/api/v1/cities/${cityId}/zone-list`
342
+ );
266
343
  return response.data;
267
344
  } catch (error) {
268
345
  throw this.toPathaoApiError(error, "Failed to fetch Pathao zones");
@@ -271,7 +348,9 @@ var PathaoApiService = class {
271
348
  // Official Pathao API: Get Areas for a Zone
272
349
  async getAreas(zoneId) {
273
350
  try {
274
- const response = await this.pathaoClient.get(`/aladdin/api/v1/zones/${zoneId}/area-list`);
351
+ const response = await this.pathaoClient.get(
352
+ `/aladdin/api/v1/zones/${zoneId}/area-list`
353
+ );
275
354
  return response.data;
276
355
  } catch (error) {
277
356
  throw this.toPathaoApiError(error, "Failed to fetch Pathao areas");
@@ -280,7 +359,9 @@ var PathaoApiService = class {
280
359
  // Official Pathao API: Get Order Status
281
360
  async getOrderStatus(consignmentId) {
282
361
  try {
283
- const response = await this.pathaoClient.get(`/aladdin/api/v1/orders/${consignmentId}/info`);
362
+ const response = await this.pathaoClient.get(
363
+ `/aladdin/api/v1/orders/${encodeURIComponent(consignmentId)}/info`
364
+ );
284
365
  return response.data;
285
366
  } catch (error) {
286
367
  throw this.toPathaoApiError(error, "Failed to fetch Pathao order status");
@@ -289,7 +370,10 @@ var PathaoApiService = class {
289
370
  // Official Pathao API: Create Bulk Order
290
371
  async createBulkOrder(orders) {
291
372
  try {
292
- const response = await this.pathaoClient.post("/aladdin/api/v1/orders/bulk", { orders });
373
+ const response = await this.pathaoClient.post(
374
+ "/aladdin/api/v1/orders/bulk",
375
+ { orders }
376
+ );
293
377
  return response.data;
294
378
  } catch (error) {
295
379
  throw this.toPathaoApiError(error, "Failed to create bulk Pathao orders");
@@ -306,7 +390,9 @@ var PathaoApiService = class {
306
390
  if (cleanPhone.length === 11 && cleanPhone.startsWith("01")) {
307
391
  return cleanPhone;
308
392
  }
309
- throw new Error("Invalid phone number format. Must be 11 digits starting with 01");
393
+ throw new Error(
394
+ "Invalid phone number format. Must be 11 digits starting with 01"
395
+ );
310
396
  }
311
397
  // Helper method to validate address
312
398
  static validateAddress(address) {
@@ -335,7 +421,7 @@ var PathaoApiService = class {
335
421
  // Helper method to validate contact number
336
422
  static validateContactNumber(phone) {
337
423
  const cleanPhone = phone.replace(/\D/g, "");
338
- return cleanPhone.length === 11;
424
+ return cleanPhone.length === 11 && cleanPhone.startsWith("01");
339
425
  }
340
426
  // Helper method to validate store address
341
427
  static validateStoreAddress(address) {
@@ -349,14 +435,38 @@ var PathaoApiService = class {
349
435
  this.tokenExpiry = null;
350
436
  this.isAuthenticating = false;
351
437
  this.authPromise = null;
352
- this.requestQueue = [];
353
- this.circuitBreaker = {
354
- failures: 0,
355
- lastFailureTime: 0,
356
- threshold: 5,
357
- timeout: 6e4,
358
- isOpen: false
438
+ this.circuitBreaker.failures = 0;
439
+ this.circuitBreaker.isOpen = false;
440
+ this.circuitBreaker.lastFailureTime = 0;
441
+ }
442
+ // Static factory method to create instance from environment variables
443
+ static fromEnv(options) {
444
+ const config = {
445
+ clientId: "",
446
+ clientSecret: "",
447
+ username: "",
448
+ password: "",
449
+ baseURL: ""
359
450
  };
451
+ return new _PathaoApiService(config, options);
452
+ }
453
+ // Static factory method to create instance from configuration object
454
+ static fromConfig(config, options) {
455
+ return new _PathaoApiService(config, options);
456
+ }
457
+ // Named constructor for sandbox environment
458
+ static sandbox(credentials, options) {
459
+ return new _PathaoApiService(
460
+ { ...credentials, baseURL: "https://courier-api-sandbox.pathao.com" },
461
+ options
462
+ );
463
+ }
464
+ // Named constructor for production environment
465
+ static production(credentials, options) {
466
+ return new _PathaoApiService(
467
+ { ...credentials, baseURL: "https://api-hermes.pathao.com" },
468
+ options
469
+ );
360
470
  }
361
471
  };
362
472
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n * \n * This is an unofficial SDK for the Pathao Merchant API.\n * \n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n * \n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport {\n PathaoAreaResponse,\n PathaoAuthResponse,\n PathaoCityResponse,\n PathaoConfig,\n PathaoError,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoOrderStatusResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiError extends Error {\n status: number | undefined;\n code: number | undefined;\n type: string | undefined;\n errors: Record<string, string[]> | undefined;\n validation: Record<string, string[]> | undefined;\n responseData: unknown;\n\n constructor(message: string, options: {\n status?: number | undefined;\n code?: number | undefined;\n type?: string | undefined;\n errors?: Record<string, string[]> | undefined;\n validation?: Record<string, string[]> | undefined;\n responseData?: unknown;\n } = {}) {\n super(message);\n this.name = 'PathaoApiError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n this.errors = options.errors;\n this.validation = options.validation;\n this.responseData = options.responseData;\n }\n}\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: PathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private requestQueue: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];\n private circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: 5,\n timeout: 60000, // 1 minute\n isOpen: false,\n };\n\n constructor(config: PathaoConfig) {\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout: config.timeout || parseInt(process.env.PATHAO_TIMEOUT || '30000', 10),\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret: config.clientSecret || process.env.PATHAO_CLIENT_SECRET || '',\n username: config.username || process.env.PATHAO_USERNAME || '',\n password: config.password || process.env.PATHAO_PASSWORD || '',\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout: this.config.timeout || parseInt(process.env.PATHAO_TIMEOUT || '30000', 10),\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n // Validate required configuration\n if (!this.config.baseURL) {\n throw new Error('Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable');\n }\n \n if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {\n throw new Error('Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)');\n }\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n // Skip auth for token requests to prevent infinite loops\n if (config.url?.includes('/issue-token')) {\n return config;\n }\n \n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return config;\n });\n\n // Add response interceptor for error handling\n this.pathaoClient.interceptors.response.use(\n (response) => {\n // Reset circuit breaker on successful request\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n return response;\n },\n async (error) => {\n if (error.response?.status === 401) {\n // Token expired, clear tokens and retry\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n \n // Retry the request once\n if (error.config && !error.config._retry) {\n error.config._retry = true;\n await this.ensureAuthenticated();\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return this.pathaoClient.request(error.config);\n }\n }\n \n // Handle circuit breaker\n this.handleCircuitBreaker();\n return Promise.reject(error);\n },\n );\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (Date.now() - this.circuitBreaker.lastFailureTime > this.circuitBreaker.timeout) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new Error('Circuit breaker is open. Too many authentication failures.');\n }\n }\n\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n // If already authenticating, wait for it to complete\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n // Start authentication process\n this.isAuthenticating = true;\n this.authPromise = this.performAuthentication();\n\n try {\n await this.authPromise;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n // Process queued requests\n this.processRequestQueue();\n }\n }\n\n private async performAuthentication(): Promise<void> {\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n // Refresh failed, try fresh authentication\n this.refreshToken = null;\n }\n }\n\n await this.authenticate();\n }\n\n private processRequestQueue(): void {\n const queue = [...this.requestQueue];\n this.requestQueue = [];\n \n queue.forEach(({ resolve }) => {\n try {\n resolve();\n } catch (error) {\n // Ignore errors in queued requests\n }\n });\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password',\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful auth\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Authentication failed');\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n if (!this.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token',\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful refresh\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Token refresh failed');\n }\n }\n\n private getErrorMessage(error: unknown): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n return (error as Error).message || 'Unknown error';\n }\n\n private toPathaoApiError(error: unknown, context: string): PathaoApiError {\n if (error instanceof PathaoApiError) {\n return error;\n }\n\n const messageFallback = this.getErrorMessage(error);\n const axiosLike = (error instanceof AxiosError) ? error : (typeof error === 'object' && error && 'response' in (error as any) ? error as AxiosError : null);\n if (axiosLike) {\n const pathaoError = axiosLike.response?.data as PathaoError | undefined;\n return new PathaoApiError(`${context}: ${pathaoError?.message || messageFallback}`, {\n status: axiosLike.response?.status,\n code: pathaoError?.code ?? axiosLike.response?.status,\n type: pathaoError?.type,\n errors: pathaoError?.errors,\n validation: pathaoError?.validation,\n responseData: pathaoError ?? axiosLike.response?.data,\n });\n }\n\n return new PathaoApiError(`${context}: ${messageFallback}`);\n }\n\n private handleCircuitBreaker(): void {\n this.circuitBreaker.failures++;\n this.circuitBreaker.lastFailureTime = Date.now();\n \n if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {\n this.circuitBreaker.isOpen = true;\n }\n }\n\n // Official Pathao API: Create Order\n async createOrder(orderData: PathaoOrderRequest): Promise<PathaoOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoOrderResponse>('/aladdin/api/v1/orders', orderData);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao order');\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(storeData: PathaoStoreRequest): Promise<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>('/aladdin/api/v1/stores', storeData);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao store');\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(): Promise<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>('/aladdin/api/v1/stores');\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao stores');\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(priceData: PathaoPriceRequest): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>('/aladdin/api/v1/merchant/price-plan', priceData);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to calculate Pathao price');\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>('/aladdin/api/v1/city-list');\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao cities');\n }\n }\n\n // Official Pathao API: Get Zones for a City\n async getZones(cityId: number): Promise<PathaoZoneResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoZoneResponse>(`/aladdin/api/v1/cities/${cityId}/zone-list`);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao zones');\n }\n }\n\n // Official Pathao API: Get Areas for a Zone\n async getAreas(zoneId: number): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>(`/aladdin/api/v1/zones/${zoneId}/area-list`);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao areas');\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(consignmentId: string): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(`/aladdin/api/v1/orders/${consignmentId}/info`);\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao order status');\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(\n orders: PathaoOrderRequest[],\n ): Promise<{ message: string; type: string; code: number; data: boolean }> {\n try {\n const response = await this.pathaoClient.post<{\n message: string;\n type: string;\n code: number;\n data: boolean;\n }>('/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error('Invalid phone number format. Must be 11 digits starting with 01');\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n\n // Helper method to validate store name\n static validateStoreName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact name\n static validateContactName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact number\n static validateContactNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11;\n }\n\n // Helper method to validate store address\n static validateStoreAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 15 && trimmed.length <= 120;\n }\n\n // Method to clear authentication state (useful for testing)\n clearAuth(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.requestQueue = [];\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: 5,\n timeout: 60000,\n isOpen: false,\n };\n }\n}\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string; // 3-50 characters\n contact_name: string; // 3-50 characters\n contact_number: string; // 11 characters\n secondary_contact?: string; // Optional - 11 characters\n otp_number?: string; // Optional - OTP for orders\n address: string; // 15-120 characters\n city_id: number;\n zone_id: number;\n area_id: number;\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n delivery_fee: number;\n };\n}\n\n// Official Pathao Store Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\n store_id: number;\n store_name: string;\n store_address: string;\n is_active: number; // 1 for active, 0 for deactivated\n city_id: number;\n zone_id: number;\n hub_id: number;\n is_default_store: boolean;\n is_default_return_store: boolean;\n}\n\n// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: string;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n price: number; // Calculated price for given item\n discount: number; // Discount for the given item\n promo_discount: number; // Promo discount for the given item\n plan_id: number; // Price plan id for the given item\n cod_enabled: number; // 1 if COD enabled, 0 if not\n cod_percentage: number; // Cash on delivery percentage\n additional_charge: number; // If there is any additional charge\n final_price: number; // Your final price for the given item\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n city_id: number;\n city_name: string;\n }>;\n };\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n order_status_slug: string;\n updated_at: string;\n invoice_id: string | null;\n };\n}\n\n// Official Pathao Zone Response\nexport interface PathaoZoneResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n zone_id: number;\n zone_name: string;\n }>;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n area_id: number;\n area_name: string;\n home_delivery_available: boolean;\n pickup_available: boolean;\n }>;\n };\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL: string;\n timeout?: number;\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n// Delivery types enum\nexport enum DeliveryType {\n NORMAL = 48,\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Store types enum (removed as not used in official API)\n// export enum StoreType {\n// PICKUP_POINT = 1,\n// SERVICE_POINT = 2\n// }\n"]}
1
+ {"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n *\n * This is an unofficial SDK for the Pathao Merchant API.\n *\n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n *\n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport {\n PathaoAreaResponse,\n PathaoAuthResponse,\n PathaoBulkOrderResponse,\n PathaoCityResponse,\n PathaoConfig,\n PathaoError,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoOrderStatusResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiError extends Error {\n status: number | undefined;\n code: number | undefined;\n type: string | undefined;\n errors: Record<string, string[]> | undefined;\n validation: Record<string, string[]> | undefined;\n responseData: unknown;\n\n constructor(\n message: string,\n options: {\n status?: number | undefined;\n code?: number | undefined;\n type?: string | undefined;\n errors?: Record<string, string[]> | undefined;\n validation?: Record<string, string[]> | undefined;\n responseData?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n this.errors = options.errors;\n this.validation = options.validation;\n this.responseData = options.responseData;\n }\n}\n\n// Internal resolved config with guaranteed timeout\ninterface ResolvedPathaoConfig extends PathaoConfig {\n timeout: number;\n}\n\n// Circuit breaker configuration\nexport interface CircuitBreakerConfig {\n threshold?: number; // Default: 5\n timeout?: number; // Default: 60000ms\n}\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: ResolvedPathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private hasValidated: boolean = false;\n private debug: boolean = false;\n private circuitBreaker: {\n failures: number;\n lastFailureTime: number;\n threshold: number;\n timeout: number;\n isOpen: boolean;\n };\n\n constructor(config: PathaoConfig, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }) {\n const parsedTimeout = parseInt(process.env.PATHAO_TIMEOUT || '', 10);\n const envTimeout = Number.isNaN(parsedTimeout) || parsedTimeout <= 0 ? 30000 : parsedTimeout;\n const timeout: number = config.timeout ?? envTimeout;\n\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout,\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret:\n config.clientSecret || process.env.PATHAO_CLIENT_SECRET || '',\n username: config.username || process.env.PATHAO_USERNAME || '',\n password: config.password || process.env.PATHAO_PASSWORD || '',\n };\n\n this.debug = options?.debug || false;\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: options?.circuitBreaker?.threshold ?? 5,\n timeout: options?.circuitBreaker?.timeout ?? 60000,\n isOpen: false,\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `pathao-merchant-sdk node/${ process.version}`,\n },\n });\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n // Skip auth for token requests to prevent infinite loops\n if (config.url?.includes('/issue-token')) {\n return config;\n }\n\n // Validate configuration on first API call\n this.validateConfiguration();\n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n\n if (this.debug) {\n const safeHeaders = { ...config.headers } as Record<string, unknown>;\n if (safeHeaders['Authorization']) safeHeaders['Authorization'] = 'Bearer [REDACTED]';\n console.log(`[Pathao SDK] ${config.method?.toUpperCase()} ${config.url}`, {\n headers: safeHeaders,\n data: config.data,\n });\n }\n\n return config;\n });\n\n // Add response interceptor for error handling\n this.pathaoClient.interceptors.response.use(\n (response) => {\n // Reset circuit breaker on successful request\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n\n if (this.debug) {\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: response.data,\n });\n }\n\n return response;\n },\n async (error) => {\n if (error.response?.status === 401) {\n // Token expired, clear tokens and retry once\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n\n if (error.config && !error.config._retry) {\n error.config._retry = true;\n await this.ensureAuthenticated();\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Respect Retry-After on 429 (rate limit), retry once\n if (error.response?.status === 429 && error.config && !error.config._rateLimitRetry) {\n error.config._rateLimitRetry = true;\n const retryAfterHeader = error.response.headers['retry-after'] as string | undefined;\n const delayMs = retryAfterHeader ? parseInt(retryAfterHeader, 10) * 1000 : 1000;\n await this.delay(delayMs);\n return this.pathaoClient.request(error.config);\n }\n\n // Retry transient 5xx errors with exponential backoff (max 2 retries)\n const status: number | undefined = error.response?.status;\n if (status !== undefined && status >= 500 && error.config) {\n const retryCount: number = (error.config._retryCount as number | undefined) ?? 0;\n if (retryCount < 2) {\n error.config._retryCount = retryCount + 1;\n await this.delay(Math.min(500 * 2 ** retryCount, 4000));\n return this.pathaoClient.request(error.config);\n }\n }\n\n // Handle circuit breaker\n this.handleCircuitBreaker();\n return Promise.reject(error);\n },\n );\n }\n\n private validateConfiguration(): void {\n // Only validate once\n if (this.hasValidated) {\n return;\n }\n\n if (!this.config.baseURL) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable',\n ),\n 'Configuration validation failed',\n );\n }\n\n if (!this.config.baseURL.startsWith('https://')) {\n throw this.toPathaoApiError(\n new Error('Pathao API baseURL must use HTTPS (https://)'),\n 'Configuration validation failed',\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw this.toPathaoApiError(\n new Error(\n 'Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)',\n ),\n 'Configuration validation failed',\n );\n }\n\n this.hasValidated = true;\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (\n Date.now() - this.circuitBreaker.lastFailureTime >\n this.circuitBreaker.timeout\n ) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new PathaoApiError(\n 'Circuit breaker is open. Too many authentication failures. Try again later.',\n { code: 503 },\n );\n }\n }\n\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n // If already authenticating, wait for it to complete\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n // Start authentication process\n this.isAuthenticating = true;\n this.authPromise = this.performAuthentication();\n\n try {\n await this.authPromise;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n }\n }\n\n private async performAuthentication(): Promise<void> {\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n // Refresh failed, try fresh authentication\n this.refreshToken = null;\n }\n }\n\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful auth\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Authentication failed');\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>(\n '/aladdin/api/v1/issue-token',\n {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token',\n },\n );\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + response.data.expires_in * 1000 - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful refresh\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker();\n throw this.toPathaoApiError(error, 'Token refresh failed');\n }\n }\n\n private getErrorMessage(error: unknown): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n if (error instanceof Error) return error.message;\n return 'Unknown error';\n }\n\n private toPathaoApiError(error: unknown, context: string): PathaoApiError {\n if (error instanceof PathaoApiError) {\n return error;\n }\n\n const messageFallback = this.getErrorMessage(error);\n const hasResponse = (e: unknown): e is { response?: AxiosError['response'] } =>\n typeof e === 'object' && e !== null && 'response' in e;\n const axiosLike =\n error instanceof AxiosError\n ? error\n : hasResponse(error)\n ? error\n : null;\n if (axiosLike) {\n const pathaoError = axiosLike.response?.data as PathaoError | undefined;\n return new PathaoApiError(\n `${context}: ${pathaoError?.message || messageFallback}`,\n {\n status: axiosLike.response?.status,\n code: pathaoError?.code ?? axiosLike.response?.status,\n type: pathaoError?.type,\n errors: pathaoError?.errors,\n validation: pathaoError?.validation,\n responseData: pathaoError ?? axiosLike.response?.data,\n },\n );\n }\n\n return new PathaoApiError(`${context}: ${messageFallback}`);\n }\n\n private handleCircuitBreaker(): void {\n this.circuitBreaker.failures++;\n this.circuitBreaker.lastFailureTime = Date.now();\n\n if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {\n this.circuitBreaker.isOpen = true;\n }\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n // Official Pathao API: Create Order\n async createOrder(\n orderData: PathaoOrderRequest,\n ): Promise<PathaoOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoOrderResponse>(\n '/aladdin/api/v1/orders',\n orderData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao order');\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(\n storeData: PathaoStoreRequest,\n ): Promise<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>(\n '/aladdin/api/v1/stores',\n storeData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create Pathao store');\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(page?: number): Promise<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>(\n '/aladdin/api/v1/stores',\n page !== undefined ? { params: { page } } : undefined,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao stores');\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(\n priceData: PathaoPriceRequest,\n ): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>(\n '/aladdin/api/v1/merchant/price-plan',\n priceData,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to calculate Pathao price');\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>(\n '/aladdin/api/v1/city-list',\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao cities');\n }\n }\n\n // Official Pathao API: Get Zones for a City\n async getZones(cityId: number): Promise<PathaoZoneResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoZoneResponse>(\n `/aladdin/api/v1/cities/${cityId}/zone-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao zones');\n }\n }\n\n // Official Pathao API: Get Areas for a Zone\n async getAreas(zoneId: number): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>(\n `/aladdin/api/v1/zones/${zoneId}/area-list`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao areas');\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(\n consignmentId: string,\n ): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(\n `/aladdin/api/v1/orders/${encodeURIComponent(consignmentId)}/info`,\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to fetch Pathao order status');\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(\n orders: PathaoOrderRequest[],\n ): Promise<PathaoBulkOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoBulkOrderResponse>(\n '/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, 'Failed to create bulk Pathao orders');\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error(\n 'Invalid phone number format. Must be 11 digits starting with 01',\n );\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n\n // Helper method to validate store name\n static validateStoreName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact name\n static validateContactName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact number\n static validateContactNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to validate store address\n static validateStoreAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 15 && trimmed.length <= 120;\n }\n\n // Method to clear authentication state (useful for testing)\n clearAuth(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.lastFailureTime = 0;\n }\n\n // Static factory method to create instance from environment variables\n static fromEnv(options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n const config: PathaoConfig = {\n clientId: '',\n clientSecret: '',\n username: '',\n password: '',\n baseURL: '',\n };\n return new PathaoApiService(config, options);\n }\n\n // Static factory method to create instance from configuration object\n static fromConfig(\n config: PathaoConfig,\n options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig },\n ): PathaoApiService {\n return new PathaoApiService(config, options);\n }\n\n // Named constructor for sandbox environment\n static sandbox(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://courier-api-sandbox.pathao.com' },\n options,\n );\n }\n\n // Named constructor for production environment\n static production(credentials: Omit<PathaoConfig, 'baseURL'>, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(\n { ...credentials, baseURL: 'https://api-hermes.pathao.com' },\n options,\n );\n }\n}\n\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string; // 3-50 characters\n contact_name: string; // 3-50 characters\n contact_number: string; // 11 characters\n secondary_contact?: string; // Optional - 11 characters\n otp_number?: string; // Optional - OTP for orders\n address: string; // 15-120 characters\n city_id: number;\n zone_id: number;\n area_id: number;\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n delivery_fee: number;\n };\n}\n\n// Official Pathao Store Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\n store_id: number;\n store_name: string;\n store_address: string;\n is_active: 0 | 1; // 1 for active, 0 for deactivated\n city_id: number;\n zone_id: number;\n hub_id: number;\n is_default_store: boolean;\n is_default_return_store: boolean;\n}\n\n// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: string;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n price: number; // Calculated price for given item\n discount: number; // Discount for the given item\n promo_discount: number; // Promo discount for the given item\n plan_id: number; // Price plan id for the given item\n cod_enabled: 0 | 1; // 1 if COD enabled, 0 if not\n cod_percentage: number; // Cash on delivery percentage\n additional_charge: number; // If there is any additional charge\n final_price: number; // Your final price for the given item\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n city_id: number;\n city_name: string;\n }>;\n };\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n order_status_slug: string;\n updated_at: string;\n invoice_id: string | null;\n };\n}\n\n// Official Pathao Zone Response\nexport interface PathaoZoneResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n zone_id: number;\n zone_name: string;\n }>;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n area_id: number;\n area_name: string;\n home_delivery_available: boolean;\n pickup_available: boolean;\n }>;\n };\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL: string;\n timeout?: number; // Optional - defaults to 30000 if not provided\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n/**\n * Delivery type codes defined by the Pathao API.\n * Values correspond to Pathao's internal delivery_type IDs.\n * @see https://developers.pathao.com - Order Creation endpoint\n */\nexport enum DeliveryType {\n /** Standard delivery (API value: 48) */\n NORMAL = 48,\n /** Same-day on-demand delivery (API value: 12) */\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Official Pathao Bulk Order Response\nexport interface PathaoBulkOrderResponse {\n message: string;\n type: string;\n code: number;\n data: boolean;\n}\n\n"]}