@veho/turvo-integration-sdk 0.1.0-beta.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 +473 -0
- package/index.ts +1 -0
- package/lib/cjs/api/turvoInternalApi.d.ts +23 -0
- package/lib/cjs/api/turvoInternalApi.js +36 -0
- package/lib/cjs/api/turvoPublicApi.d.ts +99 -0
- package/lib/cjs/api/turvoPublicApi.js +103 -0
- package/lib/cjs/client/turvoClient.d.ts +49 -0
- package/lib/cjs/client/turvoClient.js +180 -0
- package/lib/cjs/constants.d.ts +29 -0
- package/lib/cjs/constants.js +33 -0
- package/lib/cjs/index.d.ts +6 -0
- package/lib/cjs/index.js +37 -0
- package/lib/cjs/shipmentTracking/index.d.ts +22 -0
- package/lib/cjs/shipmentTracking/index.js +39 -0
- package/lib/cjs/shipmentTracking/trackingService.d.ts +25 -0
- package/lib/cjs/shipmentTracking/trackingService.js +85 -0
- package/lib/cjs/types/common.d.ts +64 -0
- package/lib/cjs/types/common.js +27 -0
- package/lib/cjs/types/config.d.ts +13 -0
- package/lib/cjs/types/config.js +3 -0
- package/lib/cjs/types/errors.d.ts +35 -0
- package/lib/cjs/types/errors.js +63 -0
- package/lib/cjs/types/index.d.ts +5 -0
- package/lib/cjs/types/index.js +27 -0
- package/lib/cjs/types/shipment.d.ts +379 -0
- package/lib/cjs/types/shipment.js +46 -0
- package/lib/cjs/types/tracking.d.ts +65 -0
- package/lib/cjs/types/tracking.js +3 -0
- package/lib/esm/api/turvoInternalApi.d.ts +23 -0
- package/lib/esm/api/turvoInternalApi.js +32 -0
- package/lib/esm/api/turvoPublicApi.d.ts +99 -0
- package/lib/esm/api/turvoPublicApi.js +99 -0
- package/lib/esm/client/turvoClient.d.ts +49 -0
- package/lib/esm/client/turvoClient.js +172 -0
- package/lib/esm/constants.d.ts +29 -0
- package/lib/esm/constants.js +30 -0
- package/lib/esm/index.d.ts +6 -0
- package/lib/esm/index.js +11 -0
- package/lib/esm/shipmentTracking/index.d.ts +22 -0
- package/lib/esm/shipmentTracking/index.js +36 -0
- package/lib/esm/shipmentTracking/trackingService.d.ts +25 -0
- package/lib/esm/shipmentTracking/trackingService.js +81 -0
- package/lib/esm/types/common.d.ts +64 -0
- package/lib/esm/types/common.js +23 -0
- package/lib/esm/types/config.d.ts +13 -0
- package/lib/esm/types/config.js +2 -0
- package/lib/esm/types/errors.d.ts +35 -0
- package/lib/esm/types/errors.js +55 -0
- package/lib/esm/types/index.d.ts +5 -0
- package/lib/esm/types/index.js +11 -0
- package/lib/esm/types/shipment.d.ts +379 -0
- package/lib/esm/types/shipment.js +43 -0
- package/lib/esm/types/tracking.d.ts +65 -0
- package/lib/esm/types/tracking.js +2 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TurvoPublicApi = void 0;
|
|
4
|
+
const common_1 = require("../types/common");
|
|
5
|
+
/**
|
|
6
|
+
* TurvoPublicApi provides access to documented Turvo API endpoints.
|
|
7
|
+
* All shipment management operations (create, update, cancel, query) go through this class.
|
|
8
|
+
*/
|
|
9
|
+
class TurvoPublicApi {
|
|
10
|
+
client;
|
|
11
|
+
constructor(client) {
|
|
12
|
+
this.client = client;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* GET /v1/shipments/{id}
|
|
16
|
+
* Returns shipment details, stops, status
|
|
17
|
+
*/
|
|
18
|
+
async getShipment(params) {
|
|
19
|
+
const { shipmentId } = params;
|
|
20
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
21
|
+
return httpClient.sendRequest(`/shipments/${shipmentId}`, common_1.TurvoApiMethod.GET, {});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* POST /v1/shipments
|
|
25
|
+
* Upload properly formatted shipment to Turvo
|
|
26
|
+
*/
|
|
27
|
+
async uploadShipment(params) {
|
|
28
|
+
const { shipment } = params;
|
|
29
|
+
// Note: vehoLoadId is kept in the params for logging purposes by consumers
|
|
30
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
31
|
+
return httpClient.sendRequest('/shipments', common_1.TurvoApiMethod.POST, {
|
|
32
|
+
body: shipment,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* PUT /v1/tags/attach/shipment/{id}
|
|
37
|
+
* Associate a list of tags with a shipment by ID
|
|
38
|
+
*/
|
|
39
|
+
async associateTagsToShipment(params) {
|
|
40
|
+
const { turvoShipmentId, tags } = params;
|
|
41
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
42
|
+
return httpClient.sendRequest(`/tags/attach/shipment/${turvoShipmentId}`, common_1.TurvoApiMethod.PUT, {
|
|
43
|
+
body: {
|
|
44
|
+
tagNames: tags,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* PUT /v1/shipments/status/{id}
|
|
50
|
+
* Set shipment status to Cancelled in Turvo
|
|
51
|
+
*/
|
|
52
|
+
async cancelShipment(params) {
|
|
53
|
+
const { turvoShipmentId } = params;
|
|
54
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
55
|
+
const body = {
|
|
56
|
+
id: turvoShipmentId,
|
|
57
|
+
status: {
|
|
58
|
+
code: { key: '2113', value: 'Canceled' },
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
return httpClient.sendRequest(`/shipments/status/${turvoShipmentId}`, common_1.TurvoApiMethod.PUT, {
|
|
62
|
+
body,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* PUT /v1/shipments/status/{id}
|
|
67
|
+
* Update shipment status at a specific stop
|
|
68
|
+
*/
|
|
69
|
+
async updateShipmentStatus(params) {
|
|
70
|
+
const { turvoShipmentId, turvoStopId, turvoStatusCode, statusDate, statusTimezone } = params;
|
|
71
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
72
|
+
const body = {
|
|
73
|
+
id: turvoShipmentId,
|
|
74
|
+
status: {
|
|
75
|
+
globalShipLocationId: turvoStopId,
|
|
76
|
+
code: turvoStatusCode.code,
|
|
77
|
+
timezone: statusTimezone,
|
|
78
|
+
statusDate: {
|
|
79
|
+
date: statusDate,
|
|
80
|
+
timezone: statusTimezone,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
return httpClient.sendRequest(`/shipments/status/${turvoShipmentId}`, common_1.TurvoApiMethod.PUT, { body });
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* GET /v1/shipments/list
|
|
88
|
+
* Query shipments from Turvo with pagination support
|
|
89
|
+
*/
|
|
90
|
+
async filterShipments(params) {
|
|
91
|
+
const { turvoLocationId, pickupDateStart, start = 0 } = params;
|
|
92
|
+
const httpClient = await this.client.getAuthenticatedClient();
|
|
93
|
+
return httpClient.sendRequest('/shipments/list', common_1.TurvoApiMethod.GET, {
|
|
94
|
+
query: {
|
|
95
|
+
'locationId[eq]': turvoLocationId.toString(),
|
|
96
|
+
'pickupDate[gte]': pickupDateStart,
|
|
97
|
+
start: start.toString(),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.TurvoPublicApi = TurvoPublicApi;
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVydm9QdWJsaWNBcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3R1cnZvUHVibGljQXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDRDQU13QjtBQTBFeEI7OztHQUdHO0FBQ0gsTUFBYSxjQUFjO0lBQ0w7SUFBcEIsWUFBb0IsTUFBbUI7UUFBbkIsV0FBTSxHQUFOLE1BQU0sQ0FBYTtJQUFHLENBQUM7SUFFM0M7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUF5QjtRQUN6QyxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFBO1FBQzdCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRTdELE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBZ0IsY0FBYyxVQUFVLEVBQUUsRUFBRSx1QkFBYyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNsRyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUE0QjtRQUMvQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxDQUFBO1FBQzNCLDJFQUEyRTtRQUMzRSxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUU3RCxPQUFPLFVBQVUsQ0FBQyxXQUFXLENBQStCLFlBQVksRUFBRSx1QkFBYyxDQUFDLElBQUksRUFBRTtZQUM3RixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBMkI7UUFDdkQsTUFBTSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUE7UUFFN0QsT0FBTyxVQUFVLENBQUMsV0FBVyxDQUMzQix5QkFBeUIsZUFBZSxFQUFFLEVBQzFDLHVCQUFjLENBQUMsR0FBRyxFQUNsQjtZQUNFLElBQUksRUFBRTtnQkFDSixRQUFRLEVBQUUsSUFBSTthQUNmO1NBQ0YsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBNEI7UUFDL0MsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLE1BQU0sQ0FBQTtRQUNsQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUU3RCxNQUFNLElBQUksR0FBRztZQUNYLEVBQUUsRUFBRSxlQUFlO1lBQ25CLE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQXdCO2FBQy9EO1NBQ0YsQ0FBQTtRQUVELE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FDM0IscUJBQXFCLGVBQWUsRUFBRSxFQUN0Qyx1QkFBYyxDQUFDLEdBQUcsRUFDbEI7WUFDRSxJQUFJO1NBQ0wsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDeEIsTUFBa0M7UUFFbEMsTUFBTSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUE7UUFDNUYsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUE7UUFFN0QsTUFBTSxJQUFJLEdBQUc7WUFDWCxFQUFFLEVBQUUsZUFBZTtZQUNuQixNQUFNLEVBQUU7Z0JBQ04sb0JBQW9CLEVBQUUsV0FBVztnQkFDakMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO2dCQUMxQixRQUFRLEVBQUUsY0FBYztnQkFDeEIsVUFBVSxFQUFFO29CQUNWLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsY0FBYztpQkFDekI7YUFDRjtTQUNGLENBQUE7UUFFRCxPQUFPLFVBQVUsQ0FBQyxXQUFXLENBQzNCLHFCQUFxQixlQUFlLEVBQUUsRUFDdEMsdUJBQWMsQ0FBQyxHQUFHLEVBQ2xCLEVBQUUsSUFBSSxFQUFFLENBQ1QsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUNuQixNQUE2QjtRQUU3QixNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFBO1FBQzlELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1FBRTdELE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FDM0IsaUJBQWlCLEVBQ2pCLHVCQUFjLENBQUMsR0FBRyxFQUNsQjtZQUNFLEtBQUssRUFBRTtnQkFDTCxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUM1QyxpQkFBaUIsRUFBRSxlQUFlO2dCQUNsQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRTthQUN4QjtTQUNGLENBQ0YsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTNIRCx3Q0EySEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUdXJ2b0NsaWVudCB9IGZyb20gJy4uL2NsaWVudC90dXJ2b0NsaWVudCdcbmltcG9ydCB7XG4gIFR1cnZvQXBpTWV0aG9kLFxuICBUdXJ2b0FwaVJlc3VsdCxcbiAgVHVydm9GaWx0ZXJTaGlwbWVudHNSZXN1bHRJdGVtLFxuICBUdXJ2b0xvb2t1cCxcbiAgVHVydm9QYWdlZFJlc3VsdCxcbn0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJ1xuaW1wb3J0IHtcbiAgVHVydm9Bc3NvY2lhdGVUYWdzQXBpUmVzdWx0LFxuICBUdXJ2b0NhbmNlbFNoaXBtZW50QXBpUmVzdWx0LFxuICBUdXJ2b0NyZWF0ZVNoaXBtZW50QXBpUmVzdWx0LFxuICBUdXJ2b1NoaXBtZW50LFxuICBUdXJ2b1NoaXBtZW50U3RhdHVzLFxuICBUdXJ2b1VwZGF0ZVNoaXBtZW50U3RhdHVzQXBpUmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy9zaGlwbWVudCdcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB1cGxvYWRpbmcgYSBzaGlwbWVudCB0byBUdXJ2b1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFNoaXBtZW50UGFyYW1zIHtcbiAgLyoqIFRoZSBmb3JtYXR0ZWQgc2hpcG1lbnQgdG8gdXBsb2FkICovXG4gIHNoaXBtZW50OiBUdXJ2b1NoaXBtZW50XG4gIC8qKiBUaGUgTG9hZCBJRCwgc29sZWx5IGZvciBsb2dnaW5nIHB1cnBvc2VzICovXG4gIHZlaG9Mb2FkSWQ6IHN0cmluZ1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIGFzc29jaWF0aW5nIHRhZ3MgdG8gYSBzaGlwbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc29jaWF0ZVRhZ3NQYXJhbXMge1xuICAvKiogVGhlIHNoaXBtZW50IElEIHRvIGFzc29jaWF0ZSB0YWdzIHdpdGggKi9cbiAgdHVydm9TaGlwbWVudElkOiBudW1iZXJcbiAgLyoqIExpc3Qgb2YgdGFnIG5hbWVzIHRvIGFzc2lnbiAqL1xuICB0YWdzOiBzdHJpbmdbXVxufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIGNhbmNlbGxpbmcgYSBzaGlwbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbFNoaXBtZW50UGFyYW1zIHtcbiAgLyoqIFRoZSBUdXJ2byBzeXN0ZW0gU2hpcG1lbnQgSUQgdG8gY2FuY2VsICovXG4gIHR1cnZvU2hpcG1lbnRJZDogbnVtYmVyXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgc2hpcG1lbnQgc3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlU2hpcG1lbnRTdGF0dXNQYXJhbXMge1xuICAvKiogVGhlIFR1cnZvIHNoaXBtZW50IElEICovXG4gIHR1cnZvU2hpcG1lbnRJZDogbnVtYmVyXG4gIC8qKiBUaGUgVHVydm8gc3RvcCBJRCAqL1xuICB0dXJ2b1N0b3BJZDogbnVtYmVyXG4gIC8qKiBUaGUgc3RhdHVzIGNvZGUgdG8gc2V0ICovXG4gIHR1cnZvU3RhdHVzQ29kZTogVHVydm9TaGlwbWVudFN0YXR1c1xuICAvKiogVGhlIHN0YXR1cyBkYXRlIGluIElTTyBmb3JtYXQgKi9cbiAgc3RhdHVzRGF0ZTogc3RyaW5nXG4gIC8qKiBUaGUgdGltZXpvbmUgZm9yIHRoZSBzdGF0dXMgZGF0ZSAqL1xuICBzdGF0dXNUaW1lem9uZTogc3RyaW5nXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcmV0cmlldmluZyBhIHNoaXBtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U2hpcG1lbnRQYXJhbXMge1xuICAvKiogVGhlIHNoaXBtZW50IElEIHRvIHJldHJpZXZlICovXG4gIHNoaXBtZW50SWQ6IG51bWJlclxufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBzaGlwbWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJTaGlwbWVudHNQYXJhbXMge1xuICAvKiogVHVydm8gbG9jYXRpb24gSUQgdG8gZmlsdGVyIGJ5ICovXG4gIHR1cnZvTG9jYXRpb25JZDogbnVtYmVyXG4gIC8qKiBQaWNrdXAgZGF0ZSBzdGFydCBmaWx0ZXIgKElTTyBmb3JtYXQpICovXG4gIHBpY2t1cERhdGVTdGFydDogc3RyaW5nXG4gIC8qKiBPcHRpb25hbCBwYWdpbmF0aW9uIHN0YXJ0IG9mZnNldCAqL1xuICBzdGFydD86IG51bWJlclxufVxuXG4vKipcbiAqIFR1cnZvUHVibGljQXBpIHByb3ZpZGVzIGFjY2VzcyB0byBkb2N1bWVudGVkIFR1cnZvIEFQSSBlbmRwb2ludHMuXG4gKiBBbGwgc2hpcG1lbnQgbWFuYWdlbWVudCBvcGVyYXRpb25zIChjcmVhdGUsIHVwZGF0ZSwgY2FuY2VsLCBxdWVyeSkgZ28gdGhyb3VnaCB0aGlzIGNsYXNzLlxuICovXG5leHBvcnQgY2xhc3MgVHVydm9QdWJsaWNBcGkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogVHVydm9DbGllbnQpIHt9XG5cbiAgLyoqXG4gICAqIEdFVCAvdjEvc2hpcG1lbnRzL3tpZH1cbiAgICogUmV0dXJucyBzaGlwbWVudCBkZXRhaWxzLCBzdG9wcywgc3RhdHVzXG4gICAqL1xuICBhc3luYyBnZXRTaGlwbWVudChwYXJhbXM6IEdldFNoaXBtZW50UGFyYW1zKTogUHJvbWlzZTxUdXJ2b0FwaVJlc3VsdDxUdXJ2b1NoaXBtZW50Pj4ge1xuICAgIGNvbnN0IHsgc2hpcG1lbnRJZCB9ID0gcGFyYW1zXG4gICAgY29uc3QgaHR0cENsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEF1dGhlbnRpY2F0ZWRDbGllbnQoKVxuXG4gICAgcmV0dXJuIGh0dHBDbGllbnQuc2VuZFJlcXVlc3Q8VHVydm9TaGlwbWVudD4oYC9zaGlwbWVudHMvJHtzaGlwbWVudElkfWAsIFR1cnZvQXBpTWV0aG9kLkdFVCwge30pXG4gIH1cblxuICAvKipcbiAgICogUE9TVCAvdjEvc2hpcG1lbnRzXG4gICAqIFVwbG9hZCBwcm9wZXJseSBmb3JtYXR0ZWQgc2hpcG1lbnQgdG8gVHVydm9cbiAgICovXG4gIGFzeW5jIHVwbG9hZFNoaXBtZW50KHBhcmFtczogVXBsb2FkU2hpcG1lbnRQYXJhbXMpOiBQcm9taXNlPFR1cnZvQXBpUmVzdWx0PFR1cnZvQ3JlYXRlU2hpcG1lbnRBcGlSZXN1bHQ+PiB7XG4gICAgY29uc3QgeyBzaGlwbWVudCB9ID0gcGFyYW1zXG4gICAgLy8gTm90ZTogdmVob0xvYWRJZCBpcyBrZXB0IGluIHRoZSBwYXJhbXMgZm9yIGxvZ2dpbmcgcHVycG9zZXMgYnkgY29uc3VtZXJzXG4gICAgY29uc3QgaHR0cENsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEF1dGhlbnRpY2F0ZWRDbGllbnQoKVxuXG4gICAgcmV0dXJuIGh0dHBDbGllbnQuc2VuZFJlcXVlc3Q8VHVydm9DcmVhdGVTaGlwbWVudEFwaVJlc3VsdD4oJy9zaGlwbWVudHMnLCBUdXJ2b0FwaU1ldGhvZC5QT1NULCB7XG4gICAgICBib2R5OiBzaGlwbWVudCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBVVCAvdjEvdGFncy9hdHRhY2gvc2hpcG1lbnQve2lkfVxuICAgKiBBc3NvY2lhdGUgYSBsaXN0IG9mIHRhZ3Mgd2l0aCBhIHNoaXBtZW50IGJ5IElEXG4gICAqL1xuICBhc3luYyBhc3NvY2lhdGVUYWdzVG9TaGlwbWVudChwYXJhbXM6IEFzc29jaWF0ZVRhZ3NQYXJhbXMpOiBQcm9taXNlPFR1cnZvQXBpUmVzdWx0PFR1cnZvQXNzb2NpYXRlVGFnc0FwaVJlc3VsdD4+IHtcbiAgICBjb25zdCB7IHR1cnZvU2hpcG1lbnRJZCwgdGFncyB9ID0gcGFyYW1zXG4gICAgY29uc3QgaHR0cENsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEF1dGhlbnRpY2F0ZWRDbGllbnQoKVxuXG4gICAgcmV0dXJuIGh0dHBDbGllbnQuc2VuZFJlcXVlc3Q8VHVydm9Bc3NvY2lhdGVUYWdzQXBpUmVzdWx0PihcbiAgICAgIGAvdGFncy9hdHRhY2gvc2hpcG1lbnQvJHt0dXJ2b1NoaXBtZW50SWR9YCxcbiAgICAgIFR1cnZvQXBpTWV0aG9kLlBVVCxcbiAgICAgIHtcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIHRhZ05hbWVzOiB0YWdzLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBQVVQgL3YxL3NoaXBtZW50cy9zdGF0dXMve2lkfVxuICAgKiBTZXQgc2hpcG1lbnQgc3RhdHVzIHRvIENhbmNlbGxlZCBpbiBUdXJ2b1xuICAgKi9cbiAgYXN5bmMgY2FuY2VsU2hpcG1lbnQocGFyYW1zOiBDYW5jZWxTaGlwbWVudFBhcmFtcyk6IFByb21pc2U8VHVydm9BcGlSZXN1bHQ8VHVydm9DYW5jZWxTaGlwbWVudEFwaVJlc3VsdD4+IHtcbiAgICBjb25zdCB7IHR1cnZvU2hpcG1lbnRJZCB9ID0gcGFyYW1zXG4gICAgY29uc3QgaHR0cENsaWVudCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEF1dGhlbnRpY2F0ZWRDbGllbnQoKVxuXG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIGlkOiB0dXJ2b1NoaXBtZW50SWQsXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgY29kZTogeyBrZXk6ICcyMTEzJywgdmFsdWU6ICdDYW5jZWxlZCcgfSBzYXRpc2ZpZXMgVHVydm9Mb29rdXAsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiBodHRwQ2xpZW50LnNlbmRSZXF1ZXN0PFR1cnZvQ2FuY2VsU2hpcG1lbnRBcGlSZXN1bHQ+KFxuICAgICAgYC9zaGlwbWVudHMvc3RhdHVzLyR7dHVydm9TaGlwbWVudElkfWAsXG4gICAgICBUdXJ2b0FwaU1ldGhvZC5QVVQsXG4gICAgICB7XG4gICAgICAgIGJvZHksXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFBVVCAvdjEvc2hpcG1lbnRzL3N0YXR1cy97aWR9XG4gICAqIFVwZGF0ZSBzaGlwbWVudCBzdGF0dXMgYXQgYSBzcGVjaWZpYyBzdG9wXG4gICAqL1xuICBhc3luYyB1cGRhdGVTaGlwbWVudFN0YXR1cyhcbiAgICBwYXJhbXM6IFVwZGF0ZVNoaXBtZW50U3RhdHVzUGFyYW1zXG4gICk6IFByb21pc2U8VHVydm9BcGlSZXN1bHQ8VHVydm9VcGRhdGVTaGlwbWVudFN0YXR1c0FwaVJlc3VsdD4+IHtcbiAgICBjb25zdCB7IHR1cnZvU2hpcG1lbnRJZCwgdHVydm9TdG9wSWQsIHR1cnZvU3RhdHVzQ29kZSwgc3RhdHVzRGF0ZSwgc3RhdHVzVGltZXpvbmUgfSA9IHBhcmFtc1xuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRBdXRoZW50aWNhdGVkQ2xpZW50KClcblxuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBpZDogdHVydm9TaGlwbWVudElkLFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGdsb2JhbFNoaXBMb2NhdGlvbklkOiB0dXJ2b1N0b3BJZCxcbiAgICAgICAgY29kZTogdHVydm9TdGF0dXNDb2RlLmNvZGUsXG4gICAgICAgIHRpbWV6b25lOiBzdGF0dXNUaW1lem9uZSxcbiAgICAgICAgc3RhdHVzRGF0ZToge1xuICAgICAgICAgIGRhdGU6IHN0YXR1c0RhdGUsXG4gICAgICAgICAgdGltZXpvbmU6IHN0YXR1c1RpbWV6b25lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4gaHR0cENsaWVudC5zZW5kUmVxdWVzdDxUdXJ2b1VwZGF0ZVNoaXBtZW50U3RhdHVzQXBpUmVzdWx0PihcbiAgICAgIGAvc2hpcG1lbnRzL3N0YXR1cy8ke3R1cnZvU2hpcG1lbnRJZH1gLFxuICAgICAgVHVydm9BcGlNZXRob2QuUFVULFxuICAgICAgeyBib2R5IH1cbiAgICApXG4gIH1cblxuICAvKipcbiAgICogR0VUIC92MS9zaGlwbWVudHMvbGlzdFxuICAgKiBRdWVyeSBzaGlwbWVudHMgZnJvbSBUdXJ2byB3aXRoIHBhZ2luYXRpb24gc3VwcG9ydFxuICAgKi9cbiAgYXN5bmMgZmlsdGVyU2hpcG1lbnRzKFxuICAgIHBhcmFtczogRmlsdGVyU2hpcG1lbnRzUGFyYW1zXG4gICk6IFByb21pc2U8VHVydm9BcGlSZXN1bHQ8VHVydm9QYWdlZFJlc3VsdDwnc2hpcG1lbnRzJywgVHVydm9GaWx0ZXJTaGlwbWVudHNSZXN1bHRJdGVtPj4+IHtcbiAgICBjb25zdCB7IHR1cnZvTG9jYXRpb25JZCwgcGlja3VwRGF0ZVN0YXJ0LCBzdGFydCA9IDAgfSA9IHBhcmFtc1xuICAgIGNvbnN0IGh0dHBDbGllbnQgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRBdXRoZW50aWNhdGVkQ2xpZW50KClcblxuICAgIHJldHVybiBodHRwQ2xpZW50LnNlbmRSZXF1ZXN0PFR1cnZvUGFnZWRSZXN1bHQ8J3NoaXBtZW50cycsIFR1cnZvRmlsdGVyU2hpcG1lbnRzUmVzdWx0SXRlbT4+KFxuICAgICAgJy9zaGlwbWVudHMvbGlzdCcsXG4gICAgICBUdXJ2b0FwaU1ldGhvZC5HRVQsXG4gICAgICB7XG4gICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgJ2xvY2F0aW9uSWRbZXFdJzogdHVydm9Mb2NhdGlvbklkLnRvU3RyaW5nKCksXG4gICAgICAgICAgJ3BpY2t1cERhdGVbZ3RlXSc6IHBpY2t1cERhdGVTdGFydCxcbiAgICAgICAgICBzdGFydDogc3RhcnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApXG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { TurvoApiMethod, TurvoApiResult } from '../types/common';
|
|
2
|
+
import { TurvoCredentials } from '../types/config';
|
|
3
|
+
/**
|
|
4
|
+
* Clear the cached access token (useful for testing or when token expires)
|
|
5
|
+
*/
|
|
6
|
+
export declare const clearCachedAccessToken: () => void;
|
|
7
|
+
/**
|
|
8
|
+
* HTTP client interface for making authenticated Turvo API requests
|
|
9
|
+
*/
|
|
10
|
+
export interface AuthenticatedHttpClient {
|
|
11
|
+
/**
|
|
12
|
+
* Send a request to the Turvo API
|
|
13
|
+
* @param apiRoute - API route path (e.g., '/shipments')
|
|
14
|
+
* @param method - HTTP method
|
|
15
|
+
* @param params - Request parameters (body, headers, query)
|
|
16
|
+
* @returns Typed API result
|
|
17
|
+
*/
|
|
18
|
+
sendRequest<T>(apiRoute: string, method: TurvoApiMethod, params: {
|
|
19
|
+
body?: object;
|
|
20
|
+
headers?: Record<string, string>;
|
|
21
|
+
query?: Record<string, string>;
|
|
22
|
+
}): Promise<TurvoApiResult<T>>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Main client for interacting with Turvo APIs.
|
|
26
|
+
* Handles authentication, token management, and HTTP requests.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const client = new TurvoClient()
|
|
31
|
+
* const httpClient = await client.getAuthenticatedClient()
|
|
32
|
+
* const result = await httpClient.sendRequest('/shipments/123', TurvoApiMethod.GET, {})
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class TurvoClient {
|
|
36
|
+
private secretPath;
|
|
37
|
+
private credentials?;
|
|
38
|
+
private httpClient?;
|
|
39
|
+
constructor(secretPath?: string);
|
|
40
|
+
/**
|
|
41
|
+
* Get authenticated HTTP client.
|
|
42
|
+
* Handles token refresh automatically.
|
|
43
|
+
*/
|
|
44
|
+
getAuthenticatedClient(): Promise<AuthenticatedHttpClient>;
|
|
45
|
+
/**
|
|
46
|
+
* Get raw secrets (for internal API auth which uses different flow)
|
|
47
|
+
*/
|
|
48
|
+
getCredentials(): Promise<TurvoCredentials>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TurvoClient = exports.clearCachedAccessToken = void 0;
|
|
7
|
+
const lambda_params_secrets_1 = require("lambda-params-secrets");
|
|
8
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
9
|
+
const p_retry_1 = __importDefault(require("p-retry"));
|
|
10
|
+
const p_throttle_1 = __importDefault(require("p-throttle"));
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
const common_1 = require("../types/common");
|
|
13
|
+
const errors_1 = require("../types/errors");
|
|
14
|
+
let secretClient = null;
|
|
15
|
+
/**
|
|
16
|
+
* Get or create the secrets client instance
|
|
17
|
+
*/
|
|
18
|
+
const getSecretClientInstance = () => {
|
|
19
|
+
if (!secretClient) {
|
|
20
|
+
secretClient = new lambda_params_secrets_1.Client();
|
|
21
|
+
}
|
|
22
|
+
return secretClient;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Fetch Turvo API credentials from AWS Secrets Manager
|
|
26
|
+
*/
|
|
27
|
+
const getTurvoSecrets = async (secretsPath = constants_1.TURVO_SECRET_PATH) => {
|
|
28
|
+
const fetchedSecret = await getSecretClientInstance().stringSecret(secretsPath);
|
|
29
|
+
if (!fetchedSecret) {
|
|
30
|
+
throw new errors_1.NoSecretError(secretsPath);
|
|
31
|
+
}
|
|
32
|
+
return JSON.parse(fetchedSecret);
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Cached access token to avoid repeated OAuth requests
|
|
36
|
+
*/
|
|
37
|
+
let cachedAccessToken = null;
|
|
38
|
+
let tokenExpiry = null;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch an access token from Turvo using OAuth2 password grant
|
|
41
|
+
*/
|
|
42
|
+
const getTurvoAccessToken = async (credentials, apiRoutePrefix = constants_1.DEFAULT_API_ROUTE_PREFIX, allowedRetries = constants_1.DEFAULT_ALLOWED_RETRIES) => {
|
|
43
|
+
// Check if we have a valid cached token
|
|
44
|
+
if (cachedAccessToken && tokenExpiry && tokenExpiry > new Date()) {
|
|
45
|
+
return cachedAccessToken;
|
|
46
|
+
}
|
|
47
|
+
const fullUrl = `${credentials.urlBase + apiRoutePrefix}/oauth/token`;
|
|
48
|
+
return (0, p_retry_1.default)(async () => {
|
|
49
|
+
const url = new URL(fullUrl);
|
|
50
|
+
url.searchParams.set('client_id', 'publicapi');
|
|
51
|
+
url.searchParams.set('client_secret', 'secret');
|
|
52
|
+
const response = await (0, node_fetch_1.default)(url, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
'x-api-key': credentials.apiKey,
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
grant_type: 'password',
|
|
60
|
+
scope: 'read+trust+write',
|
|
61
|
+
username: credentials.username,
|
|
62
|
+
password: credentials.password,
|
|
63
|
+
type: 'business',
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
throw new errors_1.TurvoAuthError(`Failed to authenticate: ${response.status} ${response.statusText}`);
|
|
68
|
+
}
|
|
69
|
+
const data = (await response.json());
|
|
70
|
+
const { access_token, expires_in } = data;
|
|
71
|
+
if (!access_token) {
|
|
72
|
+
throw new errors_1.TurvoAuthError('No access token returned from Turvo');
|
|
73
|
+
}
|
|
74
|
+
cachedAccessToken = access_token;
|
|
75
|
+
// Set token expiry (expires_in is in seconds, default to 1 hour if not provided)
|
|
76
|
+
const expiresInMs = (expires_in || 3600) * 1000;
|
|
77
|
+
tokenExpiry = new Date(Date.now() + expiresInMs - 60000); // Refresh 1 minute early
|
|
78
|
+
return access_token;
|
|
79
|
+
}, { retries: allowedRetries });
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Clear the cached access token (useful for testing or when token expires)
|
|
83
|
+
*/
|
|
84
|
+
const clearCachedAccessToken = () => {
|
|
85
|
+
cachedAccessToken = null;
|
|
86
|
+
tokenExpiry = null;
|
|
87
|
+
};
|
|
88
|
+
exports.clearCachedAccessToken = clearCachedAccessToken;
|
|
89
|
+
/**
|
|
90
|
+
* Main client for interacting with Turvo APIs.
|
|
91
|
+
* Handles authentication, token management, and HTTP requests.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const client = new TurvoClient()
|
|
96
|
+
* const httpClient = await client.getAuthenticatedClient()
|
|
97
|
+
* const result = await httpClient.sendRequest('/shipments/123', TurvoApiMethod.GET, {})
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
class TurvoClient {
|
|
101
|
+
secretPath;
|
|
102
|
+
credentials;
|
|
103
|
+
httpClient;
|
|
104
|
+
constructor(secretPath = constants_1.TURVO_SECRET_PATH) {
|
|
105
|
+
this.secretPath = secretPath;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get authenticated HTTP client.
|
|
109
|
+
* Handles token refresh automatically.
|
|
110
|
+
*/
|
|
111
|
+
async getAuthenticatedClient() {
|
|
112
|
+
if (this.httpClient) {
|
|
113
|
+
return this.httpClient;
|
|
114
|
+
}
|
|
115
|
+
// Fetch credentials if not already loaded
|
|
116
|
+
if (!this.credentials) {
|
|
117
|
+
this.credentials = await getTurvoSecrets(this.secretPath);
|
|
118
|
+
}
|
|
119
|
+
// Create HTTP client with rate limiting and retries
|
|
120
|
+
const apiRoutePrefix = constants_1.DEFAULT_API_ROUTE_PREFIX;
|
|
121
|
+
const allowedRetries = constants_1.DEFAULT_ALLOWED_RETRIES;
|
|
122
|
+
const rateLimitRequestsPerSecond = constants_1.DEFAULT_RATE_LIMIT_RPS;
|
|
123
|
+
// Create throttled version of the send function
|
|
124
|
+
const throttle = (0, p_throttle_1.default)({
|
|
125
|
+
limit: rateLimitRequestsPerSecond,
|
|
126
|
+
interval: 1000,
|
|
127
|
+
});
|
|
128
|
+
/**
|
|
129
|
+
* Internal function to send API request (with retry logic)
|
|
130
|
+
*/
|
|
131
|
+
const sendToTurvoAPI = async (apiRoute, method, params) => {
|
|
132
|
+
const accessToken = await getTurvoAccessToken(this.credentials, apiRoutePrefix, allowedRetries);
|
|
133
|
+
const { body, headers, query } = params;
|
|
134
|
+
let fullRoute = `${this.credentials.urlBase + apiRoutePrefix + apiRoute}`;
|
|
135
|
+
if (query && Object.keys(query).length > 0) {
|
|
136
|
+
fullRoute = `${fullRoute}?${new URLSearchParams(query)}`;
|
|
137
|
+
}
|
|
138
|
+
return (0, p_retry_1.default)(async () => {
|
|
139
|
+
return (0, node_fetch_1.default)(fullRoute, {
|
|
140
|
+
method,
|
|
141
|
+
headers: {
|
|
142
|
+
Authorization: `Bearer ${accessToken}`,
|
|
143
|
+
'Content-Type': 'application/json',
|
|
144
|
+
'x-api-key': this.credentials.apiKey,
|
|
145
|
+
...headers,
|
|
146
|
+
},
|
|
147
|
+
...(body && { body: JSON.stringify(body) }),
|
|
148
|
+
}).then(async (res) => {
|
|
149
|
+
const result = await res.json();
|
|
150
|
+
// Handle rate limiting (429)
|
|
151
|
+
if (res.status === 429) {
|
|
152
|
+
throw new common_1.TurvoApiError(res.status.toString(), result.message || 'Rate limited');
|
|
153
|
+
}
|
|
154
|
+
// Check for API-level errors
|
|
155
|
+
if (result.Status !== common_1.TurvoApiResponseStatus.SUCCESS) {
|
|
156
|
+
throw new common_1.TurvoApiError(result.details?.errorCode || 'UNKNOWN', result.details?.errorMessage || 'API error');
|
|
157
|
+
}
|
|
158
|
+
return result;
|
|
159
|
+
});
|
|
160
|
+
}, { retries: allowedRetries });
|
|
161
|
+
};
|
|
162
|
+
// Throttle the send function
|
|
163
|
+
const throttledSend = throttle(sendToTurvoAPI);
|
|
164
|
+
this.httpClient = {
|
|
165
|
+
sendRequest: throttledSend,
|
|
166
|
+
};
|
|
167
|
+
return this.httpClient;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get raw secrets (for internal API auth which uses different flow)
|
|
171
|
+
*/
|
|
172
|
+
async getCredentials() {
|
|
173
|
+
if (!this.credentials) {
|
|
174
|
+
this.credentials = await getTurvoSecrets(this.secretPath);
|
|
175
|
+
}
|
|
176
|
+
return this.credentials;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.TurvoClient = TurvoClient;
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVydm9DbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50L3R1cnZvQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlFQUE4QztBQUM5Qyw0REFBOEI7QUFDOUIsc0RBQTRCO0FBQzVCLDREQUFrQztBQUVsQyw0Q0FLcUI7QUFDckIsNENBQXVHO0FBRXZHLDRDQUErRDtBQUUvRCxJQUFJLFlBQVksR0FBa0IsSUFBSSxDQUFBO0FBRXRDOztHQUVHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxHQUFXLEVBQUU7SUFDM0MsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLFlBQVksR0FBRyxJQUFJLDhCQUFNLEVBQUUsQ0FBQTtJQUM3QixDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUE7QUFDckIsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxLQUFLLEVBQUUsY0FBc0IsNkJBQWlCLEVBQTZCLEVBQUU7SUFDbkcsTUFBTSxhQUFhLEdBQUcsTUFBTSx1QkFBdUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUUvRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLHNCQUFhLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQXFCLENBQUE7QUFDdEQsQ0FBQyxDQUFBO0FBRUQ7O0dBRUc7QUFDSCxJQUFJLGlCQUFpQixHQUFrQixJQUFJLENBQUE7QUFDM0MsSUFBSSxXQUFXLEdBQWdCLElBQUksQ0FBQTtBQUVuQzs7R0FFRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxFQUMvQixXQUE2QixFQUM3QixpQkFBeUIsb0NBQXdCLEVBQ2pELGlCQUF5QixtQ0FBdUIsRUFDL0IsRUFBRTtJQUNuQix3Q0FBd0M7SUFDeEMsSUFBSSxpQkFBaUIs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QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDekIsQ0FBQztDQUNGO0FBcEdELGtDQW9HQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaWVudCB9IGZyb20gJ2xhbWJkYS1wYXJhbXMtc2VjcmV0cydcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJ1xuaW1wb3J0IHBSZXRyeSBmcm9tICdwLXJldHJ5J1xuaW1wb3J0IHBUaHJvdHRsZSBmcm9tICdwLXRocm90dGxlJ1xuXG5pbXBvcnQge1xuICBERUZBVUxUX0FMTE9XRURfUkVUUklFUyxcbiAgREVGQVVMVF9BUElfUk9VVEVfUFJFRklYLFxuICBERUZBVUxUX1JBVEVfTElNSVRfUlBTLFxuICBUVVJWT19TRUNSRVRfUEFUSCxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgVHVydm9BcGlFcnJvciwgVHVydm9BcGlNZXRob2QsIFR1cnZvQXBpUmVzcG9uc2VTdGF0dXMsIFR1cnZvQXBpUmVzdWx0IH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJ1xuaW1wb3J0IHsgVHVydm9DcmVkZW50aWFscyB9IGZyb20gJy4uL3R5cGVzL2NvbmZpZydcbmltcG9ydCB7IE5vU2VjcmV0RXJyb3IsIFR1cnZvQXV0aEVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3JzJ1xuXG5sZXQgc2VjcmV0Q2xpZW50OiBDbGllbnQgfCBudWxsID0gbnVsbFxuXG4vKipcbiAqIEdldCBvciBjcmVhdGUgdGhlIHNlY3JldHMgY2xpZW50IGluc3RhbmNlXG4gKi9cbmNvbnN0IGdldFNlY3JldENsaWVudEluc3RhbmNlID0gKCk6IENsaWVudCA9PiB7XG4gIGlmICghc2VjcmV0Q2xpZW50KSB7XG4gICAgc2VjcmV0Q2xpZW50ID0gbmV3IENsaWVudCgpXG4gIH1cbiAgcmV0dXJuIHNlY3JldENsaWVudFxufVxuXG4vKipcbiAqIEZldGNoIFR1cnZvIEFQSSBjcmVkZW50aWFscyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXJcbiAqL1xuY29uc3QgZ2V0VHVydm9TZWNyZXRzID0gYXN5bmMgKHNlY3JldHNQYXRoOiBzdHJpbmcgPSBUVVJWT19TRUNSRVRfUEFUSCk6IFByb21pc2U8VHVydm9DcmVkZW50aWFscz4gPT4ge1xuICBjb25zdCBmZXRjaGVkU2VjcmV0ID0gYXdhaXQgZ2V0U2VjcmV0Q2xpZW50SW5zdGFuY2UoKS5zdHJpbmdTZWNyZXQoc2VjcmV0c1BhdGgpXG5cbiAgaWYgKCFmZXRjaGVkU2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IE5vU2VjcmV0RXJyb3Ioc2VjcmV0c1BhdGgpXG4gIH1cblxuICByZXR1cm4gSlNPTi5wYXJzZShmZXRjaGVkU2VjcmV0KSBhcyBUdXJ2b0NyZWRlbnRpYWxzXG59XG5cbi8qKlxuICogQ2FjaGVkIGFjY2VzcyB0b2tlbiB0byBhdm9pZCByZXBlYXRlZCBPQXV0aCByZXF1ZXN0c1xuICovXG5sZXQgY2FjaGVkQWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsXG5sZXQgdG9rZW5FeHBpcnk6IERhdGUgfCBudWxsID0gbnVsbFxuXG4vKipcbiAqIEZldGNoIGFuIGFjY2VzcyB0b2tlbiBmcm9tIFR1cnZvIHVzaW5nIE9BdXRoMiBwYXNzd29yZCBncmFudFxuICovXG5jb25zdCBnZXRUdXJ2b0FjY2Vzc1Rva2VuID0gYXN5bmMgKFxuICBjcmVkZW50aWFsczogVHVydm9DcmVkZW50aWFscyxcbiAgYXBpUm91dGVQcmVmaXg6IHN0cmluZyA9IERFRkFVTFRfQVBJX1JPVVRFX1BSRUZJWCxcbiAgYWxsb3dlZFJldHJpZXM6IG51bWJlciA9IERFRkFVTFRfQUxMT1dFRF9SRVRSSUVTXG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgY2FjaGVkIHRva2VuXG4gIGlmIChjYWNoZWRBY2Nlc3NUb2tlbiAmJiB0b2tlbkV4cGlyeSAmJiB0b2tlbkV4cGlyeSA+IG5ldyBEYXRlKCkpIHtcbiAgICByZXR1cm4gY2FjaGVkQWNjZXNzVG9rZW5cbiAgfVxuXG4gIGNvbnN0IGZ1bGxVcmwgPSBgJHtjcmVkZW50aWFscy51cmxCYXNlICsgYXBpUm91dGVQcmVmaXh9L29hdXRoL3Rva2VuYFxuXG4gIHJldHVybiBwUmV0cnkoXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChmdWxsVXJsKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsICdwdWJsaWNhcGknKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NsaWVudF9zZWNyZXQnLCAnc2VjcmV0JylcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICd4LWFwaS1rZXknOiBjcmVkZW50aWFscy5hcGlLZXksXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBncmFudF90eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgIHNjb3BlOiAncmVhZCt0cnVzdCt3cml0ZScsXG4gICAgICAgICAgdXNlcm5hbWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lLFxuICAgICAgICAgIHBhc3N3b3JkOiBjcmVkZW50aWFscy5wYXNzd29yZCxcbiAgICAgICAgICB0eXBlOiAnYnVzaW5lc3MnLFxuICAgICAgICB9KSxcbiAgICAgIH0pXG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFR1cnZvQXV0aEVycm9yKGBGYWlsZWQgdG8gYXV0aGVudGljYXRlOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGFjY2Vzc190b2tlbjogc3RyaW5nOyBleHBpcmVzX2luPzogbnVtYmVyIH1cbiAgICAgIGNvbnN0IHsgYWNjZXNzX3Rva2VuLCBleHBpcmVzX2luIH0gPSBkYXRhXG5cbiAgICAgIGlmICghYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBUdXJ2b0F1dGhFcnJvcignTm8gYWNjZXNzIHRva2VuIHJldHVybmVkIGZyb20gVHVydm8nKVxuICAgICAgfVxuXG4gICAgICBjYWNoZWRBY2Nlc3NUb2tlbiA9IGFjY2Vzc190b2tlblxuXG4gICAgICAvLyBTZXQgdG9rZW4gZXhwaXJ5IChleHBpcmVzX2luIGlzIGluIHNlY29uZHMsIGRlZmF1bHQgdG8gMSBob3VyIGlmIG5vdCBwcm92aWRlZClcbiAgICAgIGNvbnN0IGV4cGlyZXNJbk1zID0gKGV4cGlyZXNfaW4gfHwgMzYwMCkgKiAxMDAwXG4gICAgICB0b2tlbkV4cGlyeSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBleHBpcmVzSW5NcyAtIDYwMDAwKSAvLyBSZWZyZXNoIDEgbWludXRlIGVhcmx5XG5cbiAgICAgIHJldHVybiBhY2Nlc3NfdG9rZW5cbiAgICB9LFxuICAgIHsgcmV0cmllczogYWxsb3dlZFJldHJpZXMgfVxuICApXG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIGNhY2hlZCBhY2Nlc3MgdG9rZW4gKHVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHRva2VuIGV4cGlyZXMpXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhckNhY2hlZEFjY2Vzc1Rva2VuID0gKCk6IHZvaWQgPT4ge1xuICBjYWNoZWRBY2Nlc3NUb2tlbiA9IG51bGxcbiAgdG9rZW5FeHBpcnkgPSBudWxsXG59XG5cbi8qKlxuICogSFRUUCBjbGllbnQgaW50ZXJmYWNlIGZvciBtYWtpbmcgYXV0aGVudGljYXRlZCBUdXJ2byBBUEkgcmVxdWVzdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoZW50aWNhdGVkSHR0cENsaWVudCB7XG4gIC8qKlxuICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgVHVydm8gQVBJXG4gICAqIEBwYXJhbSBhcGlSb3V0ZSAtIEFQSSByb3V0ZSBwYXRoIChlLmcuLCAnL3NoaXBtZW50cycpXG4gICAqIEBwYXJhbSBtZXRob2QgLSBIVFRQIG1ldGhvZFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUmVxdWVzdCBwYXJhbWV0ZXJzIChib2R5LCBoZWFkZXJzLCBxdWVyeSlcbiAgICogQHJldHVybnMgVHlwZWQgQVBJIHJlc3VsdFxuICAgKi9cbiAgc2VuZFJlcXVlc3Q8VD4oXG4gICAgYXBpUm91dGU6IHN0cmluZyxcbiAgICBtZXRob2Q6IFR1cnZvQXBpTWV0aG9kLFxuICAgIHBhcmFtczogeyBib2R5Pzogb2JqZWN0OyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cbiAgKTogUHJvbWlzZTxUdXJ2b0FwaVJlc3VsdDxUPj5cbn1cblxuLyoqXG4gKiBNYWluIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBUdXJ2byBBUElzLlxuICogSGFuZGxlcyBhdXRoZW50aWNhdGlvbiwgdG9rZW4gbWFuYWdlbWVudCwgYW5kIEhUVFAgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBUdXJ2b0NsaWVudCgpXG4gKiBjb25zdCBodHRwQ2xpZW50ID0gYXdhaXQgY2xpZW50LmdldEF1dGhlbnRpY2F0ZWRDbGllbnQoKVxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaHR0cENsaWVudC5zZW5kUmVxdWVzdCgnL3NoaXBtZW50cy8xMjMnLCBUdXJ2b0FwaU1ldGhvZC5HRVQsIHt9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXJ2b0NsaWVudCB7XG4gIHByaXZhdGUgY3JlZGVudGlhbHM/OiBUdXJ2b0NyZWRlbnRpYWxzXG4gIHByaXZhdGUgaHR0cENsaWVudD86IEF1dGhlbnRpY2F0ZWRIdHRwQ2xpZW50XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZWNyZXRQYXRoOiBzdHJpbmcgPSBUVVJWT19TRUNSRVRfUEFUSCkge31cblxuICAvKipcbiAgICogR2V0IGF1dGhlbnRpY2F0ZWQgSFRUUCBjbGllbnQuXG4gICAqIEhhbmRsZXMgdG9rZW4gcmVmcmVzaCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgYXN5bmMgZ2V0QXV0aGVudGljYXRlZENsaWVudCgpOiBQcm9taXNlPEF1dGhlbnRpY2F0ZWRIdHRwQ2xpZW50PiB7XG4gICAgaWYgKHRoaXMuaHR0cENsaWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgIH1cblxuICAgIC8vIEZldGNoIGNyZWRlbnRpYWxzIGlmIG5vdCBhbHJlYWR5IGxvYWRlZFxuICAgIGlmICghdGhpcy5jcmVkZW50aWFscykge1xuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGF3YWl0IGdldFR1cnZvU2VjcmV0cyh0aGlzLnNlY3JldFBhdGgpXG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIEhUVFAgY2xpZW50IHdpdGggcmF0ZSBsaW1pdGluZyBhbmQgcmV0cmllc1xuICAgIGNvbnN0IGFwaVJvdXRlUHJlZml4ID0gREVGQVVMVF9BUElfUk9VVEVfUFJFRklYXG4gICAgY29uc3QgYWxsb3dlZFJldHJpZXMgPSBERUZBVUxUX0FMTE9XRURfUkVUUklFU1xuICAgIGNvbnN0IHJhdGVMaW1pdFJlcXVlc3RzUGVyU2Vjb25kID0gREVGQVVMVF9SQVRFX0xJTUlUX1JQU1xuXG4gICAgLy8gQ3JlYXRlIHRocm90dGxlZCB2ZXJzaW9uIG9mIHRoZSBzZW5kIGZ1bmN0aW9uXG4gICAgY29uc3QgdGhyb3R0bGUgPSBwVGhyb3R0bGUoe1xuICAgICAgbGltaXQ6IHJhdGVMaW1pdFJlcXVlc3RzUGVyU2Vjb25kLFxuICAgICAgaW50ZXJ2YWw6IDEwMDAsXG4gICAgfSlcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHNlbmQgQVBJIHJlcXVlc3QgKHdpdGggcmV0cnkgbG9naWMpXG4gICAgICovXG4gICAgY29uc3Qgc2VuZFRvVHVydm9BUEkgPSBhc3luYyA8VD4oXG4gICAgICBhcGlSb3V0ZTogc3RyaW5nLFxuICAgICAgbWV0aG9kOiBUdXJ2b0FwaU1ldGhvZCxcbiAgICAgIHBhcmFtczogeyBib2R5Pzogb2JqZWN0OyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1cbiAgICApOiBQcm9taXNlPFR1cnZvQXBpUmVzdWx0PFQ+PiA9PiB7XG4gICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGdldFR1cnZvQWNjZXNzVG9rZW4odGhpcy5jcmVkZW50aWFscyEsIGFwaVJvdXRlUHJlZml4LCBhbGxvd2VkUmV0cmllcylcbiAgICAgIGNvbnN0IHsgYm9keSwgaGVhZGVycywgcXVlcnkgfSA9IHBhcmFtc1xuICAgICAgbGV0IGZ1bGxSb3V0ZSA9IGAke3RoaXMuY3JlZGVudGlhbHMhLnVybEJhc2UgKyBhcGlSb3V0ZVByZWZpeCArIGFwaVJvdXRlfWBcblxuICAgICAgaWYgKHF1ZXJ5ICYmIE9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZ1bGxSb3V0ZSA9IGAke2Z1bGxSb3V0ZX0/JHtuZXcgVVJMU2VhcmNoUGFyYW1zKHF1ZXJ5KX1gXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwUmV0cnkoXG4gICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmV0Y2goZnVsbFJvdXRlLCB7XG4gICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAneC1hcGkta2V5JzogdGhpcy5jcmVkZW50aWFscyEuYXBpS2V5LFxuICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihib2R5ICYmIHsgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSkgfSksXG4gICAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdGluZyAoNDI5KVxuICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQyOSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHVydm9BcGlFcnJvcihyZXMuc3RhdHVzLnRvU3RyaW5nKCksIHJlc3VsdC5tZXNzYWdlIHx8ICdSYXRlIGxpbWl0ZWQnKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgQVBJLWxldmVsIGVycm9yc1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5TdGF0dXMgIT09IFR1cnZvQXBpUmVzcG9uc2VTdGF0dXMuU1VDQ0VTUykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVHVydm9BcGlFcnJvcihcbiAgICAgICAgICAgICAgICByZXN1bHQuZGV0YWlscz8uZXJyb3JDb2RlIHx8ICdVTktOT1dOJyxcbiAgICAgICAgICAgICAgICByZXN1bHQuZGV0YWlscz8uZXJyb3JNZXNzYWdlIHx8ICdBUEkgZXJyb3InXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIHsgcmV0cmllczogYWxsb3dlZFJldHJpZXMgfVxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFRocm90dGxlIHRoZSBzZW5kIGZ1bmN0aW9uXG4gICAgY29uc3QgdGhyb3R0bGVkU2VuZCA9IHRocm90dGxlKHNlbmRUb1R1cnZvQVBJKVxuXG4gICAgdGhpcy5odHRwQ2xpZW50ID0ge1xuICAgICAgc2VuZFJlcXVlc3Q6IHRocm90dGxlZFNlbmQsXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByYXcgc2VjcmV0cyAoZm9yIGludGVybmFsIEFQSSBhdXRoIHdoaWNoIHVzZXMgZGlmZmVyZW50IGZsb3cpXG4gICAqL1xuICBhc3luYyBnZXRDcmVkZW50aWFscygpOiBQcm9taXNlPFR1cnZvQ3JlZGVudGlhbHM+IHtcbiAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHMpIHtcbiAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCBnZXRUdXJ2b1NlY3JldHModGhpcy5zZWNyZXRQYXRoKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default secret path for Turvo credentials in AWS Secrets Manager.
|
|
3
|
+
* Export this so consumers can grant IAM permissions.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* import { TURVO_SECRET_PATH } from '@veho/turvo-sdk'
|
|
8
|
+
*
|
|
9
|
+
* // In CDK stack
|
|
10
|
+
* myLambda.addToRolePolicy(new iam.PolicyStatement({
|
|
11
|
+
* actions: ['secretsmanager:GetSecretValue'],
|
|
12
|
+
* resources: [`arn:aws:secretsmanager:*:*:secret:${TURVO_SECRET_PATH}*`],
|
|
13
|
+
* }))
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare const TURVO_SECRET_PATH = "/turvo/api";
|
|
17
|
+
/**
|
|
18
|
+
* Default API route prefix for Turvo endpoints.
|
|
19
|
+
* Currently, Turvo uses a common prefix of "/v1" for all documented API routes.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_API_ROUTE_PREFIX = "/v1";
|
|
22
|
+
/**
|
|
23
|
+
* Default number of retry attempts for failed requests.
|
|
24
|
+
*/
|
|
25
|
+
export declare const DEFAULT_ALLOWED_RETRIES = 2;
|
|
26
|
+
/**
|
|
27
|
+
* Default rate limit (requests per second) for Turvo API calls.
|
|
28
|
+
*/
|
|
29
|
+
export declare const DEFAULT_RATE_LIMIT_RPS = 1;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RATE_LIMIT_RPS = exports.DEFAULT_ALLOWED_RETRIES = exports.DEFAULT_API_ROUTE_PREFIX = exports.TURVO_SECRET_PATH = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Default secret path for Turvo credentials in AWS Secrets Manager.
|
|
6
|
+
* Export this so consumers can grant IAM permissions.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { TURVO_SECRET_PATH } from '@veho/turvo-sdk'
|
|
11
|
+
*
|
|
12
|
+
* // In CDK stack
|
|
13
|
+
* myLambda.addToRolePolicy(new iam.PolicyStatement({
|
|
14
|
+
* actions: ['secretsmanager:GetSecretValue'],
|
|
15
|
+
* resources: [`arn:aws:secretsmanager:*:*:secret:${TURVO_SECRET_PATH}*`],
|
|
16
|
+
* }))
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
exports.TURVO_SECRET_PATH = '/turvo/api';
|
|
20
|
+
/**
|
|
21
|
+
* Default API route prefix for Turvo endpoints.
|
|
22
|
+
* Currently, Turvo uses a common prefix of "/v1" for all documented API routes.
|
|
23
|
+
*/
|
|
24
|
+
exports.DEFAULT_API_ROUTE_PREFIX = '/v1';
|
|
25
|
+
/**
|
|
26
|
+
* Default number of retry attempts for failed requests.
|
|
27
|
+
*/
|
|
28
|
+
exports.DEFAULT_ALLOWED_RETRIES = 2;
|
|
29
|
+
/**
|
|
30
|
+
* Default rate limit (requests per second) for Turvo API calls.
|
|
31
|
+
*/
|
|
32
|
+
exports.DEFAULT_RATE_LIMIT_RPS = 1;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNVLFFBQUEsaUJBQWlCLEdBQUcsWUFBWSxDQUFBO0FBRTdDOzs7R0FHRztBQUNVLFFBQUEsd0JBQXdCLEdBQUcsS0FBSyxDQUFBO0FBRTdDOztHQUVHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBRyxDQUFDLENBQUE7QUFFeEM7O0dBRUc7QUFDVSxRQUFBLHNCQUFzQixHQUFHLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdCBzZWNyZXQgcGF0aCBmb3IgVHVydm8gY3JlZGVudGlhbHMgaW4gQVdTIFNlY3JldHMgTWFuYWdlci5cbiAqIEV4cG9ydCB0aGlzIHNvIGNvbnN1bWVycyBjYW4gZ3JhbnQgSUFNIHBlcm1pc3Npb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBUVVJWT19TRUNSRVRfUEFUSCB9IGZyb20gJ0B2ZWhvL3R1cnZvLXNkaydcbiAqXG4gKiAvLyBJbiBDREsgc3RhY2tcbiAqIG15TGFtYmRhLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gKiAgIGFjdGlvbnM6IFsnc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUnXSxcbiAqICAgcmVzb3VyY2VzOiBbYGFybjphd3M6c2VjcmV0c21hbmFnZXI6KjoqOnNlY3JldDoke1RVUlZPX1NFQ1JFVF9QQVRIfSpgXSxcbiAqIH0pKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBUVVJWT19TRUNSRVRfUEFUSCA9ICcvdHVydm8vYXBpJ1xuXG4vKipcbiAqIERlZmF1bHQgQVBJIHJvdXRlIHByZWZpeCBmb3IgVHVydm8gZW5kcG9pbnRzLlxuICogQ3VycmVudGx5LCBUdXJ2byB1c2VzIGEgY29tbW9uIHByZWZpeCBvZiBcIi92MVwiIGZvciBhbGwgZG9jdW1lbnRlZCBBUEkgcm91dGVzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUElfUk9VVEVfUFJFRklYID0gJy92MSdcblxuLyoqXG4gKiBEZWZhdWx0IG51bWJlciBvZiByZXRyeSBhdHRlbXB0cyBmb3IgZmFpbGVkIHJlcXVlc3RzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTExPV0VEX1JFVFJJRVMgPSAyXG5cbi8qKlxuICogRGVmYXVsdCByYXRlIGxpbWl0IChyZXF1ZXN0cyBwZXIgc2Vjb25kKSBmb3IgVHVydm8gQVBJIGNhbGxzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SQVRFX0xJTUlUX1JQUyA9IDFcbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { getShipmentTracking } from './shipmentTracking';
|
|
2
|
+
export { TurvoInternalApi } from './api/turvoInternalApi';
|
|
3
|
+
export { TurvoPublicApi } from './api/turvoPublicApi';
|
|
4
|
+
export { clearCachedAccessToken, TurvoClient } from './client/turvoClient';
|
|
5
|
+
export * from './types';
|
|
6
|
+
export { DEFAULT_ALLOWED_RETRIES, DEFAULT_API_ROUTE_PREFIX, DEFAULT_RATE_LIMIT_RPS, TURVO_SECRET_PATH, } from './constants';
|
package/lib/cjs/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.TURVO_SECRET_PATH = exports.DEFAULT_RATE_LIMIT_RPS = exports.DEFAULT_API_ROUTE_PREFIX = exports.DEFAULT_ALLOWED_RETRIES = exports.TurvoClient = exports.clearCachedAccessToken = exports.TurvoPublicApi = exports.TurvoInternalApi = exports.getShipmentTracking = void 0;
|
|
18
|
+
// Main tracking function
|
|
19
|
+
var shipmentTracking_1 = require("./shipmentTracking");
|
|
20
|
+
Object.defineProperty(exports, "getShipmentTracking", { enumerable: true, get: function () { return shipmentTracking_1.getShipmentTracking; } });
|
|
21
|
+
// Client classes (for advanced usage)
|
|
22
|
+
var turvoInternalApi_1 = require("./api/turvoInternalApi");
|
|
23
|
+
Object.defineProperty(exports, "TurvoInternalApi", { enumerable: true, get: function () { return turvoInternalApi_1.TurvoInternalApi; } });
|
|
24
|
+
var turvoPublicApi_1 = require("./api/turvoPublicApi");
|
|
25
|
+
Object.defineProperty(exports, "TurvoPublicApi", { enumerable: true, get: function () { return turvoPublicApi_1.TurvoPublicApi; } });
|
|
26
|
+
var turvoClient_1 = require("./client/turvoClient");
|
|
27
|
+
Object.defineProperty(exports, "clearCachedAccessToken", { enumerable: true, get: function () { return turvoClient_1.clearCachedAccessToken; } });
|
|
28
|
+
Object.defineProperty(exports, "TurvoClient", { enumerable: true, get: function () { return turvoClient_1.TurvoClient; } });
|
|
29
|
+
// All types
|
|
30
|
+
__exportStar(require("./types"), exports);
|
|
31
|
+
// Constants
|
|
32
|
+
var constants_1 = require("./constants");
|
|
33
|
+
Object.defineProperty(exports, "DEFAULT_ALLOWED_RETRIES", { enumerable: true, get: function () { return constants_1.DEFAULT_ALLOWED_RETRIES; } });
|
|
34
|
+
Object.defineProperty(exports, "DEFAULT_API_ROUTE_PREFIX", { enumerable: true, get: function () { return constants_1.DEFAULT_API_ROUTE_PREFIX; } });
|
|
35
|
+
Object.defineProperty(exports, "DEFAULT_RATE_LIMIT_RPS", { enumerable: true, get: function () { return constants_1.DEFAULT_RATE_LIMIT_RPS; } });
|
|
36
|
+
Object.defineProperty(exports, "TURVO_SECRET_PATH", { enumerable: true, get: function () { return constants_1.TURVO_SECRET_PATH; } });
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsdURBQXdEO0FBQS9DLHVIQUFBLG1CQUFtQixPQUFBO0FBRTVCLHNDQUFzQztBQUN0QywyREFBeUQ7QUFBaEQsb0hBQUEsZ0JBQWdCLE9BQUE7QUFDekIsdURBQXFEO0FBQTVDLGdIQUFBLGNBQWMsT0FBQTtBQUN2QixvREFBMEU7QUFBakUscUhBQUEsc0JBQXNCLE9BQUE7QUFBRSwwR0FBQSxXQUFXLE9BQUE7QUFFNUMsWUFBWTtBQUNaLDBDQUF1QjtBQUV2QixZQUFZO0FBQ1oseUNBS29CO0FBSmxCLG9IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLHFIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLDhHQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTWFpbiB0cmFja2luZyBmdW5jdGlvblxuZXhwb3J0IHsgZ2V0U2hpcG1lbnRUcmFja2luZyB9IGZyb20gJy4vc2hpcG1lbnRUcmFja2luZydcblxuLy8gQ2xpZW50IGNsYXNzZXMgKGZvciBhZHZhbmNlZCB1c2FnZSlcbmV4cG9ydCB7IFR1cnZvSW50ZXJuYWxBcGkgfSBmcm9tICcuL2FwaS90dXJ2b0ludGVybmFsQXBpJ1xuZXhwb3J0IHsgVHVydm9QdWJsaWNBcGkgfSBmcm9tICcuL2FwaS90dXJ2b1B1YmxpY0FwaSdcbmV4cG9ydCB7IGNsZWFyQ2FjaGVkQWNjZXNzVG9rZW4sIFR1cnZvQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQvdHVydm9DbGllbnQnXG5cbi8vIEFsbCB0eXBlc1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcydcblxuLy8gQ29uc3RhbnRzXG5leHBvcnQge1xuICBERUZBVUxUX0FMTE9XRURfUkVUUklFUyxcbiAgREVGQVVMVF9BUElfUk9VVEVfUFJFRklYLFxuICBERUZBVUxUX1JBVEVfTElNSVRfUlBTLFxuICBUVVJWT19TRUNSRVRfUEFUSCxcbn0gZnJvbSAnLi9jb25zdGFudHMnXG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { GetTrackingOptions, ShipmentTracking } from '../types/tracking';
|
|
2
|
+
/**
|
|
3
|
+
* Main function to fetch shipment tracking data from Turvo.
|
|
4
|
+
* Combines public API (shipment details) with internal API (GPS tracking).
|
|
5
|
+
*
|
|
6
|
+
* @param shipmentId - The Turvo shipment ID to track
|
|
7
|
+
* @param options - Optional configuration for tracking request
|
|
8
|
+
* @returns Complete shipment tracking information
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { getShipmentTracking } from '@veho/turvo-sdk'
|
|
13
|
+
*
|
|
14
|
+
* const tracking = await getShipmentTracking('12345', {
|
|
15
|
+
* includeGps: true,
|
|
16
|
+
* secretPath: '/turvo/api'
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* console.log(tracking.status, tracking.etaUtc, tracking.isLate)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function getShipmentTracking(shipmentId: string, options?: GetTrackingOptions): Promise<ShipmentTracking>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getShipmentTracking = getShipmentTracking;
|
|
4
|
+
const turvoInternalApi_1 = require("../api/turvoInternalApi");
|
|
5
|
+
const turvoPublicApi_1 = require("../api/turvoPublicApi");
|
|
6
|
+
const turvoClient_1 = require("../client/turvoClient");
|
|
7
|
+
const trackingService_1 = require("./trackingService");
|
|
8
|
+
/**
|
|
9
|
+
* Main function to fetch shipment tracking data from Turvo.
|
|
10
|
+
* Combines public API (shipment details) with internal API (GPS tracking).
|
|
11
|
+
*
|
|
12
|
+
* @param shipmentId - The Turvo shipment ID to track
|
|
13
|
+
* @param options - Optional configuration for tracking request
|
|
14
|
+
* @returns Complete shipment tracking information
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { getShipmentTracking } from '@veho/turvo-sdk'
|
|
19
|
+
*
|
|
20
|
+
* const tracking = await getShipmentTracking('12345', {
|
|
21
|
+
* includeGps: true,
|
|
22
|
+
* secretPath: '/turvo/api'
|
|
23
|
+
* })
|
|
24
|
+
*
|
|
25
|
+
* console.log(tracking.status, tracking.etaUtc, tracking.isLate)
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
async function getShipmentTracking(shipmentId, options = {}) {
|
|
29
|
+
// Create client with optional custom secret path
|
|
30
|
+
const client = new turvoClient_1.TurvoClient(options.secretPath);
|
|
31
|
+
// Create API instances
|
|
32
|
+
const publicApi = new turvoPublicApi_1.TurvoPublicApi(client);
|
|
33
|
+
const internalApi = new turvoInternalApi_1.TurvoInternalApi(client);
|
|
34
|
+
// Create tracking service
|
|
35
|
+
const trackingService = new trackingService_1.TrackingService(publicApi, internalApi);
|
|
36
|
+
// Fetch and return tracking data
|
|
37
|
+
return trackingService.getTracking(shipmentId, options);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2hpcG1lbnRUcmFja2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTBCQSxrREFnQkM7QUExQ0QsOERBQTBEO0FBQzFELDBEQUFzRDtBQUN0RCx1REFBbUQ7QUFFbkQsdURBQW1EO0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0ksS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxVQUFrQixFQUNsQixVQUE4QixFQUFFO0lBRWhDLGlEQUFpRDtJQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLHlCQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRWxELHVCQUF1QjtJQUN2QixNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxtQ0FBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUVoRCwwQkFBMEI7SUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxpQ0FBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUVuRSxpQ0FBaUM7SUFDakMsT0FBTyxlQUFlLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHVydm9JbnRlcm5hbEFwaSB9IGZyb20gJy4uL2FwaS90dXJ2b0ludGVybmFsQXBpJ1xuaW1wb3J0IHsgVHVydm9QdWJsaWNBcGkgfSBmcm9tICcuLi9hcGkvdHVydm9QdWJsaWNBcGknXG5pbXBvcnQgeyBUdXJ2b0NsaWVudCB9IGZyb20gJy4uL2NsaWVudC90dXJ2b0NsaWVudCdcbmltcG9ydCB7IEdldFRyYWNraW5nT3B0aW9ucywgU2hpcG1lbnRUcmFja2luZyB9IGZyb20gJy4uL3R5cGVzL3RyYWNraW5nJ1xuaW1wb3J0IHsgVHJhY2tpbmdTZXJ2aWNlIH0gZnJvbSAnLi90cmFja2luZ1NlcnZpY2UnXG5cbi8qKlxuICogTWFpbiBmdW5jdGlvbiB0byBmZXRjaCBzaGlwbWVudCB0cmFja2luZyBkYXRhIGZyb20gVHVydm8uXG4gKiBDb21iaW5lcyBwdWJsaWMgQVBJIChzaGlwbWVudCBkZXRhaWxzKSB3aXRoIGludGVybmFsIEFQSSAoR1BTIHRyYWNraW5nKS5cbiAqXG4gKiBAcGFyYW0gc2hpcG1lbnRJZCAtIFRoZSBUdXJ2byBzaGlwbWVudCBJRCB0byB0cmFja1xuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0cmFja2luZyByZXF1ZXN0XG4gKiBAcmV0dXJucyBDb21wbGV0ZSBzaGlwbWVudCB0cmFja2luZyBpbmZvcm1hdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBnZXRTaGlwbWVudFRyYWNraW5nIH0gZnJvbSAnQHZlaG8vdHVydm8tc2RrJ1xuICpcbiAqIGNvbnN0IHRyYWNraW5nID0gYXdhaXQgZ2V0U2hpcG1lbnRUcmFja2luZygnMTIzNDUnLCB7XG4gKiAgIGluY2x1ZGVHcHM6IHRydWUsXG4gKiAgIHNlY3JldFBhdGg6ICcvdHVydm8vYXBpJ1xuICogfSlcbiAqXG4gKiBjb25zb2xlLmxvZyh0cmFja2luZy5zdGF0dXMsIHRyYWNraW5nLmV0YVV0YywgdHJhY2tpbmcuaXNMYXRlKVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaGlwbWVudFRyYWNraW5nKFxuICBzaGlwbWVudElkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldFRyYWNraW5nT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPFNoaXBtZW50VHJhY2tpbmc+IHtcbiAgLy8gQ3JlYXRlIGNsaWVudCB3aXRoIG9wdGlvbmFsIGN1c3RvbSBzZWNyZXQgcGF0aFxuICBjb25zdCBjbGllbnQgPSBuZXcgVHVydm9DbGllbnQob3B0aW9ucy5zZWNyZXRQYXRoKVxuXG4gIC8vIENyZWF0ZSBBUEkgaW5zdGFuY2VzXG4gIGNvbnN0IHB1YmxpY0FwaSA9IG5ldyBUdXJ2b1B1YmxpY0FwaShjbGllbnQpXG4gIGNvbnN0IGludGVybmFsQXBpID0gbmV3IFR1cnZvSW50ZXJuYWxBcGkoY2xpZW50KVxuXG4gIC8vIENyZWF0ZSB0cmFja2luZyBzZXJ2aWNlXG4gIGNvbnN0IHRyYWNraW5nU2VydmljZSA9IG5ldyBUcmFja2luZ1NlcnZpY2UocHVibGljQXBpLCBpbnRlcm5hbEFwaSlcblxuICAvLyBGZXRjaCBhbmQgcmV0dXJuIHRyYWNraW5nIGRhdGFcbiAgcmV0dXJuIHRyYWNraW5nU2VydmljZS5nZXRUcmFja2luZyhzaGlwbWVudElkLCBvcHRpb25zKVxufVxuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TurvoInternalApi } from '../api/turvoInternalApi';
|
|
2
|
+
import { TurvoPublicApi } from '../api/turvoPublicApi';
|
|
3
|
+
import { GetTrackingOptions, ShipmentTracking } from '../types/tracking';
|
|
4
|
+
/**
|
|
5
|
+
* TrackingService orchestrates calls to public and internal APIs
|
|
6
|
+
* to provide a unified shipment tracking interface.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TrackingService {
|
|
9
|
+
private publicApi;
|
|
10
|
+
private internalApi;
|
|
11
|
+
constructor(publicApi: TurvoPublicApi, internalApi: TurvoInternalApi);
|
|
12
|
+
/**
|
|
13
|
+
* Main entry point - combines all API data to produce ShipmentTracking
|
|
14
|
+
*
|
|
15
|
+
* @param shipmentId - The shipment ID to track
|
|
16
|
+
* @param options - Tracking options
|
|
17
|
+
* @returns Complete shipment tracking information
|
|
18
|
+
*/
|
|
19
|
+
getTracking(shipmentId: string, options?: GetTrackingOptions): Promise<ShipmentTracking>;
|
|
20
|
+
/**
|
|
21
|
+
* Transform raw Turvo API responses into clean ShipmentTracking type
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
private transformToTrackingDetails;
|
|
25
|
+
}
|