lazada-iop-client
Version:
Lazada IOP Client SDK for Node JS
220 lines (219 loc) • 9.01 kB
JavaScript
"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;