@eluvio/elv-client-js 4.0.2 → 4.0.3
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/dist/ElvClient-min.js +9 -9
- package/dist/ElvClient-node-min.js +9 -9
- package/dist/ElvFrameClient-min.js +10 -10
- package/dist/ElvPermissionsClient-min.js +8 -8
- package/dist/ElvWalletClient-min.js +7 -7
- package/dist/ElvWalletClient-node-min.js +10 -10
- package/dist/src/ElvClient.js +31 -10
- package/dist/src/HttpClient.js +6 -7
- package/dist/src/client/ContentManagement.js +8 -11
- package/package.json +1 -1
- package/src/ElvClient.js +21 -17
- package/src/FrameClient.js +0 -1
- package/src/HttpClient.js +5 -7
- package/src/client/ContentManagement.js +1 -3
package/dist/src/ElvClient.js
CHANGED
|
@@ -83,7 +83,8 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
83
83
|
*
|
|
84
84
|
* @namedParams
|
|
85
85
|
* @param {string} contentSpaceId - ID of the content space
|
|
86
|
-
* @param {string}
|
|
86
|
+
* @param {string} networkId - ID of the blockchain network
|
|
87
|
+
* @param {string} networkName - Name of the blockchain network
|
|
87
88
|
* @param {number} fabricVersion - The version of the target content fabric
|
|
88
89
|
* @param {Array<string>} fabricURIs - A list of full URIs to content fabric nodes
|
|
89
90
|
* @param {Array<string>} ethereumURIs - A list of full URIs to ethereum nodes
|
|
@@ -94,6 +95,9 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
94
95
|
* @param {string=} staticToken - Static token that will be used for all authorization in place of normal auth
|
|
95
96
|
* @param {boolean=} noCache=false - If enabled, blockchain transactions will not be cached
|
|
96
97
|
* @param {boolean=} noAuth=false - If enabled, blockchain authorization will not be performed
|
|
98
|
+
* @param {boolean=} assumeV3=false - If enabled, V3 fabric will be assumed
|
|
99
|
+
* @param {string=} service=default - The mode that determines how HttpClient will be initialized.
|
|
100
|
+
* If 'default' is set, HttpClient uris will use fabricUris. If 'search' is used, searchUris will be used
|
|
97
101
|
*
|
|
98
102
|
* @return {ElvClient} - New ElvClient connected to the specified content fabric and blockchain
|
|
99
103
|
*/
|
|
@@ -115,7 +119,9 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
115
119
|
_ref$noAuth = _ref.noAuth,
|
|
116
120
|
noAuth = _ref$noAuth === void 0 ? false : _ref$noAuth,
|
|
117
121
|
_ref$assumeV = _ref.assumeV3,
|
|
118
|
-
assumeV3 = _ref$assumeV === void 0 ? false : _ref$assumeV
|
|
122
|
+
assumeV3 = _ref$assumeV === void 0 ? false : _ref$assumeV,
|
|
123
|
+
_ref$service = _ref.service,
|
|
124
|
+
service = _ref$service === void 0 ? "default" : _ref$service;
|
|
119
125
|
|
|
120
126
|
_classCallCheck(this, ElvClient);
|
|
121
127
|
|
|
@@ -136,6 +142,12 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
136
142
|
this.noCache = noCache;
|
|
137
143
|
this.noAuth = noAuth;
|
|
138
144
|
this.assumeV3 = assumeV3;
|
|
145
|
+
|
|
146
|
+
if (!["search", "default"].includes(this.service)) {
|
|
147
|
+
throw Error("Invalid service: ".concat(this.service));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
this.service = service;
|
|
139
151
|
this.debug = false;
|
|
140
152
|
this.InitializeClients({
|
|
141
153
|
staticToken: staticToken
|
|
@@ -261,6 +273,7 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
261
273
|
var _InitializeClients = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
262
274
|
var _ref3,
|
|
263
275
|
staticToken,
|
|
276
|
+
uris,
|
|
264
277
|
wallet,
|
|
265
278
|
signer,
|
|
266
279
|
_args2 = arguments;
|
|
@@ -279,8 +292,9 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
279
292
|
this.objectImageUrls = {};
|
|
280
293
|
this.visibilityInfo = {};
|
|
281
294
|
this.inaccessibleLibraries = {};
|
|
295
|
+
uris = this.service === "search" ? this.searchURIs : this.fabricURIs;
|
|
282
296
|
this.HttpClient = new HttpClient({
|
|
283
|
-
uris:
|
|
297
|
+
uris: uris,
|
|
284
298
|
debug: this.debug
|
|
285
299
|
});
|
|
286
300
|
this.AuthHttpClient = new HttpClient({
|
|
@@ -325,7 +339,7 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
325
339
|
this.Crypto = Crypto;
|
|
326
340
|
this.Crypto.ElvCrypto();
|
|
327
341
|
|
|
328
|
-
case
|
|
342
|
+
case 18:
|
|
329
343
|
case "end":
|
|
330
344
|
return _context2.stop();
|
|
331
345
|
}
|
|
@@ -360,7 +374,7 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
360
374
|
* @param {string} region - Preferred region - the fabric will auto-detect the best region if not specified
|
|
361
375
|
* - Available regions: as-east au-east eu-east-north eu-west-north na-east-north na-east-south na-west-north na-west-south eu-east-south eu-west-south
|
|
362
376
|
*
|
|
363
|
-
* @return {Promise<Object>} - An object containing the updated fabric and
|
|
377
|
+
* @return {Promise<Object>} - An object containing the updated fabric, ethereum, auth service, and search URLs in order of preference
|
|
364
378
|
*/
|
|
365
379
|
|
|
366
380
|
}, {
|
|
@@ -521,11 +535,11 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
521
535
|
return NodeId;
|
|
522
536
|
}()
|
|
523
537
|
/**
|
|
524
|
-
* Retrieve the fabric and
|
|
538
|
+
* Retrieve the fabric, ethereum, auth service, and search nodes currently used by the client, in preference order
|
|
525
539
|
*
|
|
526
540
|
* @methodGroup Nodes
|
|
527
541
|
*
|
|
528
|
-
* @return {Promise<Object>} - An object containing the lists of fabric and
|
|
542
|
+
* @return {Promise<Object>} - An object containing the lists of fabric, ethereum, auth service, and search urls in use by the client
|
|
529
543
|
*/
|
|
530
544
|
|
|
531
545
|
}, {
|
|
@@ -534,16 +548,18 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
534
548
|
return {
|
|
535
549
|
fabricURIs: this.fabricURIs,
|
|
536
550
|
ethereumURIs: this.ethereumURIs,
|
|
537
|
-
authServiceURIs: this.authServiceURIs
|
|
551
|
+
authServiceURIs: this.authServiceURIs,
|
|
552
|
+
searchURIs: this.searchURIs
|
|
538
553
|
};
|
|
539
554
|
}
|
|
540
555
|
/**
|
|
541
|
-
* Set the client to use the specified fabric and
|
|
556
|
+
* Set the client to use the specified fabric, ethereum, auth service, and search nodes, in preference order
|
|
542
557
|
*
|
|
543
558
|
* @namedParams
|
|
544
559
|
* @param {Array<string>=} fabricURIs - A list of URLs for the fabric, in preference order
|
|
545
560
|
* @param {Array<string>=} ethereumURIs - A list of URLs for the blockchain, in preference order
|
|
546
561
|
* @param {Array<string>=} authServiceURIs - A list of URLs for the auth service, in preference order
|
|
562
|
+
* @param {Array<string>=} searchURIs - A list of URLs for the search nodes, in preference order
|
|
547
563
|
*
|
|
548
564
|
* @methodGroup Nodes
|
|
549
565
|
*/
|
|
@@ -553,7 +569,8 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
553
569
|
value: function SetNodes(_ref6) {
|
|
554
570
|
var fabricURIs = _ref6.fabricURIs,
|
|
555
571
|
ethereumURIs = _ref6.ethereumURIs,
|
|
556
|
-
authServiceURIs = _ref6.authServiceURIs
|
|
572
|
+
authServiceURIs = _ref6.authServiceURIs,
|
|
573
|
+
searchURIs = _ref6.searchURIs;
|
|
557
574
|
|
|
558
575
|
if (fabricURIs) {
|
|
559
576
|
this.fabricURIs = fabricURIs;
|
|
@@ -572,6 +589,10 @@ var ElvClient = /*#__PURE__*/function () {
|
|
|
572
589
|
this.AuthHttpClient.uris = authServiceURIs;
|
|
573
590
|
this.AuthHttpClient.uriIndex = 0;
|
|
574
591
|
}
|
|
592
|
+
|
|
593
|
+
if (searchURIs) {
|
|
594
|
+
this.searchURIs = searchURIs;
|
|
595
|
+
}
|
|
575
596
|
}
|
|
576
597
|
/**
|
|
577
598
|
* Return information about how the client was connected to the network
|
package/dist/src/HttpClient.js
CHANGED
|
@@ -36,8 +36,8 @@ var HttpClient = /*#__PURE__*/function () {
|
|
|
36
36
|
}
|
|
37
37
|
}, {
|
|
38
38
|
key: "BaseURI",
|
|
39
|
-
value: function BaseURI(
|
|
40
|
-
return new URI(
|
|
39
|
+
value: function BaseURI() {
|
|
40
|
+
return new URI(this.uris[this.uriIndex]);
|
|
41
41
|
}
|
|
42
42
|
}, {
|
|
43
43
|
key: "RecordWriteToken",
|
|
@@ -65,15 +65,14 @@ var HttpClient = /*#__PURE__*/function () {
|
|
|
65
65
|
key: "Request",
|
|
66
66
|
value: function () {
|
|
67
67
|
var _Request = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref2) {
|
|
68
|
-
var method, path, _ref2$queryParams, queryParams, body, _ref2$bodyType, bodyType, _ref2$headers, headers, _ref2$attempts, attempts, _ref2$failover, failover, _ref2$forceFailover, forceFailover,
|
|
68
|
+
var method, path, _ref2$queryParams, queryParams, body, _ref2$bodyType, bodyType, _ref2$headers, headers, _ref2$attempts, attempts, _ref2$failover, failover, _ref2$forceFailover, forceFailover, baseURI, writeTokenMatch, writeToken, uri, fetchParameters, response, responseType, errorBody, error;
|
|
69
69
|
|
|
70
70
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
71
71
|
while (1) {
|
|
72
72
|
switch (_context.prev = _context.next) {
|
|
73
73
|
case 0:
|
|
74
|
-
method = _ref2.method, path = _ref2.path, _ref2$queryParams = _ref2.queryParams, queryParams = _ref2$queryParams === void 0 ? {} : _ref2$queryParams, body = _ref2.body, _ref2$bodyType = _ref2.bodyType, bodyType = _ref2$bodyType === void 0 ? "JSON" : _ref2$bodyType, _ref2$headers = _ref2.headers, headers = _ref2$headers === void 0 ? {} : _ref2$headers, _ref2$attempts = _ref2.attempts, attempts = _ref2$attempts === void 0 ? 0 : _ref2$attempts, _ref2$failover = _ref2.failover, failover = _ref2$failover === void 0 ? true : _ref2$failover, _ref2$forceFailover = _ref2.forceFailover, forceFailover = _ref2$forceFailover === void 0 ? false : _ref2$forceFailover
|
|
75
|
-
|
|
76
|
-
baseURI = this.BaseURI(nodeUrl); // If URL contains a write token, it must go to the correct server and can not fail over
|
|
74
|
+
method = _ref2.method, path = _ref2.path, _ref2$queryParams = _ref2.queryParams, queryParams = _ref2$queryParams === void 0 ? {} : _ref2$queryParams, body = _ref2.body, _ref2$bodyType = _ref2.bodyType, bodyType = _ref2$bodyType === void 0 ? "JSON" : _ref2$bodyType, _ref2$headers = _ref2.headers, headers = _ref2$headers === void 0 ? {} : _ref2$headers, _ref2$attempts = _ref2.attempts, attempts = _ref2$attempts === void 0 ? 0 : _ref2$attempts, _ref2$failover = _ref2.failover, failover = _ref2$failover === void 0 ? true : _ref2$failover, _ref2$forceFailover = _ref2.forceFailover, forceFailover = _ref2$forceFailover === void 0 ? false : _ref2$forceFailover;
|
|
75
|
+
baseURI = this.BaseURI(); // If URL contains a write token, it must go to the correct server and can not fail over
|
|
77
76
|
|
|
78
77
|
writeTokenMatch = path.replace(/^\//, "").match(/(qlibs\/ilib[a-zA-Z0-9]+|q|qid)\/(tqw__[a-zA-Z0-9]+)/);
|
|
79
78
|
writeToken = writeTokenMatch ? writeTokenMatch[2] : undefined;
|
|
@@ -128,7 +127,7 @@ var HttpClient = /*#__PURE__*/function () {
|
|
|
128
127
|
break;
|
|
129
128
|
}
|
|
130
129
|
|
|
131
|
-
if (!(!writeToken &&
|
|
130
|
+
if (!(!writeToken && (failover && parseInt(response.status) >= 500 || forceFailover) && attempts < this.uris.length)) {
|
|
132
131
|
_context.next = 24;
|
|
133
132
|
break;
|
|
134
133
|
}
|
|
@@ -1428,7 +1428,6 @@ exports.CreateNonOwnerCap = /*#__PURE__*/function () {
|
|
|
1428
1428
|
* @param {object=} options -
|
|
1429
1429
|
* meta: New metadata for the object - will be merged into existing metadata if specified
|
|
1430
1430
|
* type: New type for the object - Object ID, version hash or name of type
|
|
1431
|
-
* nodeUrl: Node URL to use in HTTP call
|
|
1432
1431
|
*
|
|
1433
1432
|
* @returns {Promise<object>} - Response containing the object ID and write token of the draft, as well as URL of node handling the draft
|
|
1434
1433
|
*/
|
|
@@ -1518,28 +1517,26 @@ exports.EditContentObject = /*#__PURE__*/function () {
|
|
|
1518
1517
|
_context15.t1 = _context15.sent;
|
|
1519
1518
|
_context15.t2 = path;
|
|
1520
1519
|
_context15.t3 = options;
|
|
1521
|
-
_context15.t4 =
|
|
1522
|
-
_context15.t5 = {
|
|
1520
|
+
_context15.t4 = {
|
|
1523
1521
|
headers: _context15.t1,
|
|
1524
1522
|
method: "POST",
|
|
1525
1523
|
path: _context15.t2,
|
|
1526
|
-
body: _context15.t3
|
|
1527
|
-
nodeUrl: _context15.t4
|
|
1524
|
+
body: _context15.t3
|
|
1528
1525
|
};
|
|
1529
|
-
_context15.next =
|
|
1530
|
-
return _context15.t0.Request.call(_context15.t0, _context15.
|
|
1526
|
+
_context15.next = 33;
|
|
1527
|
+
return _context15.t0.Request.call(_context15.t0, _context15.t4);
|
|
1531
1528
|
|
|
1532
|
-
case
|
|
1529
|
+
case 33:
|
|
1533
1530
|
rawEditResponse = _context15.sent;
|
|
1534
1531
|
actualUrl = new URL(rawEditResponse.url);
|
|
1535
1532
|
actualUrl.pathname = "";
|
|
1536
1533
|
actualUrl.search = "";
|
|
1537
1534
|
actualUrl.hash = "";
|
|
1538
1535
|
nodeUrl = actualUrl.href;
|
|
1539
|
-
_context15.next =
|
|
1536
|
+
_context15.next = 41;
|
|
1540
1537
|
return this.utils.ResponseToJson(rawEditResponse);
|
|
1541
1538
|
|
|
1542
|
-
case
|
|
1539
|
+
case 41:
|
|
1543
1540
|
editResponse = _context15.sent;
|
|
1544
1541
|
// Record the node used in creating this write token
|
|
1545
1542
|
this.HttpClient.RecordWriteToken(editResponse.write_token, nodeUrl);
|
|
@@ -1548,7 +1545,7 @@ exports.EditContentObject = /*#__PURE__*/function () {
|
|
|
1548
1545
|
editResponse.nodeUrl = nodeUrl;
|
|
1549
1546
|
return _context15.abrupt("return", editResponse);
|
|
1550
1547
|
|
|
1551
|
-
case
|
|
1548
|
+
case 47:
|
|
1552
1549
|
case "end":
|
|
1553
1550
|
return _context15.stop();
|
|
1554
1551
|
}
|
package/package.json
CHANGED
package/src/ElvClient.js
CHANGED
|
@@ -138,6 +138,9 @@ class ElvClient {
|
|
|
138
138
|
* @param {string=} staticToken - Static token that will be used for all authorization in place of normal auth
|
|
139
139
|
* @param {boolean=} noCache=false - If enabled, blockchain transactions will not be cached
|
|
140
140
|
* @param {boolean=} noAuth=false - If enabled, blockchain authorization will not be performed
|
|
141
|
+
* @param {boolean=} assumeV3=false - If enabled, V3 fabric will be assumed
|
|
142
|
+
* @param {string=} service=default - The mode that determines how HttpClient will be initialized.
|
|
143
|
+
* If 'default' is set, HttpClient uris will use fabricUris. If 'search' is used, searchUris will be used
|
|
141
144
|
*
|
|
142
145
|
* @return {ElvClient} - New ElvClient connected to the specified content fabric and blockchain
|
|
143
146
|
*/
|
|
@@ -155,7 +158,8 @@ class ElvClient {
|
|
|
155
158
|
staticToken,
|
|
156
159
|
noCache=false,
|
|
157
160
|
noAuth=false,
|
|
158
|
-
assumeV3=false
|
|
161
|
+
assumeV3=false,
|
|
162
|
+
service="default"
|
|
159
163
|
}) {
|
|
160
164
|
this.utils = Utils;
|
|
161
165
|
|
|
@@ -181,6 +185,12 @@ class ElvClient {
|
|
|
181
185
|
this.noAuth = noAuth;
|
|
182
186
|
this.assumeV3 = assumeV3;
|
|
183
187
|
|
|
188
|
+
if(!["search", "default"].includes(this.service)) {
|
|
189
|
+
throw Error(`Invalid service: ${this.service}`);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
this.service = service;
|
|
193
|
+
|
|
184
194
|
this.debug = false;
|
|
185
195
|
|
|
186
196
|
this.InitializeClients({staticToken});
|
|
@@ -373,7 +383,8 @@ class ElvClient {
|
|
|
373
383
|
this.visibilityInfo = {};
|
|
374
384
|
this.inaccessibleLibraries = {};
|
|
375
385
|
|
|
376
|
-
this.
|
|
386
|
+
const uris = this.service === "search" ? this.searchURIs : this.fabricURIs;
|
|
387
|
+
this.HttpClient = new HttpClient({uris, debug: this.debug});
|
|
377
388
|
this.AuthHttpClient = new HttpClient({uris: this.authServiceURIs, debug: this.debug});
|
|
378
389
|
this.ethClient = new EthClient({client: this, uris: this.ethereumURIs, networkId: this.networkId, debug: this.debug, timeout: this.ethereumContractTimeout});
|
|
379
390
|
|
|
@@ -423,7 +434,7 @@ class ElvClient {
|
|
|
423
434
|
* @param {string} region - Preferred region - the fabric will auto-detect the best region if not specified
|
|
424
435
|
* - Available regions: as-east au-east eu-east-north eu-west-north na-east-north na-east-south na-west-north na-west-south eu-east-south eu-west-south
|
|
425
436
|
*
|
|
426
|
-
* @return {Promise<Object>} - An object containing the updated fabric and
|
|
437
|
+
* @return {Promise<Object>} - An object containing the updated fabric, ethereum, auth service, and search URLs in order of preference
|
|
427
438
|
*/
|
|
428
439
|
async UseRegion({region}) {
|
|
429
440
|
if(!this.configUrl) {
|
|
@@ -508,16 +519,17 @@ class ElvClient {
|
|
|
508
519
|
}
|
|
509
520
|
|
|
510
521
|
/**
|
|
511
|
-
* Set the client to use the specified fabric and
|
|
522
|
+
* Set the client to use the specified fabric, ethereum, auth service, and search nodes, in preference order
|
|
512
523
|
*
|
|
513
524
|
* @namedParams
|
|
514
525
|
* @param {Array<string>=} fabricURIs - A list of URLs for the fabric, in preference order
|
|
515
526
|
* @param {Array<string>=} ethereumURIs - A list of URLs for the blockchain, in preference order
|
|
516
527
|
* @param {Array<string>=} authServiceURIs - A list of URLs for the auth service, in preference order
|
|
528
|
+
* @param {Array<string>=} searchURIs - A list of URLs for the search nodes, in preference order
|
|
517
529
|
*
|
|
518
530
|
* @methodGroup Nodes
|
|
519
531
|
*/
|
|
520
|
-
SetNodes({fabricURIs, ethereumURIs, authServiceURIs}) {
|
|
532
|
+
SetNodes({fabricURIs, ethereumURIs, authServiceURIs, searchURIs}) {
|
|
521
533
|
if(fabricURIs) {
|
|
522
534
|
this.fabricURIs = fabricURIs;
|
|
523
535
|
|
|
@@ -537,6 +549,10 @@ class ElvClient {
|
|
|
537
549
|
this.AuthHttpClient.uris = authServiceURIs;
|
|
538
550
|
this.AuthHttpClient.uriIndex = 0;
|
|
539
551
|
}
|
|
552
|
+
|
|
553
|
+
if(searchURIs) {
|
|
554
|
+
this.searchURIs = searchURIs;
|
|
555
|
+
}
|
|
540
556
|
}
|
|
541
557
|
|
|
542
558
|
/**
|
|
@@ -1056,18 +1072,6 @@ class ElvClient {
|
|
|
1056
1072
|
);
|
|
1057
1073
|
}
|
|
1058
1074
|
|
|
1059
|
-
/**
|
|
1060
|
-
* Record the write token with node url to the HttpClient
|
|
1061
|
-
*
|
|
1062
|
-
* @param {string} writeToken - Write token to be cached
|
|
1063
|
-
* @param {string=} nodeUrlStr - If provided, this node url
|
|
1064
|
-
* will be associated with the provided write token, which will
|
|
1065
|
-
* be used in subsequent HTTP calls
|
|
1066
|
-
*/
|
|
1067
|
-
RecordWriteToken(writeToken, nodeUrlStr) {
|
|
1068
|
-
this.HttpClient.RecordWriteToken(writeToken, nodeUrlStr);
|
|
1069
|
-
}
|
|
1070
|
-
|
|
1071
1075
|
/* FrameClient related */
|
|
1072
1076
|
|
|
1073
1077
|
// Whitelist of methods allowed to be called using the frame API
|
package/src/FrameClient.js
CHANGED
package/src/HttpClient.js
CHANGED
|
@@ -14,8 +14,8 @@ class HttpClient {
|
|
|
14
14
|
this.draftURIs = {};
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
BaseURI(
|
|
18
|
-
return new URI(
|
|
17
|
+
BaseURI() {
|
|
18
|
+
return new URI(this.uris[this.uriIndex]);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
static Fetch(url, params={}) {
|
|
@@ -49,11 +49,9 @@ class HttpClient {
|
|
|
49
49
|
headers={},
|
|
50
50
|
attempts=0,
|
|
51
51
|
failover=true,
|
|
52
|
-
forceFailover=false
|
|
53
|
-
nodeUrl
|
|
52
|
+
forceFailover=false
|
|
54
53
|
}) {
|
|
55
|
-
|
|
56
|
-
let baseURI = this.BaseURI(nodeUrl);
|
|
54
|
+
let baseURI = this.BaseURI();
|
|
57
55
|
|
|
58
56
|
// If URL contains a write token, it must go to the correct server and can not fail over
|
|
59
57
|
const writeTokenMatch = path.replace(/^\//, "").match(/(qlibs\/ilib[a-zA-Z0-9]+|q|qid)\/(tqw__[a-zA-Z0-9]+)/);
|
|
@@ -107,7 +105,7 @@ class HttpClient {
|
|
|
107
105
|
|
|
108
106
|
if(!response.ok) {
|
|
109
107
|
// Fail over if not a write token request, the response was a server error, and we haven't tried all available nodes
|
|
110
|
-
if(!writeToken &&
|
|
108
|
+
if(!writeToken && ((failover && parseInt(response.status) >= 500) || forceFailover) && attempts < this.uris.length) {
|
|
111
109
|
// Server error - Try next node
|
|
112
110
|
this.Log(`HttpClient failing over from ${this.BaseURI()}: ${attempts + 1} attempts`, true);
|
|
113
111
|
this.uriIndex = (this.uriIndex + 1) % this.uris.length;
|
|
@@ -749,7 +749,6 @@ exports.CreateNonOwnerCap = async function({objectId, libraryId, publicKey, writ
|
|
|
749
749
|
* @param {object=} options -
|
|
750
750
|
* meta: New metadata for the object - will be merged into existing metadata if specified
|
|
751
751
|
* type: New type for the object - Object ID, version hash or name of type
|
|
752
|
-
* nodeUrl: Node URL to use in HTTP call
|
|
753
752
|
*
|
|
754
753
|
* @returns {Promise<object>} - Response containing the object ID and write token of the draft, as well as URL of node handling the draft
|
|
755
754
|
*/
|
|
@@ -779,8 +778,7 @@ exports.EditContentObject = async function({libraryId, objectId, options={}}) {
|
|
|
779
778
|
headers: await this.authClient.AuthorizationHeader({libraryId, objectId, update: true}),
|
|
780
779
|
method: "POST",
|
|
781
780
|
path: path,
|
|
782
|
-
body: options
|
|
783
|
-
nodeUrl: options.nodeUrl
|
|
781
|
+
body: options
|
|
784
782
|
});
|
|
785
783
|
|
|
786
784
|
const actualUrl = new URL(rawEditResponse.url);
|