sdek-api-lib
Version:
A comprehensive TypeScript SDK for CDEK API v2.0. Complete delivery service integration with full type support, automatic token management, and extensive examples.
297 lines • 9.68 kB
JavaScript
;
/**
* CDEK API SDK - Main Client
* @packageDocumentation
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CdekApi = void 0;
const node_fetch_1 = __importDefault(require("node-fetch"));
/**
* Main client for CDEK API v2.0
*/
class CdekApi {
/**
* Create a new CDEK API client
* @param config Client configuration
*/
constructor(config) {
this.token = null;
this.tokenExpiresAt = 0;
this.config = {
baseUrl: 'https://api.edu.cdek.ru',
timeout: 30000,
...config,
};
}
/**
* Switch to production environment
*/
setProductionMode() {
this.config.baseUrl = 'https://api.cdek.ru';
}
/**
* Switch to test environment
*/
setTestMode() {
this.config.baseUrl = 'https://api.edu.cdek.ru';
}
/**
* Get authentication token
* @private
*/
async getAuthToken() {
if (this.token && Date.now() < this.tokenExpiresAt) {
return this.token.access_token;
}
const body = `grant_type=client_credentials&client_id=${this.config.clientId}&client_secret=${this.config.clientSecret}`;
const response = await (0, node_fetch_1.default)(`${this.config.baseUrl}/v2/oauth/token`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: body,
// @ts-ignore
timeout: this.config.timeout,
});
if (!response.ok) {
throw new Error(`Auth error: ${response.status} ${response.statusText}`);
}
this.token = (await response.json());
this.tokenExpiresAt = Date.now() + (this.token.expires_in - 60) * 1000;
return this.token.access_token;
}
/**
* Make HTTP request to CDEK API
* @private
*/
async makeRequest(method, endpoint, data, params) {
const token = await this.getAuthToken();
let url = `${this.config.baseUrl}${endpoint}`;
if (params) {
const searchParams = new URLSearchParams();
Object.entries(params).forEach(([key, value]) => {
if (value !== undefined && value !== null) {
searchParams.append(key, value.toString());
}
});
if (searchParams.toString()) {
url += (url.includes('?') ? '&' : '?') + searchParams.toString();
}
}
const headers = {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'User-Agent': 'CDEK-TypeScript-SDK/1.0.0',
};
const config = {
method,
headers,
// @ts-ignore
timeout: this.config.timeout,
};
if (data && (method === 'POST' || method === 'PUT')) {
config.body = JSON.stringify(data);
}
const response = await (0, node_fetch_1.default)(url, config);
if (!response.ok) {
const errorText = await response.text();
throw new Error(`HTTP ${response.status}: ${errorText}`);
}
return response.json();
}
// =================== CALCULATOR ===================
/**
* Calculate delivery cost and time by tariff code
*/
async calculateTariff(request) {
return this.makeRequest('POST', '/v2/calculator/tariff', request);
}
/**
* Calculate delivery cost and time for all available tariffs
*/
async calculateTariffList(request) {
const response = await this.makeRequest('POST', '/v2/calculator/tarifflist', request);
return response.tariff_codes || [];
}
/**
* Calculate customs duty for delivery to Russia
*/
async calculateCustomsDuty(request) {
return this.makeRequest('POST', '/v2/calculator/customs-duty', request);
}
// =================== ORDERS ===================
/**
* Create a new order
*/
async createOrder(order) {
return this.makeRequest('POST', '/v2/orders', order);
}
/**
* Get order info by UUID
*/
async getOrder(uuid) {
return this.makeRequest('GET', `/v2/orders/${uuid}`);
}
/**
* Get order info by CDEK number
*/
async getOrderByCdekNumber(cdekNumber) {
return this.makeRequest('GET', '/v2/orders', undefined, { cdek_number: cdekNumber });
}
/**
* Get orders list by search params
*/
async getOrders(params = {}) {
return this.makeRequest('GET', '/v2/orders', undefined, params);
}
/**
* Update order by UUID
*/
async updateOrder(uuid, order) {
return this.makeRequest('PUT', `/v2/orders/${uuid}`, order);
}
/**
* Delete order by UUID
*/
async deleteOrder(uuid) {
return this.makeRequest('DELETE', `/v2/orders/${uuid}`);
}
// =================== LOCATIONS ===================
/**
* Get regions list
*/
async getRegions(countryCodes, size = 1000, page = 0) {
let url = `/v2/location/regions?size=${size}&page=${page}`;
if (countryCodes) {
url += `&country_codes=${countryCodes}`;
}
return this.makeRequest('GET', url);
}
/**
* Get cities list
*/
async getCities(options = {}) {
const params = new URLSearchParams();
Object.entries(options).forEach(([key, value]) => {
if (value !== undefined) {
params.append(key, value.toString());
}
});
if (!params.has('size')) {
params.append('size', '1000');
}
if (!params.has('page')) {
params.append('page', '0');
}
return this.makeRequest('GET', `/v2/location/cities?${params.toString()}`);
}
// =================== DELIVERY POINTS ===================
/**
* Get delivery points (pickup points)
*/
async getDeliveryPoints(filter = {}) {
const params = new URLSearchParams();
Object.entries(filter).forEach(([key, value]) => {
if (value !== undefined) {
params.append(key, value.toString());
}
});
return this.makeRequest('GET', `/v2/deliverypoints?${params.toString()}`);
}
/**
* Search delivery points with extended result
*/
async searchDeliveryPoints(filter = {}) {
return this.makeRequest('GET', '/v2/deliverypoints', undefined, filter);
}
// =================== COURIER ===================
/**
* Create courier request
*/
async createCourierRequest(request) {
return this.makeRequest('POST', '/v2/intakes', request);
}
/**
* Get courier request info by UUID
*/
async getCourierRequest(uuid) {
return this.makeRequest('GET', `/v2/intakes/${uuid}`);
}
/**
* Get courier requests list
*/
async getCourierRequests(params = {}) {
return this.makeRequest('GET', '/v2/intakes', undefined, params);
}
/**
* Delete courier request by UUID
*/
async deleteCourierRequest(uuid) {
return this.makeRequest('DELETE', `/v2/intakes/${uuid}`);
}
// =================== PRINTING ===================
/**
* Get order print form (A4, A5, A6)
*/
async getOrderPrintForm(orderUuids, format = 'A4') {
return this.makeRequest('GET', '/v2/print/orders', undefined, {
orders: orderUuids.join(','),
format,
});
}
/**
* Get order barcode print form (A4, A5, A6)
*/
async getOrderBarcode(orderUuids, format = 'A4') {
return this.makeRequest('GET', '/v2/print/barcodes', undefined, {
orders: orderUuids.join(','),
format,
});
}
// =================== WEBHOOKS ===================
/**
* Subscribe to webhook
*/
async subscribeWebhook(url, type = 'ORDER_STATUS') {
return this.makeRequest('POST', '/v2/webhooks', { url, type });
}
/**
* Get webhooks list
*/
async getWebhooks() {
return this.makeRequest('GET', '/v2/webhooks');
}
/**
* Delete webhook by UUID
*/
async deleteWebhook(uuid) {
return this.makeRequest('DELETE', `/v2/webhooks/${uuid}`);
}
}
exports.CdekApi = CdekApi;
// Export all types and constants for convenience
__exportStar(require("./types"), exports);
__exportStar(require("./types/calculator"), exports);
__exportStar(require("./types/orders"), exports);
__exportStar(require("./types/delivery-points"), exports);
__exportStar(require("./types/courier"), exports);
__exportStar(require("./constants"), exports);
__exportStar(require("./utils"), exports);
//# sourceMappingURL=cdek-client.js.map