shipflow 0.3.1 → 0.4.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/README.md +22 -0
- package/dist/carriers/aramex/adapter.d.ts.map +1 -1
- package/dist/carriers/aramex/index.js +12 -11
- package/dist/carriers/aramex/index.js.map +4 -4
- package/dist/carriers/aramex/mappers.d.ts +13 -5
- package/dist/carriers/aramex/mappers.d.ts.map +1 -1
- package/dist/carriers/aymakan/adapter.d.ts +17 -21
- package/dist/carriers/aymakan/adapter.d.ts.map +1 -1
- package/dist/carriers/aymakan/index.js +67 -53
- package/dist/carriers/aymakan/index.js.map +4 -4
- package/dist/carriers/aymakan/mappers.d.ts +2 -0
- package/dist/carriers/aymakan/mappers.d.ts.map +1 -1
- package/dist/carriers/aymakan/types.d.ts +1 -1
- package/dist/carriers/aymakan/types.d.ts.map +1 -1
- package/dist/carriers/smsaexpress/adapter.d.ts +43 -4
- package/dist/carriers/smsaexpress/adapter.d.ts.map +1 -1
- package/dist/carriers/smsaexpress/index.js +141 -25
- package/dist/carriers/smsaexpress/index.js.map +5 -5
- package/dist/carriers/smsaexpress/mappers.d.ts +12 -3
- package/dist/carriers/smsaexpress/mappers.d.ts.map +1 -1
- package/dist/carriers/smsaexpress/services.d.ts +3 -1
- package/dist/carriers/smsaexpress/services.d.ts.map +1 -1
- package/dist/core/city-resolver.d.ts +44 -0
- package/dist/core/city-resolver.d.ts.map +1 -0
- package/dist/core/http.d.ts +8 -0
- package/dist/core/http.d.ts.map +1 -1
- package/dist/core/retry.d.ts +8 -3
- package/dist/core/retry.d.ts.map +1 -1
- package/dist/{index-qnxj8bct.js → index-8cpdcbsf.js} +32 -6
- package/dist/{index-qnxj8bct.js.map → index-8cpdcbsf.js.map} +5 -5
- package/dist/index-dfx6rbm2.js +36 -0
- package/dist/index-dfx6rbm2.js.map +10 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/carriers/aymakan/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,40 @@ export declare class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
14
14
|
readonly name = "smsaexpress";
|
|
15
15
|
readonly supportedCountries: string[];
|
|
16
16
|
private http;
|
|
17
|
+
/** Cached SMSA Saudi cities list for city validation on booking */
|
|
18
|
+
private citiesCache;
|
|
19
|
+
private citiesCacheTime;
|
|
20
|
+
/** Timestamp of the last failed cities-lookup attempt, if any */
|
|
21
|
+
private citiesFetchFailedAt;
|
|
17
22
|
constructor(config: SMSAExpressConfig);
|
|
18
23
|
protected getBaseUrl(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Ensure the input carries a `reference` so the OrderNumber the shipment is
|
|
26
|
+
* booked under is the exact value surfaced back on `Shipment.reference` (which
|
|
27
|
+
* the caller needs for {@link trackByReference}). When no reference is
|
|
28
|
+
* supplied we generate one here via the shared {@link generateOrderNumber} and
|
|
29
|
+
* pass this prepared input to BOTH the request mapper and the response mapper,
|
|
30
|
+
* so the request OrderNumber and the response reference always agree (otherwise
|
|
31
|
+
* each would call `Date.now()` independently and disagree).
|
|
32
|
+
*/
|
|
33
|
+
private withOrderNumber;
|
|
34
|
+
/**
|
|
35
|
+
* Load the SMSA Saudi cities list and cache it, mirroring the Aymakan
|
|
36
|
+
* adapter's TTL + failure-cooldown behavior: a lookup outage falls back to
|
|
37
|
+
* an empty cache (pass-through resolution) so it never blocks bookings.
|
|
38
|
+
*/
|
|
39
|
+
private ensureCitiesLoaded;
|
|
40
|
+
/**
|
|
41
|
+
* Validate/normalize a Saudi address city against SMSA's own city list
|
|
42
|
+
* before booking (SMSA's City field is list-validated server-side, so an
|
|
43
|
+
* unknown value previously produced an opaque carrier rejection). Strict:
|
|
44
|
+
* when the list is loaded and nothing matches, fail fast with a clear,
|
|
45
|
+
* field-scoped error. Lenient when the list is unavailable (outage) and for
|
|
46
|
+
* non-SA addresses, whose cities are not in the SA lookup.
|
|
47
|
+
*/
|
|
48
|
+
private resolveCityStrict;
|
|
49
|
+
/** Resolve shipper + consignee cities for a booking (strict — see above). */
|
|
50
|
+
private resolveCitiesInInput;
|
|
19
51
|
protected executeCreateShipment(input: CreateShipmentInput): Promise<Shipment>;
|
|
20
52
|
private createC2BShipment;
|
|
21
53
|
/**
|
|
@@ -24,10 +56,17 @@ export declare class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
24
56
|
* **Important:** SMSA only supports cancellation for C2B/reverse-pickup
|
|
25
57
|
* shipments, via the C2B endpoint. B2C shipments cannot be cancelled through
|
|
26
58
|
* the SMSA API: the endpoint responds without a cancellation confirmation,
|
|
27
|
-
* which is surfaced as an {@link APIError}
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* the other adapters, this method
|
|
59
|
+
* which is surfaced as an {@link APIError} (with `code: "CANCELLATION_UNCONFIRMED"`)
|
|
60
|
+
* rather than a misleading `false`. That `code` lets callers distinguish this
|
|
61
|
+
* "carrier did not confirm" case from a genuine request failure (network/4xx/5xx)
|
|
62
|
+
* and fall back accordingly. Consistent with the other adapters, this method
|
|
63
|
+
* either returns `true` or throws.
|
|
64
|
+
*
|
|
65
|
+
* Success is detected with a negation-aware check: a cancel token must be
|
|
66
|
+
* present AND no negation token may be. A bare `includes("cancelled")` would
|
|
67
|
+
* wrongly succeed on negatives like "Shipment cannot be cancelled",
|
|
68
|
+
* "not cancelled" or "cancellation failed". Note "already cancelled" carries
|
|
69
|
+
* no negation token, so it correctly reports success (idempotent cancel).
|
|
31
70
|
*/
|
|
32
71
|
cancelShipment(trackingNumber: string): Promise<boolean>;
|
|
33
72
|
track(trackingNumber: string): Promise<TrackingResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/carriers/smsaexpress/adapter.ts"],"names":[],"mappings":"AACA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/carriers/smsaexpress/adapter.ts"],"names":[],"mappings":"AACA;;;GAGG;AASH,OAAO,KAAK,EACV,aAAa,EACb,IAAI,EACJ,mBAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAa7C,OAAO,KAAK,EAGV,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EAEtB,wBAAwB,EAEzB,MAAM,SAAS,CAAC;AAQjB,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,WAAW,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,kBAAkB,WASzB;IAEF,OAAO,CAAC,IAAI,CAAa;IAEzB,mEAAmE;IACnE,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,eAAe,CAAK;IAC5B,iEAAiE;IACjE,OAAO,CAAC,mBAAmB,CAAK;gBAEpB,MAAM,EAAE,iBAAiB;IAWrC,SAAS,CAAC,UAAU,IAAI,MAAM;IAU9B;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe;IAOvB;;;;OAIG;YACW,kBAAkB;IAkBhC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAgBzB,6EAA6E;YAC/D,oBAAoB;cAiBlB,qBAAqB,CACnC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC;YAqBN,iBAAiB;IAY/B;;;;;;;;;;;;;;;;;OAiBG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0CxD,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQtD,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAUnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAY5D,QAAQ,CACZ,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAC9B,OAAO,CAAC,MAAM,CAAC;IA2CZ,SAAS,CAAC,WAAW,SAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAkB9C,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmB1C,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBjE,WAAW,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7D,oBAAoB,CACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,wBAAwB,CAAC;IAM9B,aAAa,CACjB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,yBAAyB,CAAC;IAWrC,YAAY,CACV,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY;IAIf;;;;;;OAMG;IACH,iBAAiB,CACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB,GACA,YAAY,EAAE;CAGlB"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CITIES_CACHE_TTL,
|
|
3
|
+
CITIES_FAILURE_COOLDOWN,
|
|
4
|
+
findCityMatch
|
|
5
|
+
} from "../../index-dfx6rbm2.js";
|
|
1
6
|
import {
|
|
2
7
|
APIError,
|
|
3
8
|
BaseCarrierAdapter,
|
|
4
9
|
HttpClient,
|
|
10
|
+
RateLimitError,
|
|
5
11
|
ValidationError,
|
|
6
12
|
WebhookVerificationError
|
|
7
|
-
} from "../../index-
|
|
13
|
+
} from "../../index-8cpdcbsf.js";
|
|
8
14
|
|
|
9
15
|
// src/carriers/smsaexpress/services.ts
|
|
10
16
|
var SMSAService = {
|
|
@@ -37,7 +43,13 @@ var SMSAStatusCodes = {
|
|
|
37
43
|
|
|
38
44
|
// src/carriers/smsaexpress/mappers.ts
|
|
39
45
|
function mapSMSAStatus(scanType) {
|
|
40
|
-
return SMSAStatusCodes[scanType] ?? "
|
|
46
|
+
return SMSAStatusCodes[scanType] ?? "unknown";
|
|
47
|
+
}
|
|
48
|
+
function scanDate(scan) {
|
|
49
|
+
return new Date(scan.ScanTimeZone ? `${scan.ScanDateTime}${scan.ScanTimeZone}` : scan.ScanDateTime);
|
|
50
|
+
}
|
|
51
|
+
function scanTimestampMs(scan) {
|
|
52
|
+
return scanDate(scan).getTime();
|
|
41
53
|
}
|
|
42
54
|
function deriveStatusFromScans(scans, isDelivered) {
|
|
43
55
|
if (isDelivered) {
|
|
@@ -47,7 +59,7 @@ function deriveStatusFromScans(scans, isDelivered) {
|
|
|
47
59
|
if (safeScans.length === 0) {
|
|
48
60
|
return { status: "unknown", statusLabel: "Unknown" };
|
|
49
61
|
}
|
|
50
|
-
const sorted = [...safeScans].sort((a, b) =>
|
|
62
|
+
const sorted = [...safeScans].sort((a, b) => scanTimestampMs(b) - scanTimestampMs(a));
|
|
51
63
|
const latest = sorted[0];
|
|
52
64
|
return {
|
|
53
65
|
status: mapSMSAStatus(latest.ScanType),
|
|
@@ -57,10 +69,19 @@ function deriveStatusFromScans(scans, isDelivered) {
|
|
|
57
69
|
function roundWeight(weight) {
|
|
58
70
|
return Math.round(weight * 1000) / 1000;
|
|
59
71
|
}
|
|
72
|
+
function sanitizePhone(phone) {
|
|
73
|
+
return phone.replace(/\D/g, "");
|
|
74
|
+
}
|
|
75
|
+
function generateOrderNumber() {
|
|
76
|
+
return `ORD-${Date.now()}`;
|
|
77
|
+
}
|
|
78
|
+
function smsaShipDate() {
|
|
79
|
+
return new Date(Date.now() + 3 * 60 * 60 * 1000).toISOString().slice(0, 19);
|
|
80
|
+
}
|
|
60
81
|
function mapAddress(addr, opts) {
|
|
61
82
|
const result = {
|
|
62
83
|
ContactName: addr.name,
|
|
63
|
-
ContactPhoneNumber: addr.phone,
|
|
84
|
+
ContactPhoneNumber: sanitizePhone(addr.phone),
|
|
64
85
|
Country: addr.countryCode,
|
|
65
86
|
City: addr.city,
|
|
66
87
|
AddressLine1: addr.line1,
|
|
@@ -88,12 +109,12 @@ function mapCreateB2CRequest(input) {
|
|
|
88
109
|
return {
|
|
89
110
|
ConsigneeAddress: consigneeAddress,
|
|
90
111
|
ShipperAddress: mapAddress(input.shipper),
|
|
91
|
-
OrderNumber: input.reference ??
|
|
112
|
+
OrderNumber: input.reference ?? generateOrderNumber(),
|
|
92
113
|
CODAmount: input.cod?.enabled ? input.cod.amount : 0,
|
|
93
114
|
DeclaredValue: input.declaredValue?.amount ?? 0,
|
|
94
115
|
ContentDescription: input.parcels[0]?.description ?? "Shipment contents",
|
|
95
116
|
Parcels: totalPieces,
|
|
96
|
-
ShipDate:
|
|
117
|
+
ShipDate: smsaShipDate(),
|
|
97
118
|
ShipmentCurrency: (input.cod?.enabled ? input.cod.currency : undefined) ?? input.declaredValue?.currency ?? input.cod?.currency ?? "SAR",
|
|
98
119
|
Weight: roundWeight(totalWeight),
|
|
99
120
|
WeightUnit: "KG",
|
|
@@ -110,11 +131,11 @@ function mapCreateC2BRequest(input) {
|
|
|
110
131
|
return {
|
|
111
132
|
PickupAddress: mapAddress(input.consignee, { includeShortCode: true }),
|
|
112
133
|
ReturnToAddress: mapAddress(input.shipper),
|
|
113
|
-
OrderNumber: input.reference ??
|
|
134
|
+
OrderNumber: input.reference ?? generateOrderNumber(),
|
|
114
135
|
DeclaredValue: input.declaredValue?.amount ?? 0.1,
|
|
115
136
|
ContentDescription: input.parcels[0]?.description ?? "Return shipment contents",
|
|
116
137
|
Parcels: totalPieces,
|
|
117
|
-
ShipDate:
|
|
138
|
+
ShipDate: smsaShipDate(),
|
|
118
139
|
ShipmentCurrency: (input.cod?.enabled ? input.cod.currency : undefined) ?? input.declaredValue?.currency ?? input.cod?.currency ?? "SAR",
|
|
119
140
|
Weight: roundWeight(totalWeight),
|
|
120
141
|
WeightUnit: "KG",
|
|
@@ -202,11 +223,11 @@ function mapCreate2WayRequest(input) {
|
|
|
202
223
|
return {
|
|
203
224
|
ConsigneeAddress: consigneeAddress,
|
|
204
225
|
ShipperAddress: mapAddress(input.shipper),
|
|
205
|
-
OrderNumber: input.reference ??
|
|
226
|
+
OrderNumber: input.reference ?? generateOrderNumber(),
|
|
206
227
|
DeclaredValue: input.declaredValue?.amount ?? 0,
|
|
207
228
|
ContentDescription: input.parcels[0]?.description ?? "Shipment contents",
|
|
208
229
|
Parcels: totalPieces,
|
|
209
|
-
ShipDate:
|
|
230
|
+
ShipDate: smsaShipDate(),
|
|
210
231
|
ShipmentCurrency: input.declaredValue?.currency ?? "SAR",
|
|
211
232
|
Weight: roundWeight(totalWeight),
|
|
212
233
|
WeightUnit: "KG",
|
|
@@ -251,9 +272,9 @@ function verifyWebhookAuth(options) {
|
|
|
251
272
|
function mapWebhookShipmentToEvent(shipment) {
|
|
252
273
|
const scans = shipment.Scans ?? [];
|
|
253
274
|
const { status, statusLabel } = deriveStatusFromScans(scans, shipment.isDelivered);
|
|
254
|
-
const sorted = [...scans].sort((a, b) =>
|
|
275
|
+
const sorted = [...scans].sort((a, b) => scanTimestampMs(b) - scanTimestampMs(a));
|
|
255
276
|
const latestScan = sorted[0];
|
|
256
|
-
const timestamp = latestScan ?
|
|
277
|
+
const timestamp = latestScan ? scanDate(latestScan) : new Date;
|
|
257
278
|
return {
|
|
258
279
|
carrier: "smsaexpress",
|
|
259
280
|
eventType: "status_update",
|
|
@@ -266,6 +287,28 @@ function mapWebhookShipmentToEvent(shipment) {
|
|
|
266
287
|
raw: shipment
|
|
267
288
|
};
|
|
268
289
|
}
|
|
290
|
+
function mapWebhookShipmentToEvents(shipment) {
|
|
291
|
+
const scans = shipment.Scans ?? [];
|
|
292
|
+
if (scans.length === 0) {
|
|
293
|
+
return [mapWebhookShipmentToEvent(shipment)];
|
|
294
|
+
}
|
|
295
|
+
const sorted = [...scans].sort((a, b) => scanTimestampMs(a) - scanTimestampMs(b));
|
|
296
|
+
return sorted.map((scan, index) => {
|
|
297
|
+
const isLatest = index === sorted.length - 1;
|
|
298
|
+
const status = isLatest && shipment.isDelivered ? "delivered" : mapSMSAStatus(scan.ScanType);
|
|
299
|
+
return {
|
|
300
|
+
carrier: "smsaexpress",
|
|
301
|
+
eventType: "status_update",
|
|
302
|
+
trackingNumber: shipment.AWB,
|
|
303
|
+
reference: shipment.Reference || undefined,
|
|
304
|
+
status,
|
|
305
|
+
statusCode: scan.ScanType,
|
|
306
|
+
statusLabel: scan.ScanDescription,
|
|
307
|
+
timestamp: scanDate(scan),
|
|
308
|
+
raw: shipment
|
|
309
|
+
};
|
|
310
|
+
});
|
|
311
|
+
}
|
|
269
312
|
function validateWebhookPayload(payload) {
|
|
270
313
|
if (!Array.isArray(payload)) {
|
|
271
314
|
throw new ValidationError("Invalid SMSA webhook payload: expected an array of shipments", { raw: payload });
|
|
@@ -276,8 +319,8 @@ function validateWebhookPayload(payload) {
|
|
|
276
319
|
});
|
|
277
320
|
}
|
|
278
321
|
for (const item of payload) {
|
|
279
|
-
if (!item || typeof item !== "object" || !("AWB" in item)
|
|
280
|
-
throw new ValidationError("Invalid SMSA webhook payload: shipment missing required
|
|
322
|
+
if (!item || typeof item !== "object" || !("AWB" in item)) {
|
|
323
|
+
throw new ValidationError("Invalid SMSA webhook payload: shipment missing required field (AWB)", { raw: item });
|
|
281
324
|
}
|
|
282
325
|
}
|
|
283
326
|
return payload;
|
|
@@ -290,7 +333,7 @@ function parseSMSAWebhook(payload, options) {
|
|
|
290
333
|
function parseSMSAWebhookBatch(payload, options) {
|
|
291
334
|
verifyWebhookAuth(options);
|
|
292
335
|
const shipments = validateWebhookPayload(payload);
|
|
293
|
-
return shipments.
|
|
336
|
+
return shipments.flatMap(mapWebhookShipmentToEvents);
|
|
294
337
|
}
|
|
295
338
|
|
|
296
339
|
// src/carriers/smsaexpress/adapter.ts
|
|
@@ -311,6 +354,9 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
311
354
|
"JO"
|
|
312
355
|
];
|
|
313
356
|
http;
|
|
357
|
+
citiesCache = null;
|
|
358
|
+
citiesCacheTime = 0;
|
|
359
|
+
citiesFetchFailedAt = 0;
|
|
314
360
|
constructor(config) {
|
|
315
361
|
super(config);
|
|
316
362
|
this.http = new HttpClient({
|
|
@@ -324,14 +370,65 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
324
370
|
getBaseUrl() {
|
|
325
371
|
return this.config.mode === "production" ? SMSA_PRODUCTION_URL : SMSA_SANDBOX_URL;
|
|
326
372
|
}
|
|
373
|
+
withOrderNumber(input) {
|
|
374
|
+
if (input.reference) {
|
|
375
|
+
return input;
|
|
376
|
+
}
|
|
377
|
+
return { ...input, reference: generateOrderNumber() };
|
|
378
|
+
}
|
|
379
|
+
async ensureCitiesLoaded() {
|
|
380
|
+
const now = Date.now();
|
|
381
|
+
if (this.citiesCache && now - this.citiesCacheTime < CITIES_CACHE_TTL) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (now - this.citiesFetchFailedAt < CITIES_FAILURE_COOLDOWN) {
|
|
385
|
+
if (!this.citiesCache)
|
|
386
|
+
this.citiesCache = [];
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
try {
|
|
390
|
+
this.citiesCache = await this.getCities();
|
|
391
|
+
this.citiesCacheTime = now;
|
|
392
|
+
} catch {
|
|
393
|
+
this.citiesFetchFailedAt = now;
|
|
394
|
+
if (!this.citiesCache)
|
|
395
|
+
this.citiesCache = [];
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
resolveCityStrict(address, field) {
|
|
399
|
+
if (address.countryCode !== "SA")
|
|
400
|
+
return address.city;
|
|
401
|
+
if (!this.citiesCache || this.citiesCache.length === 0)
|
|
402
|
+
return address.city;
|
|
403
|
+
const match = findCityMatch(address.city, this.citiesCache);
|
|
404
|
+
if (!match) {
|
|
405
|
+
throw new ValidationError(`Unknown ${field.replace(".city", "")} city "${address.city}": not in SMSA's supported city list`, { field });
|
|
406
|
+
}
|
|
407
|
+
return match.nameEn;
|
|
408
|
+
}
|
|
409
|
+
async resolveCitiesInInput(input) {
|
|
410
|
+
await this.ensureCitiesLoaded();
|
|
411
|
+
return {
|
|
412
|
+
...input,
|
|
413
|
+
shipper: {
|
|
414
|
+
...input.shipper,
|
|
415
|
+
city: this.resolveCityStrict(input.shipper, "shipper.city")
|
|
416
|
+
},
|
|
417
|
+
consignee: {
|
|
418
|
+
...input.consignee,
|
|
419
|
+
city: this.resolveCityStrict(input.consignee, "consignee.city")
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
}
|
|
327
423
|
async executeCreateShipment(input) {
|
|
328
|
-
const
|
|
424
|
+
const prepared = await this.resolveCitiesInInput(this.withOrderNumber(input));
|
|
425
|
+
const isC2B = prepared.serviceType !== undefined && C2B_SERVICE_CODES.has(prepared.serviceType.trim().toUpperCase());
|
|
329
426
|
if (isC2B) {
|
|
330
|
-
return this.createC2BShipment(
|
|
427
|
+
return this.createC2BShipment(prepared);
|
|
331
428
|
}
|
|
332
|
-
const request = mapCreateB2CRequest(
|
|
429
|
+
const request = mapCreateB2CRequest(prepared);
|
|
333
430
|
const response = await this.http.post("/api/shipment/b2c/new", request);
|
|
334
|
-
return mapShipmentResponse(response,
|
|
431
|
+
return mapShipmentResponse(response, prepared);
|
|
335
432
|
}
|
|
336
433
|
async createC2BShipment(input) {
|
|
337
434
|
const request = mapCreateC2BRequest(input);
|
|
@@ -343,10 +440,16 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
343
440
|
if (typeof response !== "string") {
|
|
344
441
|
return true;
|
|
345
442
|
}
|
|
346
|
-
|
|
443
|
+
const hasCancelToken = /cancel/i.test(response);
|
|
444
|
+
const hasNegation = /\b(?:not|can\s?not|can'?t|cant|unable|fail(?:ed|ure)?|invalid|reject(?:ed)?|error)\b/i.test(response);
|
|
445
|
+
if (hasCancelToken && !hasNegation) {
|
|
347
446
|
return true;
|
|
348
447
|
}
|
|
349
|
-
throw new APIError(response.trim() || "SMSA did not confirm cancellation
|
|
448
|
+
throw new APIError(response.trim() || "SMSA did not confirm cancellation", {
|
|
449
|
+
carrier: "smsaexpress",
|
|
450
|
+
code: "CANCELLATION_UNCONFIRMED",
|
|
451
|
+
raw: response
|
|
452
|
+
});
|
|
350
453
|
}
|
|
351
454
|
async track(trackingNumber) {
|
|
352
455
|
const response = await this.http.get(`/api/track/single/${encodeURIComponent(trackingNumber)}`);
|
|
@@ -373,7 +476,7 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
373
476
|
return `data:application/pdf;base64,${waybill.awbFile}`;
|
|
374
477
|
}
|
|
375
478
|
} catch (error) {
|
|
376
|
-
if (!(error instanceof APIError) || error
|
|
479
|
+
if (!(error instanceof APIError) || error instanceof RateLimitError || error.statusCode !== undefined && error.statusCode >= 500) {
|
|
377
480
|
throw error;
|
|
378
481
|
}
|
|
379
482
|
}
|
|
@@ -385,16 +488,29 @@ class SMSAExpressAdapter extends BaseCarrierAdapter {
|
|
|
385
488
|
}
|
|
386
489
|
async getCities(countryCode = "SA") {
|
|
387
490
|
const response = await this.http.get(`/api/lookup/cities/${encodeURIComponent(countryCode)}`);
|
|
491
|
+
if (!Array.isArray(response)) {
|
|
492
|
+
throw new APIError("SMSA cities lookup returned an unexpected shape", {
|
|
493
|
+
carrier: "smsaexpress",
|
|
494
|
+
raw: response
|
|
495
|
+
});
|
|
496
|
+
}
|
|
388
497
|
return response.map(mapCity);
|
|
389
498
|
}
|
|
390
499
|
async getDropoffLocations() {
|
|
391
500
|
const response = await this.http.get("/api/lookup/smsaoffices");
|
|
501
|
+
if (!Array.isArray(response)) {
|
|
502
|
+
throw new APIError("SMSA offices lookup returned an unexpected shape", {
|
|
503
|
+
carrier: "smsaexpress",
|
|
504
|
+
raw: response
|
|
505
|
+
});
|
|
506
|
+
}
|
|
392
507
|
return response.map(mapOffice);
|
|
393
508
|
}
|
|
394
509
|
async create2WayShipment(input) {
|
|
395
|
-
const
|
|
510
|
+
const prepared = await this.resolveCitiesInInput(this.withOrderNumber(input));
|
|
511
|
+
const request = mapCreate2WayRequest(prepared);
|
|
396
512
|
const response = await this.http.post("/api/TwoWayShipment/new", request);
|
|
397
|
-
return mapShipmentResponse(response,
|
|
513
|
+
return mapShipmentResponse(response, prepared);
|
|
398
514
|
}
|
|
399
515
|
async sendInvoice(request) {
|
|
400
516
|
return this.http.post("/api/invoice", request);
|
|
@@ -421,4 +537,4 @@ export {
|
|
|
421
537
|
SMSAExpressAdapter
|
|
422
538
|
};
|
|
423
539
|
|
|
424
|
-
//# debugId=
|
|
540
|
+
//# debugId=87215A69EE27862E64756E2164756E21
|