UNPKG

lazada-iop-client

Version:

Lazada IOP Client SDK for Node JS

220 lines (219 loc) 9.01 kB
"use strict"; 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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const crypto = __importStar(require("crypto")); const axios_1 = __importDefault(require("axios")); const form_data_1 = __importDefault(require("form-data")); const SDK_VERSION = "lazop-sdk-js-20250422"; const AUTH_URL = "https://auth.lazada.com/oauth/authorize"; const APIGateway = { SG: "https://api.lazada.sg/rest", MY: "https://api.lazada.com.my/rest", VN: "https://api.lazada.vn/rest", TH: "https://api.lazada.co.th/rest", PH: "https://api.lazada.com.ph/rest", ID: "https://api.lazada.co.id/rest", }; class LazadaClient { constructor({ apiKey, apiSecret, region, callbackUrl, debug = false, }) { if (!APIGateway[region]) throw new Error(`Unsupported region: ${region}`); this.apiKey = apiKey; this.apiSecret = apiSecret; this.region = region; this.callbackUrl = callbackUrl; this.debug = debug; this.sysParams = { app_key: this.apiKey, sign_method: "sha256", }; this.apiParams = {}; this.fileParams = {}; } generateTimestamp() { return Date.now(); } getSysParams() { return Object.assign(Object.assign({}, this.sysParams), { timestamp: this.generateTimestamp() }); } setAccessToken(token) { this.sysParams.access_token = token; return this; } changeRegion(region) { if (!APIGateway[region]) throw new Error(`Unsupported region: ${region}`); this.region = region; return this; } addAPIParam(key, val) { this.apiParams[key] = val; return this; } addFileParam(key, val) { this.fileParams[key] = val; return this; } setCallbackUrl(url) { this.callbackUrl = url; } makeAuthURL() { const params = new URLSearchParams({ response_type: "code", force_auth: "true", country: this.region.toLowerCase(), redirect_uri: this.callbackUrl, client_id: this.apiKey, }); return `${AUTH_URL}?${params.toString()}`; } requestToken(code) { return __awaiter(this, void 0, void 0, function* () { var _a; const timestamp = this.generateTimestamp(); const sysParams = this.getSysParams(); const params = Object.assign(Object.assign({}, sysParams), { code, app_key: this.apiKey, sign_method: "sha256", timestamp }); const sign = this.sign("/auth/token/create", params); const allParams = Object.assign(Object.assign({}, params), { sign }); const urlParams = new URLSearchParams(Object.entries(allParams).map(([k, v]) => [k, String(v)])); const fullUrl = `https://auth.lazada.com/rest/auth/token/create?${urlParams.toString()}`; if (this.debug) { console.log("🛠️ Lazada Token Request Debug:"); console.log("URL:", fullUrl); console.log("Params:", allParams); console.log("Sign:", sign); } try { const response = yield axios_1.default.get(fullUrl); return response.data; } catch (err) { if (this.debug) { console.error("❌ Lazada API Error:", ((_a = err.response) === null || _a === void 0 ? void 0 : _a.data) || err.message); } throw err; } }); } sign(path, parameters) { const sortedKeys = Object.keys(parameters).sort(); let paramStr = path; if (this.debug) { console.log("🔐 SIGNING DEBUG:"); console.log("Path:", path); console.log("Sorted Params:"); sortedKeys.forEach((key) => { console.log(` ${key}: ${parameters[key]}`); }); } sortedKeys.forEach((key) => { paramStr += key + String(parameters[key]); }); const signature = crypto .createHmac("sha256", this.apiSecret) .update(paramStr) .digest("hex") .toUpperCase(); if (this.debug) { console.log("🔏 Signature Base String:", paramStr); console.log("🔑 Signature Result:", signature); } return signature; } getServerURL() { const url = APIGateway[this.region]; if (!url) throw new Error(`Region "${this.region}" is not supported.`); return url; } execute(apiPath_1) { return __awaiter(this, arguments, void 0, function* (apiPath, apiMethod = "GET", bodyParams = {}) { var _a; const sysParams = this.getSysParams(); const sign = this.sign(apiPath, Object.assign(Object.assign({}, sysParams), this.apiParams)); const allParams = Object.assign(Object.assign(Object.assign({}, sysParams), this.apiParams), { sign }); const urlParams = new URLSearchParams(Object.entries(allParams).map(([k, v]) => [k, String(v)])); const fullUrl = `${this.getServerURL()}${apiPath}?${urlParams.toString()}`; if (this.debug) { console.log("🛠️ Lazada Request Debug:"); console.log("URL:", fullUrl); console.log("Method:", apiMethod); console.log("Sys Params:", sysParams); console.log("API Params:", this.apiParams); console.log("Sign:", sign); } const config = { method: apiMethod, url: fullUrl, headers: {}, }; if (apiMethod === "POST") { const form = new form_data_1.default(); Object.entries(this.apiParams).forEach(([key, val]) => form.append(key, String(val))); Object.entries(bodyParams).forEach(([key, val]) => form.append(key, String(val))); Object.entries(this.fileParams).forEach(([filename, buffer]) => form.append("image", buffer, filename)); config.data = form; config.headers = form.getHeaders(); } try { const response = yield (0, axios_1.default)(config); return response.data; } catch (err) { if (this.debug) { console.error("❌ Lazada API Error:", ((_a = err.response) === null || _a === void 0 ? void 0 : _a.data) || err.message); } throw err; } finally { this.apiParams = {}; this.fileParams = {}; } }); } } exports.default = LazadaClient;