UNPKG

nest-paapi-5

Version:

A NestJS module for Amazon's Product Advertising API 5.0 (PAAPI5)

116 lines 5.19 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SignService = void 0; const crypto_js_1 = __importDefault(require("crypto-js")); const common_1 = require("@nestjs/common"); let SignService = class SignService { sign({ accessKey, secretKey, headers, method, path, payload, region, service = "ProductAdvertisingAPI", timestamp, }) { const authorizationHeader = this.createAuthorizationHeader(accessKey, secretKey, headers, method, path, payload, region, service, timestamp); return authorizationHeader; } createAuthorizationHeader(accessKey, secretKey, headers, method, path, payload, region, service, timestamp) { // Step 1: Create Signed Headers const signedHeaders = this.createSignedHeaders(headers); // Step 2: Create Canonical Request const canonicalRequest = this.createCanonicalRequest(method, path, {}, headers, payload); // Step 3: Create String To Sign const stringToSign = this.createStringToSign(timestamp, region, service, canonicalRequest); // Step 4: Create Signature Headers const signature = this.createSignature(secretKey, timestamp, region, service, stringToSign); // Step 5: Create Authorization Header const authorizationHeader = this.createAuthorizationHeaders(timestamp, accessKey, region, service, signedHeaders, signature); return authorizationHeader; } createAuthorizationHeaders(timestamp, accessKey, region, service, signedHeaders, signature) { return ("AWS4-HMAC-SHA256" + " " + "Credential=" + accessKey + "/" + this.createCredentialScope(timestamp, region, service) + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature); } createCanonicalRequest(method, pathname, query, headers, payload) { const payloadJson = JSON.stringify(payload); return [ method.toUpperCase(), pathname, this.createCanonicalQueryString(query), this.createCanonicalHeaders(headers), this.createSignedHeaders(headers), this.hexEncodedHash(payloadJson || ""), ].join("\n"); } createCanonicalQueryString(params) { return Object.keys(params) .sort() .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`) .join("&"); } createCanonicalHeaders(headers) { return Object.keys(headers) .sort() .map((name) => `${name.toLowerCase().trim()}:${headers[name].toString().trim()}\n`) .join(""); } createSignedHeaders(headers) { return Object.keys(headers) .sort() .map((name) => name.toLowerCase().trim()) .join(";"); } createCredentialScope(time, region, service) { return [this.toDate(time), region, service, "aws4_request"].join("/"); } createStringToSign(time, region, service, request) { return [ "AWS4-HMAC-SHA256", this.toTime(time), this.createCredentialScope(time, region, service), this.hexEncodedHash(request), ].join("\n"); } createSignature(secret, time, region, service, stringToSign) { const dateKey = this.hmac(`AWS4${secret}`, this.toDate(time)); const regionKey = this.hmac(dateKey, region); const serviceKey = this.hmac(regionKey, service); const signingKey = this.hmac(serviceKey, "aws4_request"); return this.hmac(signingKey, stringToSign).toString(); } toAmzDate(time) { // eslint-disable-next-line no-useless-escape return new Date(time).toISOString().replace(/[:\-]|\.\d{3}/g, ""); } toTime(time) { // eslint-disable-next-line no-useless-escape return new Date(time).toISOString().replace(/[:\-]|\.\d{3}/g, ""); } toDate(time) { return this.toTime(time).substring(0, 8); } hmac(key, data) { return crypto_js_1.default.HmacSHA256(data, key); } hexEncodedHash(data) { return crypto_js_1.default.SHA256(data).toString(crypto_js_1.default.enc.Hex); } }; exports.SignService = SignService; exports.SignService = SignService = __decorate([ (0, common_1.Injectable)() ], SignService); //# sourceMappingURL=sign.service.js.map