@gofynd/fdk-client-javascript 1.3.0 → 1.3.1
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.
- package/package.json +3 -2
- package/sdk/application/Cart/CartApplicationModel.d.ts +2 -0
- package/sdk/application/Cart/CartApplicationModel.js +2 -0
- package/sdk/common/AxiosHelper.js +2 -2
- package/sdk/partner/OAuthClient.js +2 -2
- package/sdk/platform/OAuthClient.js +2 -2
- package/sdk/platform/Webhook/WebhookPlatformValidator.d.ts +7 -11
- package/sdk/platform/Webhook/WebhookPlatformValidator.js +5 -7
- package/sdk/common/RequestSigner.d.ts +0 -1
- package/sdk/common/RequestSigner.js +0 -300
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gofynd/fdk-client-javascript",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"crypto-js": "^4.1.1",
|
|
18
18
|
"joi": "^17.7.0",
|
|
19
19
|
"loglevel": "^1.8.1",
|
|
20
|
-
"query-string": "^7.1.3"
|
|
20
|
+
"query-string": "^7.1.3",
|
|
21
|
+
"@gofynd/fp-signature": "^0.0.2-alpha.1"
|
|
21
22
|
},
|
|
22
23
|
"devDependencies": {
|
|
23
24
|
"axios-cookiejar-support": "^4.0.6",
|
|
@@ -697,6 +697,7 @@ export = CartApplicationModel;
|
|
|
697
697
|
* @property {number} [fynd_cash]
|
|
698
698
|
* @property {number} [gift_card]
|
|
699
699
|
* @property {number} [gst_charges]
|
|
700
|
+
* @property {number} [mop_total]
|
|
700
701
|
* @property {number} [mrp_total]
|
|
701
702
|
* @property {number} [subtotal]
|
|
702
703
|
* @property {number} [total]
|
|
@@ -1888,6 +1889,7 @@ type RawBreakup = {
|
|
|
1888
1889
|
fynd_cash?: number;
|
|
1889
1890
|
gift_card?: number;
|
|
1890
1891
|
gst_charges?: number;
|
|
1892
|
+
mop_total?: number;
|
|
1891
1893
|
mrp_total?: number;
|
|
1892
1894
|
subtotal?: number;
|
|
1893
1895
|
total?: number;
|
|
@@ -775,6 +775,7 @@ const Joi = require("joi");
|
|
|
775
775
|
* @property {number} [fynd_cash]
|
|
776
776
|
* @property {number} [gift_card]
|
|
777
777
|
* @property {number} [gst_charges]
|
|
778
|
+
* @property {number} [mop_total]
|
|
778
779
|
* @property {number} [mrp_total]
|
|
779
780
|
* @property {number} [subtotal]
|
|
780
781
|
* @property {number} [total]
|
|
@@ -1862,6 +1863,7 @@ class CartApplicationModel {
|
|
|
1862
1863
|
fynd_cash: Joi.number(),
|
|
1863
1864
|
gift_card: Joi.number(),
|
|
1864
1865
|
gst_charges: Joi.number(),
|
|
1866
|
+
mop_total: Joi.number(),
|
|
1865
1867
|
mrp_total: Joi.number(),
|
|
1866
1868
|
subtotal: Joi.number(),
|
|
1867
1869
|
total: Joi.number(),
|
|
@@ -2,7 +2,7 @@ const combineURLs = require("axios/lib/helpers/combineURLs");
|
|
|
2
2
|
const isAbsoluteURL = require("axios/lib/helpers/isAbsoluteURL");
|
|
3
3
|
const axios = require("axios");
|
|
4
4
|
const querystring = require("query-string");
|
|
5
|
-
const { sign } = require("
|
|
5
|
+
const { sign } = require("@gofynd/fp-signature");
|
|
6
6
|
const { FDKServerResponseError } = require("./FDKError");
|
|
7
7
|
const { log, Logger, getLoggerLevel } = require("./Logger");
|
|
8
8
|
const createCurl = require("./curlHelper");
|
|
@@ -73,7 +73,7 @@ function requestInterceptorFn() {
|
|
|
73
73
|
body: transformedData,
|
|
74
74
|
headers: headersToSign,
|
|
75
75
|
};
|
|
76
|
-
sign(signingOptions);
|
|
76
|
+
sign(signingOptions, "1234567");
|
|
77
77
|
|
|
78
78
|
config.headers["x-fp-date"] = signingOptions.headers["x-fp-date"];
|
|
79
79
|
config.headers["x-fp-signature"] = signingOptions.headers["x-fp-signature"];
|
|
@@ -3,7 +3,7 @@ const { FDKTokenIssueError } = require("../common/FDKError");
|
|
|
3
3
|
const { Logger } = require("../common/Logger");
|
|
4
4
|
const BaseOAuthClient = require("../common/BaseOAuthClient");
|
|
5
5
|
const querystring = require("query-string");
|
|
6
|
-
const { sign } = require("
|
|
6
|
+
const { sign } = require("@gofynd/fp-signature");
|
|
7
7
|
|
|
8
8
|
class OAuthClient extends BaseOAuthClient {
|
|
9
9
|
constructor(config) {
|
|
@@ -32,7 +32,7 @@ class OAuthClient extends BaseOAuthClient {
|
|
|
32
32
|
headers: {},
|
|
33
33
|
signQuery: true,
|
|
34
34
|
};
|
|
35
|
-
signingOptions = sign(signingOptions);
|
|
35
|
+
signingOptions = sign(signingOptions, "1234567");
|
|
36
36
|
Logger({ type: "DEBUG", message: "Authorization successful" });
|
|
37
37
|
|
|
38
38
|
return `${this.config.domain}${signingOptions.path}`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const querystring = require("query-string");
|
|
2
2
|
const { fdkAxios } = require("../common/AxiosHelper");
|
|
3
|
-
const { sign } = require("
|
|
3
|
+
const { sign } = require("@gofynd/fp-signature");
|
|
4
4
|
const { FDKTokenIssueError, FDKOAuthCodeError } = require("../common/FDKError");
|
|
5
5
|
const { Logger } = require("../common/Logger");
|
|
6
6
|
const { convertStringToBase64 } = require("../common/utils");
|
|
@@ -86,7 +86,7 @@ class OAuthClient {
|
|
|
86
86
|
headers: {},
|
|
87
87
|
signQuery: true,
|
|
88
88
|
};
|
|
89
|
-
signingOptions = sign(signingOptions);
|
|
89
|
+
signingOptions = sign(signingOptions, "1234567");
|
|
90
90
|
Logger({ level: "INFO", message: "Authorization successful.!" });
|
|
91
91
|
|
|
92
92
|
return `${this.config.domain}${signingOptions.path}`;
|
|
@@ -27,21 +27,19 @@ export = WebhookPlatformValidator;
|
|
|
27
27
|
*/
|
|
28
28
|
/**
|
|
29
29
|
* @typedef GetSubscriberByIdParam
|
|
30
|
-
* @property {number} subscriberId -
|
|
31
|
-
* retry is to be initiated.
|
|
30
|
+
* @property {number} subscriberId - Subscriber id
|
|
32
31
|
*/
|
|
33
32
|
/**
|
|
34
33
|
* @typedef GetSubscribersByCompanyParam
|
|
35
34
|
* @property {number} [pageNo] - Page Number
|
|
36
35
|
* @property {number} [pageSize] - Page Size
|
|
37
|
-
* @property {
|
|
36
|
+
* @property {string} [extensionId] - Extension_id
|
|
38
37
|
*/
|
|
39
38
|
/**
|
|
40
39
|
* @typedef GetSubscribersByExtensionIdParam
|
|
41
40
|
* @property {number} [pageNo] - Page Number
|
|
42
41
|
* @property {number} [pageSize] - Page Size
|
|
43
|
-
* @property {
|
|
44
|
-
* is to be initiated.
|
|
42
|
+
* @property {string} extensionId - Extension id
|
|
45
43
|
*/
|
|
46
44
|
/** @typedef ManualRetryCancelParam */
|
|
47
45
|
/**
|
|
@@ -120,8 +118,7 @@ type GetReportFiltersParam = {
|
|
|
120
118
|
};
|
|
121
119
|
type GetSubscriberByIdParam = {
|
|
122
120
|
/**
|
|
123
|
-
* -
|
|
124
|
-
* retry is to be initiated.
|
|
121
|
+
* - Subscriber id
|
|
125
122
|
*/
|
|
126
123
|
subscriberId: number;
|
|
127
124
|
};
|
|
@@ -137,7 +134,7 @@ type GetSubscribersByCompanyParam = {
|
|
|
137
134
|
/**
|
|
138
135
|
* - Extension_id
|
|
139
136
|
*/
|
|
140
|
-
extensionId?:
|
|
137
|
+
extensionId?: string;
|
|
141
138
|
};
|
|
142
139
|
type GetSubscribersByExtensionIdParam = {
|
|
143
140
|
/**
|
|
@@ -149,10 +146,9 @@ type GetSubscribersByExtensionIdParam = {
|
|
|
149
146
|
*/
|
|
150
147
|
pageSize?: number;
|
|
151
148
|
/**
|
|
152
|
-
* -
|
|
153
|
-
* is to be initiated.
|
|
149
|
+
* - Extension id
|
|
154
150
|
*/
|
|
155
|
-
extensionId:
|
|
151
|
+
extensionId: string;
|
|
156
152
|
};
|
|
157
153
|
type ManualRetryOfFailedEventParam = {
|
|
158
154
|
body: WebhookPlatformModel.EventProcessRequest;
|
|
@@ -38,23 +38,21 @@ const WebhookPlatformModel = require("./WebhookPlatformModel");
|
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* @typedef GetSubscriberByIdParam
|
|
41
|
-
* @property {number} subscriberId -
|
|
42
|
-
* retry is to be initiated.
|
|
41
|
+
* @property {number} subscriberId - Subscriber id
|
|
43
42
|
*/
|
|
44
43
|
|
|
45
44
|
/**
|
|
46
45
|
* @typedef GetSubscribersByCompanyParam
|
|
47
46
|
* @property {number} [pageNo] - Page Number
|
|
48
47
|
* @property {number} [pageSize] - Page Size
|
|
49
|
-
* @property {
|
|
48
|
+
* @property {string} [extensionId] - Extension_id
|
|
50
49
|
*/
|
|
51
50
|
|
|
52
51
|
/**
|
|
53
52
|
* @typedef GetSubscribersByExtensionIdParam
|
|
54
53
|
* @property {number} [pageNo] - Page Number
|
|
55
54
|
* @property {number} [pageSize] - Page Size
|
|
56
|
-
* @property {
|
|
57
|
-
* is to be initiated.
|
|
55
|
+
* @property {string} extensionId - Extension id
|
|
58
56
|
*/
|
|
59
57
|
|
|
60
58
|
/** @typedef ManualRetryCancelParam */
|
|
@@ -144,7 +142,7 @@ class WebhookPlatformValidator {
|
|
|
144
142
|
return Joi.object({
|
|
145
143
|
pageNo: Joi.number(),
|
|
146
144
|
pageSize: Joi.number(),
|
|
147
|
-
extensionId: Joi.
|
|
145
|
+
extensionId: Joi.string().allow(""),
|
|
148
146
|
}).required();
|
|
149
147
|
}
|
|
150
148
|
|
|
@@ -153,7 +151,7 @@ class WebhookPlatformValidator {
|
|
|
153
151
|
return Joi.object({
|
|
154
152
|
pageNo: Joi.number(),
|
|
155
153
|
pageSize: Joi.number(),
|
|
156
|
-
extensionId: Joi.
|
|
154
|
+
extensionId: Joi.string().allow("").required(),
|
|
157
155
|
}).required();
|
|
158
156
|
}
|
|
159
157
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function sign(request: any): any;
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const querystring = require("query-string");
|
|
4
|
-
const sha256 = require("crypto-js/sha256");
|
|
5
|
-
const hmacSHA256 = require("crypto-js/hmac-sha256");
|
|
6
|
-
|
|
7
|
-
function hmac(key, string, encoding) {
|
|
8
|
-
return hmacSHA256(string, key).toString();
|
|
9
|
-
}
|
|
10
|
-
function hash(string, encoding) {
|
|
11
|
-
return sha256(string).toString();
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
// This function assumes the string has already been percent encoded
|
|
15
|
-
function encodeRfc3986(urlEncodedString) {
|
|
16
|
-
return urlEncodedString.replace(/[!'()*]/g, function (c) {
|
|
17
|
-
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function encodeRfc3986Full(str) {
|
|
22
|
-
return str;
|
|
23
|
-
// return encodeRfc3986(encodeURIComponent(str));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const HEADERS_TO_IGNORE = {
|
|
27
|
-
authorization: true,
|
|
28
|
-
connection: true,
|
|
29
|
-
"x-amzn-trace-id": true,
|
|
30
|
-
"user-agent": true,
|
|
31
|
-
expect: true,
|
|
32
|
-
"presigned-expires": true,
|
|
33
|
-
range: true,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const HEADERS_TO_INCLUDE = ["x-fp-.*", "host"];
|
|
37
|
-
|
|
38
|
-
// request: { path | body, [host], [method], [headers], [service], [region] }
|
|
39
|
-
class RequestSigner {
|
|
40
|
-
constructor(request) {
|
|
41
|
-
let headers = (request.headers = request.headers || {});
|
|
42
|
-
this.request = request;
|
|
43
|
-
|
|
44
|
-
if (!request.method && request.body) {
|
|
45
|
-
request.method = "POST";
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (!headers.Host && !headers.host) {
|
|
49
|
-
headers.Host = request.hostname || request.host;
|
|
50
|
-
|
|
51
|
-
// If a port is specified explicitly, use it as is
|
|
52
|
-
if (request.port) {
|
|
53
|
-
headers.Host += ":" + request.port;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
if (!request.hostname && !request.host) {
|
|
57
|
-
request.hostname = headers.Host || headers.host;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
prepareRequest() {
|
|
62
|
-
this.parsePath();
|
|
63
|
-
|
|
64
|
-
let request = this.request;
|
|
65
|
-
let headers = request.headers;
|
|
66
|
-
let query;
|
|
67
|
-
|
|
68
|
-
if (request.signQuery) {
|
|
69
|
-
this.parsedPath.query = query = this.parsedPath.query || {};
|
|
70
|
-
|
|
71
|
-
if (query["x-fp-date"]) {
|
|
72
|
-
this.datetime = query["x-fp-date"];
|
|
73
|
-
} else {
|
|
74
|
-
query["x-fp-date"] = this.getDateTime();
|
|
75
|
-
}
|
|
76
|
-
} else {
|
|
77
|
-
if (!request.doNotModifyHeaders) {
|
|
78
|
-
if (headers["x-fp-date"]) {
|
|
79
|
-
this.datetime = headers["x-fp-date"] || headers["x-fp-date"];
|
|
80
|
-
} else {
|
|
81
|
-
headers["x-fp-date"] = this.getDateTime();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
delete headers["x-fp-signature"];
|
|
86
|
-
delete headers["X-Fp-Signature"];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
sign() {
|
|
91
|
-
if (!this.parsedPath) {
|
|
92
|
-
this.prepareRequest();
|
|
93
|
-
}
|
|
94
|
-
if (this.request.signQuery) {
|
|
95
|
-
this.parsedPath.query["x-fp-signature"] = this.signature();
|
|
96
|
-
} else {
|
|
97
|
-
this.request.headers["x-fp-signature"] = this.signature();
|
|
98
|
-
}
|
|
99
|
-
this.request.path = this.formatPath();
|
|
100
|
-
return this.request;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
getDateTime() {
|
|
104
|
-
if (!this.datetime) {
|
|
105
|
-
let headers = this.request.headers;
|
|
106
|
-
let date = new Date(headers.Date || headers.date || new Date());
|
|
107
|
-
|
|
108
|
-
this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, "");
|
|
109
|
-
}
|
|
110
|
-
return this.datetime;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
getDate() {
|
|
114
|
-
return this.getDateTime().substr(0, 8);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
signature() {
|
|
118
|
-
let kCredentials = "1234567";
|
|
119
|
-
let strTosign = this.stringToSign();
|
|
120
|
-
return `v1.1:${hmac(kCredentials, strTosign, "hex")}`;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
stringToSign() {
|
|
124
|
-
return [this.getDateTime(), hash(this.canonicalString(), "hex")].join("\n");
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
canonicalString() {
|
|
128
|
-
if (!this.parsedPath) {
|
|
129
|
-
this.prepareRequest();
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
let pathStr = this.parsedPath.path;
|
|
133
|
-
let query = this.parsedPath.query;
|
|
134
|
-
let headers = this.request.headers;
|
|
135
|
-
let queryStr = "";
|
|
136
|
-
let normalizePath = true;
|
|
137
|
-
let decodePath = this.request.doNotEncodePath;
|
|
138
|
-
let decodeSlashesInPath = false;
|
|
139
|
-
let firstValOnly = false;
|
|
140
|
-
let bodyHash = hash(this.request.body || "", "hex");
|
|
141
|
-
if (query) {
|
|
142
|
-
let reducedQuery = Object.keys(query).reduce(function (obj, key) {
|
|
143
|
-
if (!key) {
|
|
144
|
-
return obj;
|
|
145
|
-
}
|
|
146
|
-
obj[encodeRfc3986Full(key)] = !Array.isArray(query[key])
|
|
147
|
-
? query[key]
|
|
148
|
-
: firstValOnly
|
|
149
|
-
? query[key][0]
|
|
150
|
-
: query[key];
|
|
151
|
-
return obj;
|
|
152
|
-
}, {});
|
|
153
|
-
let encodedQueryPieces = [];
|
|
154
|
-
Object.keys(reducedQuery)
|
|
155
|
-
.sort()
|
|
156
|
-
.forEach(function (key) {
|
|
157
|
-
if (!Array.isArray(reducedQuery[key])) {
|
|
158
|
-
encodedQueryPieces.push(
|
|
159
|
-
key + "=" + encodeRfc3986Full(reducedQuery[key])
|
|
160
|
-
);
|
|
161
|
-
} else {
|
|
162
|
-
reducedQuery[key]
|
|
163
|
-
.map(encodeRfc3986Full)
|
|
164
|
-
.sort()
|
|
165
|
-
.forEach(function (val) {
|
|
166
|
-
encodedQueryPieces.push(key + "=" + val);
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
queryStr = encodedQueryPieces.join("&");
|
|
171
|
-
}
|
|
172
|
-
if (pathStr !== "/") {
|
|
173
|
-
if (normalizePath) {
|
|
174
|
-
pathStr = pathStr.replace(/\/{2,}/g, "/");
|
|
175
|
-
}
|
|
176
|
-
pathStr = pathStr
|
|
177
|
-
.split("/")
|
|
178
|
-
.reduce(function (path, piece) {
|
|
179
|
-
if (normalizePath && piece === "..") {
|
|
180
|
-
path.pop();
|
|
181
|
-
} else if (!normalizePath || piece !== ".") {
|
|
182
|
-
if (decodePath)
|
|
183
|
-
piece = decodeURIComponent(piece.replace(/\+/g, " "));
|
|
184
|
-
path.push(encodeRfc3986Full(piece));
|
|
185
|
-
}
|
|
186
|
-
return path;
|
|
187
|
-
}, [])
|
|
188
|
-
.join("/");
|
|
189
|
-
if (pathStr[0] !== "/") pathStr = "/" + pathStr;
|
|
190
|
-
if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, "/");
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
let canonicalReq = [
|
|
194
|
-
this.request.method || "GET",
|
|
195
|
-
pathStr,
|
|
196
|
-
queryStr,
|
|
197
|
-
this.canonicalHeaders() + "\n",
|
|
198
|
-
this.signedHeaders(),
|
|
199
|
-
bodyHash,
|
|
200
|
-
].join("\n");
|
|
201
|
-
return canonicalReq;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
canonicalHeaders() {
|
|
205
|
-
let headers = this.request.headers;
|
|
206
|
-
|
|
207
|
-
function trimAll(header) {
|
|
208
|
-
return header.toString().trim().replace(/\s+/g, " ");
|
|
209
|
-
}
|
|
210
|
-
return Object.keys(headers)
|
|
211
|
-
.filter(function (key) {
|
|
212
|
-
let notInIgnoreHeader = HEADERS_TO_IGNORE[key.toLowerCase()] == null;
|
|
213
|
-
if (notInIgnoreHeader) {
|
|
214
|
-
let foundMatch = false;
|
|
215
|
-
for (let t in HEADERS_TO_INCLUDE) {
|
|
216
|
-
foundMatch =
|
|
217
|
-
foundMatch || new RegExp(HEADERS_TO_INCLUDE[t], "ig").test(key);
|
|
218
|
-
}
|
|
219
|
-
return foundMatch;
|
|
220
|
-
} else {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
})
|
|
224
|
-
.sort(function (a, b) {
|
|
225
|
-
return a.toLowerCase() < b.toLowerCase() ? -1 : 1;
|
|
226
|
-
})
|
|
227
|
-
.map(function (key) {
|
|
228
|
-
return key.toLowerCase() + ":" + trimAll(headers[key]);
|
|
229
|
-
})
|
|
230
|
-
.join("\n");
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
signedHeaders() {
|
|
234
|
-
return Object.keys(this.request.headers)
|
|
235
|
-
.map(function (key) {
|
|
236
|
-
return key.toLowerCase();
|
|
237
|
-
})
|
|
238
|
-
.filter(function (key) {
|
|
239
|
-
let notInIgnoreHeader = HEADERS_TO_IGNORE[key.toLowerCase()] == null;
|
|
240
|
-
if (notInIgnoreHeader) {
|
|
241
|
-
let foundMatch = false;
|
|
242
|
-
for (let t in HEADERS_TO_INCLUDE) {
|
|
243
|
-
foundMatch =
|
|
244
|
-
foundMatch || new RegExp(HEADERS_TO_INCLUDE[t], "ig").test(key);
|
|
245
|
-
}
|
|
246
|
-
return foundMatch;
|
|
247
|
-
} else {
|
|
248
|
-
return false;
|
|
249
|
-
}
|
|
250
|
-
})
|
|
251
|
-
.sort()
|
|
252
|
-
.join(";");
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
parsePath() {
|
|
256
|
-
let path = this.request.path || "/";
|
|
257
|
-
let queryIx = path.indexOf("?");
|
|
258
|
-
let query = null;
|
|
259
|
-
|
|
260
|
-
if (queryIx >= 0) {
|
|
261
|
-
query = querystring.parse(path.slice(queryIx + 1));
|
|
262
|
-
path = path.slice(0, queryIx);
|
|
263
|
-
}
|
|
264
|
-
path = path
|
|
265
|
-
.split("/")
|
|
266
|
-
.map((t) => {
|
|
267
|
-
return encodeURIComponent(decodeURIComponent(t));
|
|
268
|
-
})
|
|
269
|
-
.join("/");
|
|
270
|
-
|
|
271
|
-
this.parsedPath = {
|
|
272
|
-
path: path,
|
|
273
|
-
query: query,
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
formatPath() {
|
|
278
|
-
let path = this.parsedPath.path;
|
|
279
|
-
let query = this.parsedPath.query;
|
|
280
|
-
|
|
281
|
-
if (!query) {
|
|
282
|
-
return path;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Services don't support empty query string keys
|
|
286
|
-
if (query[""] != null) {
|
|
287
|
-
delete query[""];
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
return path + "?" + encodeRfc3986(querystring.stringify(query));
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
function sign(request) {
|
|
295
|
-
return new RequestSigner(request).sign();
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
module.exports = {
|
|
299
|
-
sign: sign,
|
|
300
|
-
};
|