@eluvio/elv-client-js 4.2.16 → 4.2.17

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.
Files changed (32) hide show
  1. package/dist/ElvClient-min.js +1 -1
  2. package/dist/ElvClient-node-min.js +1 -1
  3. package/dist/ElvFrameClient-min.js +1 -1
  4. package/dist/ElvPermissionsClient-min.js +1 -1
  5. package/dist/ElvWalletClient-min.js +1 -1
  6. package/dist/ElvWalletClient-node-min.js +1 -1
  7. package/dist/src/AuthorizationClient.js +2 -1
  8. package/dist/src/ContentObjectAudit.js +2 -1
  9. package/dist/src/ContentObjectVerification.js +281 -0
  10. package/dist/src/ElvClient.js +8 -9
  11. package/dist/src/FrameClient.js +1 -1
  12. package/dist/src/HttpClient.js +83 -47
  13. package/dist/src/NetworkUrls.js +8 -0
  14. package/dist/src/abr_profiles/abr_profile_live_drm.js +0 -10
  15. package/dist/src/client/ContentAccess.js +76 -85
  16. package/dist/src/client/LiveConf.js +170 -84
  17. package/dist/src/client/LiveStream.js +5205 -2118
  18. package/dist/src/live_recording_config_profiles/live_recording_config_default.js +45 -0
  19. package/package.json +3 -2
  20. package/src/FrameClient.js +23 -2
  21. package/src/abr_profiles/abr_profile_live_drm.js +0 -10
  22. package/src/client/ContentAccess.js +1 -2
  23. package/src/client/LiveConf.js +149 -65
  24. package/src/client/LiveStream.js +2592 -654
  25. package/src/live_recording_config_profiles/live_recording_config_default.js +54 -0
  26. package/src/live_recording_config_profiles/live_stream_profile_full.json +143 -0
  27. package/testScripts/StreamUpdateLinks.js +95 -0
  28. package/utilities/LiveOutputs.js +149 -0
  29. package/utilities/StreamCreate.js +53 -0
  30. package/utilities/lib/helpers.js +5 -1
  31. package/utilities/tests/mocks/ElvClient.mock.js +9 -1
  32. package/utilities/tests/unit/StreamCreate.test.js +39 -0
@@ -1775,7 +1775,8 @@ var AuthorizationClient = /*#__PURE__*/function () {
1775
1775
  throw Error("No KMS info set for ".concat(versionHash || objectId || "default KMS"));
1776
1776
  case 15:
1777
1777
  kmsHttpClient = new HttpClient({
1778
- uris: kmsUrls
1778
+ uris: kmsUrls,
1779
+ networkName: this.client.networkName
1779
1780
  });
1780
1781
  _context24.next = 18;
1781
1782
  return kmsHttpClient.Request({
@@ -69,7 +69,8 @@ var ContentObjectAudit = {
69
69
  return s.indexOf(v) === i;
70
70
  });
71
71
  httpClient = new HttpClient({
72
- uris: uris
72
+ uris: uris,
73
+ networkName: client.networkName
73
74
  });
74
75
  path = UrlJoin("qlibs", libraryId, "q", versionHash || objectId, live ? "call/live/audit" : "audit");
75
76
  _context.t4 = httpClient;
@@ -0,0 +1,281 @@
1
+ var _regeneratorRuntime = require("@babel/runtime/regenerator");
2
+ var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
3
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
4
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
5
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
6
+ var CBOR = require("cbor");
7
+ var SJCL = require("sjcl");
8
+ var MultiHash = require("multihashes");
9
+ var DeepEqual = require("deep-equal");
10
+ var Utils = require("./Utils");
11
+ var ContentObjectVerification = {
12
+ VerifyContentObject: function VerifyContentObject(_ref) {
13
+ return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
14
+ var client, libraryId, objectId, versionHash, response, partHash, qpartsResponse, partVerification, qmdHash, metadataPartHash, metadataPartResponse, metadataVerification, metadata, qstructHash, structPartHash, structPartResponse, structVerification;
15
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
16
+ while (1) switch (_context.prev = _context.next) {
17
+ case 0:
18
+ client = _ref.client, libraryId = _ref.libraryId, objectId = _ref.objectId, versionHash = _ref.versionHash;
19
+ response = {
20
+ hash: versionHash
21
+ };
22
+ partHash = Utils.DecodeVersionHash(versionHash).partHash;
23
+ _context.next = 5;
24
+ return client.QParts({
25
+ libraryId: libraryId,
26
+ objectId: objectId,
27
+ partHash: partHash,
28
+ format: "arrayBuffer"
29
+ }).then(function (response) {
30
+ return Buffer.from(response);
31
+ });
32
+ case 5:
33
+ qpartsResponse = _context.sent;
34
+ partVerification = ContentObjectVerification._VerifyPart({
35
+ partHash: partHash,
36
+ qpartsResponse: qpartsResponse
37
+ });
38
+ if (partVerification.valid) {
39
+ response.qref = {
40
+ valid: true
41
+ };
42
+ } else {
43
+ response.qref = {
44
+ valid: false,
45
+ error: partVerification.error.message
46
+ };
47
+ }
48
+ response.qref.hash = partHash;
49
+ if (!response.qref.valid) {
50
+ _context.next = 32;
51
+ break;
52
+ }
53
+ // Validate Metadata
54
+ qmdHash = partVerification.cbor.QmdHash.value;
55
+ metadataPartHash = "hqp_" + MultiHash.toB58String(qmdHash.slice(1, qmdHash.length));
56
+ _context.next = 14;
57
+ return client.QParts({
58
+ libraryId: libraryId,
59
+ objectId: objectId,
60
+ partHash: metadataPartHash,
61
+ format: "arrayBuffer"
62
+ }).then(function (response) {
63
+ return Buffer.from(response);
64
+ });
65
+ case 14:
66
+ metadataPartResponse = _context.sent;
67
+ metadataVerification = ContentObjectVerification._VerifyPart({
68
+ partHash: metadataPartHash,
69
+ qpartsResponse: metadataPartResponse
70
+ });
71
+ if (metadataVerification.valid) {
72
+ response.qmd = {
73
+ valid: true
74
+ };
75
+ } else {
76
+ response.qmd = {
77
+ valid: false,
78
+ error: metadataVerification.error.message
79
+ };
80
+ }
81
+ response.qmd.hash = metadataPartHash;
82
+ if (!(response.qmd.valid && libraryId)) {
83
+ _context.next = 23;
84
+ break;
85
+ }
86
+ _context.next = 21;
87
+ return client.ContentObjectMetadata({
88
+ libraryId: libraryId,
89
+ objectId: objectId,
90
+ versionHash: partHash.replace("hqp_", "hq__")
91
+ });
92
+ case 21:
93
+ metadata = _context.sent;
94
+ response.qmd.check = ContentObjectVerification._VerifyMetadata({
95
+ metadataCbor: metadataVerification.cbor,
96
+ metadata: metadata
97
+ });
98
+ case 23:
99
+ // Validate Qstruct
100
+ qstructHash = partVerification.cbor.QstructHash.value;
101
+ structPartHash = "hqp_" + MultiHash.toB58String(qstructHash.slice(1, qstructHash.length));
102
+ _context.next = 27;
103
+ return client.QParts({
104
+ libraryId: libraryId,
105
+ objectId: objectId,
106
+ partHash: structPartHash,
107
+ format: "arrayBuffer"
108
+ }).then(function (response) {
109
+ return Buffer.from(response);
110
+ });
111
+ case 27:
112
+ structPartResponse = _context.sent;
113
+ structVerification = ContentObjectVerification._VerifyPart({
114
+ partHash: structPartHash,
115
+ qpartsResponse: structPartResponse
116
+ });
117
+ if (structVerification.valid) {
118
+ response.qstruct = {
119
+ valid: true
120
+ };
121
+ } else {
122
+ response.qstruct = {
123
+ valid: false,
124
+ error: structVerification.error.message
125
+ };
126
+ }
127
+ response.qstruct.hash = structPartHash;
128
+ if (response.qstruct.valid) {
129
+ response.qstruct.parts = ContentObjectVerification._FormatQStruct(structVerification.cbor.Parts);
130
+ }
131
+ case 32:
132
+ response.valid = response.qref.valid && response.qmd.valid && response.qstruct.valid && (!response.qmd.check || response.qmd.check.valid);
133
+ return _context.abrupt("return", response);
134
+ case 34:
135
+ case "end":
136
+ return _context.stop();
137
+ }
138
+ }, _callee);
139
+ }))();
140
+ },
141
+ // Content verification methods //
142
+ _FormatQStruct: function _FormatQStruct(structParts) {
143
+ if (!structParts) {
144
+ return [];
145
+ }
146
+ return structParts.map(function (structPart) {
147
+ return {
148
+ hash: "hqp_" + MultiHash.toB58String(structPart.Hash.value.slice(1, structPart.Hash.length)),
149
+ size: structPart.Size
150
+ };
151
+ });
152
+ },
153
+ _Hash: function _Hash(thing) {
154
+ function fromBits(arr) {
155
+ var out = [],
156
+ bl = SJCL.bitArray.bitLength(arr),
157
+ i,
158
+ tmp;
159
+ for (i = 0; i < bl / 8; i++) {
160
+ if ((i & 3) === 0) {
161
+ tmp = arr[i / 4];
162
+ }
163
+ out.push(tmp >>> 24);
164
+ tmp <<= 8;
165
+ }
166
+ return out;
167
+ }
168
+ function toBits(bytes) {
169
+ var out = [],
170
+ i,
171
+ tmp = 0;
172
+ for (i = 0; i < bytes.length; i++) {
173
+ tmp = tmp << 8 | bytes[i];
174
+ if ((i & 3) === 3) {
175
+ out.push(tmp);
176
+ tmp = 0;
177
+ }
178
+ }
179
+ if (i & 3) {
180
+ out.push(SJCL.bitArray.partial(8 * (i & 3), tmp));
181
+ }
182
+ return out;
183
+ }
184
+ var digest = SJCL.hash.sha256.hash(toBits(thing));
185
+ var bytes = fromBits(digest);
186
+ var out = Buffer.from(bytes, "binary");
187
+ return MultiHash.toB58String(MultiHash.encode(out, "sha2-256"));
188
+ },
189
+ _ParseCBOR: function _ParseCBOR(cborResponse) {
190
+ var buffer = cborResponse.slice(7, cborResponse.length);
191
+ var hex = buffer.toString("hex");
192
+ return CBOR.decodeFirstSync(hex);
193
+ },
194
+ _VerifyPart: function _VerifyPart(_ref2) {
195
+ var partHash = _ref2.partHash,
196
+ qpartsResponse = _ref2.qpartsResponse;
197
+ try {
198
+ if (ContentObjectVerification._Hash(qpartsResponse) !== partHash.replace("hqp_", "")) {
199
+ throw Error("Hashes do not match");
200
+ }
201
+ var cbor = ContentObjectVerification._ParseCBOR(qpartsResponse);
202
+ return {
203
+ valid: true,
204
+ cbor: cbor
205
+ };
206
+ } catch (error) {
207
+ return {
208
+ valid: false,
209
+ error: error
210
+ };
211
+ }
212
+ },
213
+ _VerifyMetadata: function _VerifyMetadata(_ref3) {
214
+ var metadataCbor = _ref3.metadataCbor,
215
+ metadata = _ref3.metadata;
216
+ if (!metadataCbor) {
217
+ metadataCbor = {};
218
+ }
219
+ if (!metadata) {
220
+ metadata = {};
221
+ }
222
+ var response = {
223
+ valid: true,
224
+ invalidValues: []
225
+ };
226
+ var cborKeys = Object.keys(metadataCbor);
227
+ var metadataKeys = Object.keys(metadata);
228
+
229
+ // Find any difference between top level keys
230
+ var differentKeys = cborKeys.filter(function (x) {
231
+ return !metadataKeys.includes(x);
232
+ }).concat(metadataKeys.filter(function (x) {
233
+ return !cborKeys.includes(x);
234
+ }));
235
+ var _iterator = _createForOfIteratorHelper(differentKeys),
236
+ _step;
237
+ try {
238
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
239
+ var key = _step.value;
240
+ var cborValue = metadataCbor[key];
241
+ var metadataValue = metadata[key];
242
+ response.invalidValues.push({
243
+ key: key,
244
+ cborValue: cborValue,
245
+ metadataValue: metadataValue
246
+ });
247
+ }
248
+
249
+ // Deep comparison of up to 5 keys
250
+ } catch (err) {
251
+ _iterator.e(err);
252
+ } finally {
253
+ _iterator.f();
254
+ }
255
+ var _iterator2 = _createForOfIteratorHelper(Object.keys(metadataCbor).slice(0, 5)),
256
+ _step2;
257
+ try {
258
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
259
+ var fieldToValidate = _step2.value;
260
+ var _cborValue = metadataCbor[fieldToValidate];
261
+ var _metadataValue = metadata[fieldToValidate];
262
+ if (!DeepEqual(_cborValue, _metadataValue)) {
263
+ response.invalidValues.push({
264
+ key: fieldToValidate,
265
+ cborValue: _cborValue,
266
+ metadataValue: _metadataValue
267
+ });
268
+ }
269
+ }
270
+ } catch (err) {
271
+ _iterator2.e(err);
272
+ } finally {
273
+ _iterator2.f();
274
+ }
275
+ if (response.invalidValues.length !== 0) {
276
+ response.valid = false;
277
+ }
278
+ return response;
279
+ }
280
+ };
281
+ module.exports = ContentObjectVerification;
@@ -20,6 +20,7 @@ var HttpClient = require("./HttpClient");
20
20
  var RemoteSigner = require("./RemoteSigner");
21
21
  var Utils = require("./Utils");
22
22
  var Crypto = require("./Crypto");
23
+ var NetworkUrls = require("./NetworkUrls");
23
24
  var _require = require("./LogMessage"),
24
25
  LogMessage = _require.LogMessage;
25
26
  var Pako = require("pako");
@@ -27,13 +28,6 @@ var _require2 = require("./Validation"),
27
28
  ValidatePresence = _require2.ValidatePresence,
28
29
  ValidateWriteToken = _require2.ValidateWriteToken;
29
30
  var UrlJoin = require("url-join");
30
- var networks = {
31
- "main": "https://main.net955305.contentfabric.io",
32
- "demo": "https://demov3.net955210.contentfabric.io",
33
- "demov3": "https://demov3.net955210.contentfabric.io",
34
- "local": "http://127.0.0.1:8008/config?qspace=dev&self",
35
- "test": "https://test.net955203.contentfabric.io"
36
- };
37
31
  if (Utils.Platform() === Utils.PLATFORM_NODE) {
38
32
  // Define Response in node
39
33
  // eslint-disable-next-line no-global-assign
@@ -260,18 +254,22 @@ var ElvClient = /*#__PURE__*/function () {
260
254
  uris = this.service === "search" ? this.searchURIs : this.fabricURIs;
261
255
  this.HttpClient = new HttpClient({
262
256
  uris: uris,
257
+ networkName: this.networkName,
263
258
  debug: this.debug
264
259
  });
265
260
  this.AuthHttpClient = new HttpClient({
266
261
  uris: this.authServiceURIs,
262
+ networkName: this.networkName,
267
263
  debug: this.debug
268
264
  });
269
265
  this.FileServiceHttpClient = new HttpClient({
270
266
  uris: this.fileServiceURIs,
267
+ networkName: this.networkName,
271
268
  debug: this.debug
272
269
  });
273
270
  this.SearchHttpClient = new HttpClient({
274
271
  uris: this.searchURIs || [],
272
+ networkName: this.networkName,
275
273
  debug: this.debug
276
274
  });
277
275
  this.ethClient = new EthClient({
@@ -1489,6 +1487,7 @@ var ElvClient = /*#__PURE__*/function () {
1489
1487
  path = "/ks/jwt/wlt";
1490
1488
  httpClient = new HttpClient({
1491
1489
  uris: this.kmsURIs,
1490
+ networkName: this.networkName,
1492
1491
  debug: this.debug
1493
1492
  });
1494
1493
  _context19.next = 22;
@@ -2019,7 +2018,7 @@ var ElvClient = /*#__PURE__*/function () {
2019
2018
  }, {
2020
2019
  key: "Networks",
2021
2020
  value: function Networks() {
2022
- return Object.assign({}, networks);
2021
+ return Object.assign({}, NetworkUrls);
2023
2022
  }
2024
2023
 
2025
2024
  /**
@@ -2047,7 +2046,7 @@ var ElvClient = /*#__PURE__*/function () {
2047
2046
  while (1) switch (_context28.prev = _context28.next) {
2048
2047
  case 0:
2049
2048
  networkName = _ref31.networkName, region = _ref31.region, clientIP = _ref31.clientIP, trustAuthorityId = _ref31.trustAuthorityId, staticToken = _ref31.staticToken, _ref31$ethereumContra = _ref31.ethereumContractTimeout, ethereumContractTimeout = _ref31$ethereumContra === void 0 ? 10 : _ref31$ethereumContra, _ref31$noCache = _ref31.noCache, noCache = _ref31$noCache === void 0 ? false : _ref31$noCache, _ref31$noAuth = _ref31.noAuth, noAuth = _ref31$noAuth === void 0 ? false : _ref31$noAuth, assumeV3 = _ref31.assumeV3;
2050
- configUrl = networks[networkName];
2049
+ configUrl = this.Networks()[networkName];
2051
2050
  if (configUrl) {
2052
2051
  _context28.next = 4;
2053
2052
  break;
@@ -449,7 +449,7 @@ var FrameClient = /*#__PURE__*/function () {
449
449
  }, {
450
450
  key: "AllowedMethods",
451
451
  value: function AllowedMethods() {
452
- return ["AccessGroupManagers", "AccessGroupMembers", "AccessGroupOwner", "AccessInfo", "AccessRequest", "AccessType", "AddAccessGroupManager", "AddAccessGroupMember", "AddContentLibraryGroup", "AddContentObjectGroupPermission", "AddLibraryContentType", "AssetMetadata", "AuditContentObject", "AuditStream", "AvailableDRMs", "AvailableOfferings", "AwaitPending", "BitmovinPlayoutOptions", "BlockNumber", "CallBitcodeMethod", "CallContractMethod", "CallContractMethodAndWait", "ClearCache", "ClearStaticToken", "Collection", "CollectionTransactions", "ConfigUrl", "ContentLibraries", "ContentLibrary", "ContentLibraryGroupPermissions", "ContentLibraryOwner", "ContentObject", "ContentObjectAccessComplete", "ContentObjectGraph", "ContentObjectGroupPermissions", "ContentObjectImageUrl", "ContentObjectLibraryId", "ContentObjectMetadata", "ContentObjectOwner", "ContentObjectTenantId", "ContentObjectVersions", "ContentObjects", "ContentPart", "ContentParts", "ContentSpaceId", "ContentType", "ContentTypeOwner", "ContentTypes", "ContractAbi", "ContractEvents", "ContractInfo", "ContractMetadata", "ContractName", "CopyContentObject", "CreateABRMezzanine", "CreateAccessGroup", "CreateAndFinalizeContentObject", "CreateAuthorizationToken", "CreateContentLibrary", "CreateContentObject", "CreateContentType", "CreateEncryptionConk", "CreateFabricToken", "CreateFileDirectories", "CreateFileUploadJob", "CreateLinks", "CreateNTPInstance", "CreateNonOwnerCap", "CreatePart", "CreateProductionMaster", "CreateShare", "CreateSignedMessageJSON", "CreateSignedToken", "CreateStaticToken", "CurrentAccountAddress", "CustomContractAddress", "DecodeSignedMessageJSON", "Decrypt", "DecryptECIES", "DefaultKMSAddress", "DeleteAccessGroup", "DeleteContentLibrary", "DeleteContentObject", "DeleteContentVersion", "DeleteFiles", "DeleteMetadata", "DeleteNTPInstance", "DeletePart", "DeleteWriteToken", "DeployContract", "Download", "DownloadEncrypted", "DownloadFile", "DownloadPart", "EditAndFinalizeContentObject", "EditContentObject", "EmbedUrl", "Encrypt", "EncryptECIES", "EncryptionConk", "Events", "ExtractEventFromLogs", "ExtractValueFromEvent", "FabricUrl", "FileUrl", "FinalizeABRMezzanine", "FinalizeContentObject", "FinalizePart", "FinalizeStateChannelAccess", "FinalizeUploadJob", "FormatContractArguments", "GenerateStateChannelToken", "GenerateSignedLinkToken", "GetBalance", "GlobalUrl", "InitializeAuthPolicy", "IssueNTPCode", "IssueSignedNTPCode", "LatestVersionHash", "LibraryContentTypes", "LinkAccessGroupToOauth", "LinkData", "LinkTarget", "LinkUrl", "ListAccessGroups", "ListFiles", "ListNTPInstances", "LRODraftInfo", "LROStatus", "MakeAuthServiceRequest", "MakeFileServiceRequest", "MergeContractMetadata", "MergeMetadata", "MetadataAuth", "MintNFT", "MoveFiles", "NetworkInfo", "NodeId", "Nodes", "NTPInstance", "ObjectCleanup", "Permission", "PlayoutOptions", "PlayoutPathResolution", "ProduceMetadataLinks", "Proofs", "PublicRep", "PublishContentVersion", "QParts", "RecordWriteToken", "RedeemCode", "RedeemShareToken", "RemoveAccessGroupManager", "RemoveAccessGroupMember", "RemoveContentObjectGroupPermission", "RemoveContentLibraryGroup", "RemoveLibraryContentType", "Rep", "ReplaceContractMetadata", "ReplaceMetadata", "Request", "ResetRegion", "ResetTenantId", "RevokeShare", "SendFunds", "SetAccessCharge", "SetAuth", "SetAuthContext", "SetAuthPolicy", "SetContentLibraryImage", "SetContentObjectImage", "SetCustomContentContract", "SetGroupPermission", "SetNodes", "SetOauthToken", "SetPolicyAuthorization", "SetSignerFromOauthToken", "SetStaticToken", "SetTenantContractId", "SetTenantId", "TenantAdminGroup", "ContentAdminGroup", "TenantUsersGroup", "SetVisibility", "SetPermission", "ShareInfo", "Shares", "SpaceNodes", "StartABRMezzanineJobs", "StreamAddWatermark", "StreamConfig", "StreamCopyToVod", "StreamCreate", "StreamInitialize", "StreamInsertion", "StreamListUrls", "StreamRemoveWatermark", "StreamSetOfferingAndDRM", "StreamStatus", "StreamStartOrStopOrReset", "StreamStopSession", "SuspendNTPInstance", "TenantContractId", "TenantId", "UnlinkAccessGroupFromOauth", "UpdateContentObjectGraph", "UpdateNTPInstance", "UpdateShare", "UploadFileData", "UploadFilesFromS3", "UploadJobStatus", "UploadPart", "UploadPartChunk", "UploadStatus", "UseRegion", "Visibility", "WriteTokenNodeUrlLocal", "WriteTokenNodeUrlNetwork"];
452
+ return ["AccessGroupManagers", "AccessGroupMembers", "AccessGroupOwner", "AccessInfo", "AccessRequest", "AccessType", "AddAccessGroupManager", "AddAccessGroupMember", "AddContentLibraryGroup", "AddContentObjectGroupPermission", "AddLibraryContentType", "AssetMetadata", "AuditContentObject", "AuditStream", "AvailableDRMs", "AvailableOfferings", "AwaitPending", "BitmovinPlayoutOptions", "BlockNumber", "CallBitcodeMethod", "CallContractMethod", "CallContractMethodAndWait", "ClearCache", "ClearStaticToken", "Collection", "CollectionTransactions", "ConfigUrl", "ContentLibraries", "ContentLibrary", "ContentLibraryGroupPermissions", "ContentLibraryOwner", "ContentObject", "ContentObjectAccessComplete", "ContentObjectGraph", "ContentObjectGroupPermissions", "ContentObjectImageUrl", "ContentObjectLibraryId", "ContentObjectMetadata", "ContentObjectOwner", "ContentObjectTenantId", "ContentObjectVersions", "ContentObjects", "ContentPart", "ContentParts", "ContentSpaceId", "ContentType", "ContentTypeOwner", "ContentTypes", "ContractAbi", "ContractEvents", "ContractInfo", "ContractMetadata", "ContractName", "CopyContentObject", "CreateABRMezzanine", "CreateAccessGroup", "CreateAndFinalizeContentObject", "CreateAuthorizationToken", "CreateContentLibrary", "CreateContentObject", "CreateContentType", "CreateEncryptionConk", "CreateFabricToken", "CreateFileDirectories", "CreateFileUploadJob", "CreateLinks", "CreateNTPInstance", "CreateNonOwnerCap", "CreatePart", "CreateProductionMaster", "CreateShare", "CreateSignedMessageJSON", "CreateSignedToken", "CreateStaticToken", "CurrentAccountAddress", "CustomContractAddress", "DecodeSignedMessageJSON", "Decrypt", "DecryptECIES", "DefaultKMSAddress", "DeleteAccessGroup", "DeleteContentLibrary", "DeleteContentObject", "DeleteContentVersion", "DeleteFiles", "DeleteMetadata", "DeleteNTPInstance", "DeletePart", "DeleteWriteToken", "DeployContract", "Download", "DownloadEncrypted", "DownloadFile", "DownloadPart", "EditAndFinalizeContentObject", "EditContentObject", "EmbedUrl", "Encrypt", "EncryptECIES", "EncryptionConk", "Events", "ExtractEventFromLogs", "ExtractValueFromEvent", "FabricUrl", "FileUrl", "FinalizeABRMezzanine", "FinalizeContentObject", "FinalizePart", "FinalizeStateChannelAccess", "FinalizeUploadJob", "FormatContractArguments", "GenerateStateChannelToken", "GenerateSignedLinkToken", "GetBalance", "GlobalUrl", "InitializeAuthPolicy", "IssueNTPCode", "IssueSignedNTPCode", "LatestVersionHash", "LibraryContentTypes", "LinkAccessGroupToOauth", "LinkData", "LinkTarget", "LinkUrl", "ListAccessGroups", "ListFiles", "ListNTPInstances", "LRODraftInfo", "LROStatus", "MakeAuthServiceRequest", "MakeFileServiceRequest", "MergeContractMetadata", "MergeMetadata", "MetadataAuth", "MintNFT", "MoveFiles", "NetworkInfo", "NodeId", "Nodes", "NTPInstance", "ObjectCleanup", "OutputsCreate", "OutputsDelete", "OutputsList", "OutputsListItem", "OutputsModify", "OutputsModifyBatch", "OutputsResolveSrtPullUrls", "OutputsState", "OutputsStop", "Permission", "PlayoutOptions", "PlayoutPathResolution", "ProduceMetadataLinks", "Proofs", "PublicRep", "PublishContentVersion", "QParts", "RecordWriteToken", "RedeemCode", "RedeemShareToken", "RemoveAccessGroupManager", "RemoveAccessGroupMember", "RemoveContentObjectGroupPermission", "RemoveContentLibraryGroup", "RemoveLibraryContentType", "Rep", "ReplaceContractMetadata", "ReplaceMetadata", "Request", "ResetRegion", "ResetTenantId", "RevokeShare", "SendFunds", "SetAccessCharge", "StreamApplyProfile", "SetAuth", "SetAuthContext", "SetAuthPolicy", "SetContentLibraryImage", "SetContentObjectImage", "SetCustomContentContract", "SetGroupPermission", "SetNodes", "SetOauthToken", "SetPolicyAuthorization", "SetSignerFromOauthToken", "SetStaticToken", "SetTenantContractId", "SetTenantId", "TenantAdminGroup", "ContentAdminGroup", "TenantUsersGroup", "SetVisibility", "SetPermission", "ShareInfo", "Shares", "SpaceNodes", "StartABRMezzanineJobs", "StreamAddWatermark", "StreamApplyProfile", "StreamAssignProfile", "StreamConfig", "StreamConfigProfile", "StreamConfigProfiles", "StreamCopyToVod", "StreamCreate", "StreamInitialize", "StreamInsertion", "StreamLinkToSite", "StreamListUrls", "StreamRemoveLinkToSite", "StreamRemoveWatermark", "StreamSaveConfigProfile", "StreamSetOfferingAndDRM", "StreamSiteSettings", "StreamStartRecording", "StreamStartOrStopOrReset", "StreamStatus", "StreamStopRecording", "StreamUnassignProfile", "StreamUpdateConfig", "SuspendNTPInstance", "TenantContractId", "TenantId", "UnlinkAccessGroupFromOauth", "UpdateContentObjectGraph", "UpdateNTPInstance", "UpdateShare", "UploadFileData", "UploadFilesFromS3", "UploadJobStatus", "UploadPart", "UploadPartChunk", "UploadStatus", "UseRegion", "Visibility", "WriteTokenNodeUrlLocal", "WriteTokenNodeUrlNetwork"];
453
453
  }
454
454
  }, {
455
455
  key: "AllowedUserProfileMethods",
@@ -7,17 +7,21 @@ var _Fetch = typeof fetch !== "undefined" ? fetch : require("node-fetch")["defau
7
7
  var _require = require("./LogMessage"),
8
8
  LogMessage = _require.LogMessage;
9
9
  var Utils = require("./Utils");
10
+ var UrlJoin = require("url-join");
11
+ var NetworkUrls = require("./NetworkUrls");
10
12
  var HttpClient = /*#__PURE__*/function () {
11
13
  "use strict";
12
14
 
13
15
  function HttpClient(_ref) {
14
16
  var uris = _ref.uris,
17
+ networkName = _ref.networkName,
15
18
  debug = _ref.debug;
16
19
  _classCallCheck(this, HttpClient);
17
20
  this.uris = uris;
18
21
  this.uriIndex = 0;
19
22
  this.debug = debug;
20
23
  this.draftURIs = {};
24
+ this.networkName = networkName;
21
25
  this.retries = Math.max(3, uris.length);
22
26
  }
23
27
  _createClass(HttpClient, [{
@@ -67,7 +71,7 @@ var HttpClient = /*#__PURE__*/function () {
67
71
  key: "Request",
68
72
  value: function () {
69
73
  var _Request = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref3) {
70
- var method, path, _ref3$queryParams, queryParams, body, _ref3$bodyType, bodyType, _ref3$headers, headers, _ref3$attempts, attempts, _ref3$allowFailover, allowFailover, _ref3$forceFailover, forceFailover, _ref3$allowRetry, allowRetry, uriIndex, baseURI, writeTokenMatch, writeToken, uri, fetchParameters, response, responseType, errorBody, error;
74
+ var method, path, _ref3$queryParams, queryParams, body, _ref3$bodyType, bodyType, _ref3$headers, headers, _ref3$attempts, attempts, _ref3$allowFailover, allowFailover, _ref3$forceFailover, forceFailover, _ref3$allowRetry, allowRetry, uriIndex, baseURI, writeTokenMatch, writeToken, configUrl, uri, fetchParameters, response, responseType, errorBody, error;
71
75
  return _regeneratorRuntime.wrap(function _callee$(_context) {
72
76
  while (1) switch (_context.prev = _context.next) {
73
77
  case 0:
@@ -75,16 +79,48 @@ var HttpClient = /*#__PURE__*/function () {
75
79
  baseURI = this.BaseURI(uriIndex); // If URL contains a write token, it must go to the correct server and can not fail over
76
80
  writeTokenMatch = path.replace(/^\//, "").match(/(qlibs\/ilib[a-zA-Z0-9]+|q|qid)\/(tqw__[a-zA-Z0-9]+)/);
77
81
  writeToken = writeTokenMatch ? writeTokenMatch[2] : undefined;
78
- if (writeToken) {
79
- allowFailover = false;
80
- if (this.draftURIs[writeToken]) {
81
- // Use saved write token URI
82
- baseURI = this.draftURIs[writeToken];
83
- } else {
84
- // Save current URI for all future requests involving this write token
85
- this.draftURIs[writeToken] = baseURI;
86
- }
82
+ if (!writeToken) {
83
+ _context.next = 29;
84
+ break;
85
+ }
86
+ allowFailover = false;
87
+ if (!this.draftURIs[writeToken]) {
88
+ _context.next = 10;
89
+ break;
90
+ }
91
+ // Use saved write token URI
92
+ baseURI = this.draftURIs[writeToken];
93
+ _context.next = 29;
94
+ break;
95
+ case 10:
96
+ if (!this.networkName) {
97
+ _context.next = 28;
98
+ break;
87
99
  }
100
+ _context.prev = 11;
101
+ configUrl = new URL(NetworkUrls[this.networkName]);
102
+ configUrl.pathname = UrlJoin("/s", this.networkName, "nodes");
103
+ configUrl.searchParams.set("token", writeToken);
104
+ _context.t0 = URI;
105
+ _context.next = 18;
106
+ return fetch(configUrl);
107
+ case 18:
108
+ _context.next = 20;
109
+ return _context.sent.json();
110
+ case 20:
111
+ _context.t1 = _context.sent.nodes[0].services.fabric_api.urls[0];
112
+ baseURI = new _context.t0(_context.t1);
113
+ _context.next = 28;
114
+ break;
115
+ case 24:
116
+ _context.prev = 24;
117
+ _context.t2 = _context["catch"](11);
118
+ this.Log("Failed to retrieve write token node for " + writeToken);
119
+ this.Log(_context.t2);
120
+ case 28:
121
+ // Save current URI for all future requests involving this write token
122
+ this.draftURIs[writeToken] = baseURI;
123
+ case 29:
88
124
  uri = baseURI.path(path).query(queryParams).hash("");
89
125
  fetchParameters = {
90
126
  method: method,
@@ -101,50 +137,50 @@ var HttpClient = /*#__PURE__*/function () {
101
137
  this.Log("".concat(method, " - ").concat(uri.toString()));
102
138
  this.Log("fetchParameters: ".concat(JSON.stringify(fetchParameters, null, 2)));
103
139
  }
104
- _context.prev = 9;
105
- _context.next = 12;
140
+ _context.prev = 33;
141
+ _context.next = 36;
106
142
  return HttpClient.Fetch(uri.toString(), fetchParameters);
107
- case 12:
143
+ case 36:
108
144
  response = _context.sent;
109
- _context.next = 18;
145
+ _context.next = 42;
110
146
  break;
111
- case 15:
112
- _context.prev = 15;
113
- _context.t0 = _context["catch"](9);
147
+ case 39:
148
+ _context.prev = 39;
149
+ _context.t3 = _context["catch"](33);
114
150
  response = {
115
151
  ok: false,
116
- status: _context.t0 && _context.t0.status || 500,
117
- statusText: "ElvClient Error: " + _context.t0.message,
152
+ status: _context.t3 && _context.t3.status || 500,
153
+ statusText: "ElvClient Error: " + _context.t3.message,
118
154
  url: uri.toString(),
119
- error: _context.t0
155
+ error: _context.t3
120
156
  };
121
- case 18:
157
+ case 42:
122
158
  if (response.ok) {
123
- _context.next = 47;
159
+ _context.next = 71;
124
160
  break;
125
161
  }
126
162
  if (!((parseInt(response.status) >= 500 || forceFailover) && allowRetry && attempts < this.retries)) {
127
- _context.next = 31;
163
+ _context.next = 55;
128
164
  break;
129
165
  }
130
166
  if (!allowFailover) {
131
- _context.next = 25;
167
+ _context.next = 49;
132
168
  break;
133
169
  }
134
170
  // Fail over to alternate node
135
171
  this.uriIndex = (this.uriIndex + 1) % this.uris.length;
136
172
  this.Log("HttpClient failing over from ".concat(baseURI.toString(), ": ").concat(attempts + 1, " attempts"), true);
137
- _context.next = 28;
173
+ _context.next = 52;
138
174
  break;
139
- case 25:
175
+ case 49:
140
176
  // Wait and retry
141
177
  this.Log("HttpClient retrying request from ".concat(baseURI.toString(), ": ").concat(attempts + 1, " attempts"), true);
142
- _context.next = 28;
178
+ _context.next = 52;
143
179
  return new Promise(function (resolve) {
144
180
  return setTimeout(resolve, 1000);
145
181
  });
146
- case 28:
147
- _context.next = 30;
182
+ case 52:
183
+ _context.next = 54;
148
184
  return this.Request({
149
185
  method: method,
150
186
  path: path,
@@ -156,34 +192,34 @@ var HttpClient = /*#__PURE__*/function () {
156
192
  uriIndex: uriIndex,
157
193
  forceFailover: forceFailover
158
194
  });
159
- case 30:
195
+ case 54:
160
196
  return _context.abrupt("return", _context.sent);
161
- case 31:
197
+ case 55:
162
198
  // Parse JSON error if headers indicate JSON
163
199
  responseType = response.headers ? response.headers.get("content-type") || "" : "";
164
200
  errorBody = "";
165
201
  if (!(response.text && response.json)) {
166
- _context.next = 44;
202
+ _context.next = 68;
167
203
  break;
168
204
  }
169
205
  if (!responseType.includes("application/json")) {
170
- _context.next = 40;
206
+ _context.next = 64;
171
207
  break;
172
208
  }
173
- _context.next = 37;
209
+ _context.next = 61;
174
210
  return response.json();
175
- case 37:
176
- _context.t1 = _context.sent;
177
- _context.next = 43;
211
+ case 61:
212
+ _context.t4 = _context.sent;
213
+ _context.next = 67;
178
214
  break;
179
- case 40:
180
- _context.next = 42;
215
+ case 64:
216
+ _context.next = 66;
181
217
  return response.text();
182
- case 42:
183
- _context.t1 = _context.sent;
184
- case 43:
185
- errorBody = _context.t1;
186
- case 44:
218
+ case 66:
219
+ _context.t4 = _context.sent;
220
+ case 67:
221
+ errorBody = _context.t4;
222
+ case 68:
187
223
  error = {
188
224
  name: "ElvHttpClientError",
189
225
  status: response.status,
@@ -196,14 +232,14 @@ var HttpClient = /*#__PURE__*/function () {
196
232
  };
197
233
  if (this.debug) this.Log(JSON.stringify(error, null, 2), true);
198
234
  throw error;
199
- case 47:
235
+ case 71:
200
236
  this.Log("".concat(response.status, " - ").concat(method, " ").concat(uri.toString()));
201
237
  return _context.abrupt("return", response);
202
- case 49:
238
+ case 73:
203
239
  case "end":
204
240
  return _context.stop();
205
241
  }
206
- }, _callee, this, [[9, 15]]);
242
+ }, _callee, this, [[11, 24], [33, 39]]);
207
243
  }));
208
244
  function Request(_x) {
209
245
  return _Request.apply(this, arguments);
@@ -0,0 +1,8 @@
1
+ var networks = {
2
+ "main": "https://main.net955305.contentfabric.io",
3
+ "demo": "https://demov3.net955210.contentfabric.io",
4
+ "demov3": "https://demov3.net955210.contentfabric.io",
5
+ "local": "http://127.0.0.1:8008/config?qspace=dev&self",
6
+ "test": "https://test.net955203.contentfabric.io"
7
+ };
8
+ module.exports = networks;
@@ -1578,16 +1578,6 @@ var AbrProfileLiveDrm = {
1578
1578
  }
1579
1579
  },
1580
1580
  "playout_formats": {
1581
- "dash-playready-cenc": {
1582
- "drm": {
1583
- "enc_scheme_name": "cenc",
1584
- "type": "DrmPlayReady"
1585
- },
1586
- "protocol": {
1587
- "min_buffer_length": 2,
1588
- "type": "ProtoDash"
1589
- }
1590
- },
1591
1581
  "dash-widevine": {
1592
1582
  "drm": {
1593
1583
  "content_id": "",