@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.
Files changed (57) hide show
  1. package/README.md +473 -0
  2. package/index.ts +1 -0
  3. package/lib/cjs/api/turvoInternalApi.d.ts +23 -0
  4. package/lib/cjs/api/turvoInternalApi.js +36 -0
  5. package/lib/cjs/api/turvoPublicApi.d.ts +99 -0
  6. package/lib/cjs/api/turvoPublicApi.js +103 -0
  7. package/lib/cjs/client/turvoClient.d.ts +49 -0
  8. package/lib/cjs/client/turvoClient.js +180 -0
  9. package/lib/cjs/constants.d.ts +29 -0
  10. package/lib/cjs/constants.js +33 -0
  11. package/lib/cjs/index.d.ts +6 -0
  12. package/lib/cjs/index.js +37 -0
  13. package/lib/cjs/shipmentTracking/index.d.ts +22 -0
  14. package/lib/cjs/shipmentTracking/index.js +39 -0
  15. package/lib/cjs/shipmentTracking/trackingService.d.ts +25 -0
  16. package/lib/cjs/shipmentTracking/trackingService.js +85 -0
  17. package/lib/cjs/types/common.d.ts +64 -0
  18. package/lib/cjs/types/common.js +27 -0
  19. package/lib/cjs/types/config.d.ts +13 -0
  20. package/lib/cjs/types/config.js +3 -0
  21. package/lib/cjs/types/errors.d.ts +35 -0
  22. package/lib/cjs/types/errors.js +63 -0
  23. package/lib/cjs/types/index.d.ts +5 -0
  24. package/lib/cjs/types/index.js +27 -0
  25. package/lib/cjs/types/shipment.d.ts +379 -0
  26. package/lib/cjs/types/shipment.js +46 -0
  27. package/lib/cjs/types/tracking.d.ts +65 -0
  28. package/lib/cjs/types/tracking.js +3 -0
  29. package/lib/esm/api/turvoInternalApi.d.ts +23 -0
  30. package/lib/esm/api/turvoInternalApi.js +32 -0
  31. package/lib/esm/api/turvoPublicApi.d.ts +99 -0
  32. package/lib/esm/api/turvoPublicApi.js +99 -0
  33. package/lib/esm/client/turvoClient.d.ts +49 -0
  34. package/lib/esm/client/turvoClient.js +172 -0
  35. package/lib/esm/constants.d.ts +29 -0
  36. package/lib/esm/constants.js +30 -0
  37. package/lib/esm/index.d.ts +6 -0
  38. package/lib/esm/index.js +11 -0
  39. package/lib/esm/shipmentTracking/index.d.ts +22 -0
  40. package/lib/esm/shipmentTracking/index.js +36 -0
  41. package/lib/esm/shipmentTracking/trackingService.d.ts +25 -0
  42. package/lib/esm/shipmentTracking/trackingService.js +81 -0
  43. package/lib/esm/types/common.d.ts +64 -0
  44. package/lib/esm/types/common.js +23 -0
  45. package/lib/esm/types/config.d.ts +13 -0
  46. package/lib/esm/types/config.js +2 -0
  47. package/lib/esm/types/errors.d.ts +35 -0
  48. package/lib/esm/types/errors.js +55 -0
  49. package/lib/esm/types/index.d.ts +5 -0
  50. package/lib/esm/types/index.js +11 -0
  51. package/lib/esm/types/shipment.d.ts +379 -0
  52. package/lib/esm/types/shipment.js +43 -0
  53. package/lib/esm/types/tracking.d.ts +65 -0
  54. package/lib/esm/types/tracking.js +2 -0
  55. package/lib/tsconfig.cjs.tsbuildinfo +1 -0
  56. package/lib/tsconfig.esm.tsbuildinfo +1 -0
  57. 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';
@@ -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
+ }