@eluvio/elv-client-js 4.0.80 → 4.0.82
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 +14 -13
- package/dist/ElvClient-node-min.js +14 -13
- package/dist/ElvFrameClient-min.js +9 -9
- package/dist/ElvPermissionsClient-min.js +10 -10
- package/dist/ElvWalletClient-min.js +14 -13
- package/dist/ElvWalletClient-node-min.js +14 -13
- package/dist/src/AuthorizationClient.js +4 -5
- package/dist/src/Crypto.js +2 -2
- package/dist/src/ElvClient.js +2 -2
- package/dist/src/EthClient.js +2 -2
- package/dist/src/FrameClient.js +2 -2
- package/dist/src/PermissionsClient.js +2 -2
- package/dist/src/Utils.js +2 -2
- package/dist/src/client/ABRPublishing.js +2 -2
- package/dist/src/client/AccessGroups.js +2 -2
- package/dist/src/client/ContentAccess.js +821 -757
- package/dist/src/client/ContentManagement.js +37 -5
- package/dist/src/client/Contracts.js +2 -2
- package/dist/src/client/Files.js +2 -2
- package/dist/src/client/LiveConf.js +27 -5
- package/dist/src/client/LiveStream.js +1 -1
- package/dist/src/client/NFT.js +2 -2
- package/dist/src/walletClient/ClientMethods.js +2 -2
- package/dist/src/walletClient/Profile.js +2 -2
- package/dist/src/walletClient/Utils.js +2 -2
- package/dist/src/walletClient/index.js +2 -2
- package/package.json +1 -1
- package/src/client/ContentAccess.js +37 -1
- package/src/client/ContentManagement.js +16 -1
- package/src/client/LiveConf.js +26 -5
- package/src/client/LiveStream.js +1 -1
|
@@ -2,8 +2,8 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
2
2
|
var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
3
3
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
4
4
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
5
|
-
function ownKeys(
|
|
6
|
-
function _objectSpread(
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
7
|
/**
|
|
8
8
|
* Methods for managing content types, libraries and objects
|
|
9
9
|
*
|
|
@@ -1711,7 +1711,7 @@ exports.FinalizeContentObject = /*#__PURE__*/function () {
|
|
|
1711
1711
|
*/
|
|
1712
1712
|
exports.PublishContentVersion = /*#__PURE__*/function () {
|
|
1713
1713
|
var _ref38 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee21(_ref37) {
|
|
1714
|
-
var objectId, versionHash, _ref37$awaitCommitCon, awaitCommitConfirmation, commit, abi, fromBlock, objectHash, pendingHash, pollingInterval, events, confirmEvent;
|
|
1714
|
+
var objectId, versionHash, _ref37$awaitCommitCon, awaitCommitConfirmation, commit, abi, fromBlock, objectHash, pendingHash, pollingInterval, events, confirmEvent, _pollingInterval, tries, h;
|
|
1715
1715
|
return _regeneratorRuntime.wrap(function _callee21$(_context21) {
|
|
1716
1716
|
while (1) switch (_context21.prev = _context21.next) {
|
|
1717
1717
|
case 0:
|
|
@@ -1793,12 +1793,44 @@ exports.PublishContentVersion = /*#__PURE__*/function () {
|
|
|
1793
1793
|
break;
|
|
1794
1794
|
}
|
|
1795
1795
|
// Found confirmation
|
|
1796
|
-
this.Log("Commit confirmed: ".concat(objectHash));
|
|
1796
|
+
this.Log("Commit confirmed on chain: ".concat(objectHash));
|
|
1797
1797
|
return _context21.abrupt("break", 34);
|
|
1798
1798
|
case 32:
|
|
1799
1799
|
_context21.next = 22;
|
|
1800
1800
|
break;
|
|
1801
1801
|
case 34:
|
|
1802
|
+
if (!awaitCommitConfirmation) {
|
|
1803
|
+
_context21.next = 48;
|
|
1804
|
+
break;
|
|
1805
|
+
}
|
|
1806
|
+
_pollingInterval = 500; // ms
|
|
1807
|
+
tries = 20;
|
|
1808
|
+
case 37:
|
|
1809
|
+
if (!(tries > 0)) {
|
|
1810
|
+
_context21.next = 48;
|
|
1811
|
+
break;
|
|
1812
|
+
}
|
|
1813
|
+
_context21.next = 40;
|
|
1814
|
+
return this.LatestVersionHashV2({
|
|
1815
|
+
objectId: objectId
|
|
1816
|
+
});
|
|
1817
|
+
case 40:
|
|
1818
|
+
h = _context21.sent;
|
|
1819
|
+
if (!(h == versionHash)) {
|
|
1820
|
+
_context21.next = 44;
|
|
1821
|
+
break;
|
|
1822
|
+
}
|
|
1823
|
+
this.Log("Commit confirmed on fabric node: ".concat(versionHash));
|
|
1824
|
+
return _context21.abrupt("break", 48);
|
|
1825
|
+
case 44:
|
|
1826
|
+
_context21.next = 46;
|
|
1827
|
+
return new Promise(function (resolve) {
|
|
1828
|
+
return setTimeout(resolve, _pollingInterval);
|
|
1829
|
+
});
|
|
1830
|
+
case 46:
|
|
1831
|
+
_context21.next = 37;
|
|
1832
|
+
break;
|
|
1833
|
+
case 48:
|
|
1802
1834
|
case "end":
|
|
1803
1835
|
return _context21.stop();
|
|
1804
1836
|
}
|
|
@@ -2226,7 +2258,7 @@ exports.UpdateContentObjectGraph = /*#__PURE__*/function () {
|
|
|
2226
2258
|
return _context30.delegateYield(_loop(), "t0", 8);
|
|
2227
2259
|
case 8:
|
|
2228
2260
|
_ret = _context30.t0;
|
|
2229
|
-
if (!
|
|
2261
|
+
if (!_ret) {
|
|
2230
2262
|
_context30.next = 11;
|
|
2231
2263
|
break;
|
|
2232
2264
|
}
|
|
@@ -2,8 +2,8 @@ var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
|
2
2
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
3
3
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
4
4
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
5
|
-
function ownKeys(
|
|
6
|
-
function _objectSpread(
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
7
|
/**
|
|
8
8
|
* Methods for deploying and interacting with contracts
|
|
9
9
|
*
|
package/dist/src/client/Files.js
CHANGED
|
@@ -2,8 +2,8 @@ var _toConsumableArray = require("@babel/runtime/helpers/toConsumableArray");
|
|
|
2
2
|
var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
3
3
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
4
4
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
5
|
-
function ownKeys(
|
|
6
|
-
function _objectSpread(
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
7
|
/**
|
|
8
8
|
* Methods for accessing and managing access groups
|
|
9
9
|
*
|
|
@@ -216,6 +216,18 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
216
216
|
|
|
217
217
|
return seg;
|
|
218
218
|
}
|
|
219
|
+
|
|
220
|
+
/*
|
|
221
|
+
* Calculate output timebase from the encoder (codec) timebase. The videoTimeBase parameter
|
|
222
|
+
* represents the encoder timebase. The format muxer will change it so it is greater than 10000.
|
|
223
|
+
*/
|
|
224
|
+
}, {
|
|
225
|
+
key: "calcOutputTimebase",
|
|
226
|
+
value: function calcOutputTimebase(codecTimebase) {
|
|
227
|
+
var outputTimebase = codecTimebase;
|
|
228
|
+
while (outputTimebase < 10000) outputTimebase = outputTimebase * 2;
|
|
229
|
+
return outputTimebase;
|
|
230
|
+
}
|
|
219
231
|
}, {
|
|
220
232
|
key: "calcSegDurationMpegts",
|
|
221
233
|
value: function calcSegDurationMpegts(_ref2) {
|
|
@@ -280,7 +292,9 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
280
292
|
var seg = {};
|
|
281
293
|
switch (frameRate) {
|
|
282
294
|
case "24":
|
|
283
|
-
seg.
|
|
295
|
+
seg.videoTimeBase = 1536; // Output timebase: 12288
|
|
296
|
+
seg.videoFrameDurationTs = 512;
|
|
297
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
284
298
|
seg.keyint = 48;
|
|
285
299
|
seg.duration = "30";
|
|
286
300
|
break;
|
|
@@ -290,7 +304,9 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
290
304
|
seg.duration = "30";
|
|
291
305
|
break;
|
|
292
306
|
case "30":
|
|
293
|
-
seg.
|
|
307
|
+
seg.videoTimeBase = 960; // Output timebase: 15360
|
|
308
|
+
seg.videoFrameDurationTs = 512;
|
|
309
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
294
310
|
seg.keyint = 60;
|
|
295
311
|
seg.duration = "30";
|
|
296
312
|
break;
|
|
@@ -300,7 +316,9 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
300
316
|
seg.duration = "30.03";
|
|
301
317
|
break;
|
|
302
318
|
case "48":
|
|
303
|
-
seg.
|
|
319
|
+
seg.videoTimeBase = 1536; // Output timebase: 12288
|
|
320
|
+
seg.videoFrameDurationTs = 256;
|
|
321
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
304
322
|
seg.keyint = 96;
|
|
305
323
|
seg.duration = "30";
|
|
306
324
|
break;
|
|
@@ -310,7 +328,9 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
310
328
|
seg.duration = "30";
|
|
311
329
|
break;
|
|
312
330
|
case "60":
|
|
313
|
-
seg.
|
|
331
|
+
seg.videoTimeBase = 960; // Output timebase: 15360
|
|
332
|
+
seg.videoFrameDurationTs = 256;
|
|
333
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
314
334
|
seg.keyint = 120;
|
|
315
335
|
seg.duration = "30";
|
|
316
336
|
break;
|
|
@@ -413,7 +433,9 @@ var LiveConf = /*#__PURE__*/function () {
|
|
|
413
433
|
// Optional override output timebase and frame duration (ts)
|
|
414
434
|
if (segDurations.videoTimeBase) {
|
|
415
435
|
conf.live_recording.recording_config.recording_params.xc_params.video_time_base = segDurations.videoTimeBase;
|
|
416
|
-
|
|
436
|
+
|
|
437
|
+
// Note 'source_timescale' needs to be set to the output timebase and is used by playout
|
|
438
|
+
conf.live_recording.recording_config.recording_params.source_timescale = this.calcOutputTimebase(segDurations.videoTimeBase);
|
|
417
439
|
}
|
|
418
440
|
if (segDurations.videoFrameDurationTs) {
|
|
419
441
|
conf.live_recording.recording_config.recording_params.xc_params.video_frame_duration_ts = segDurations.videoFrameDurationTs;
|
|
@@ -1652,7 +1652,7 @@ exports.StreamConfig = /*#__PURE__*/function () {
|
|
|
1652
1652
|
// Get node URI from user config
|
|
1653
1653
|
hostName = userConfig.url.replace("udp://", "").replace("rtmp://", "").replace("srt://", "").split(":")[0];
|
|
1654
1654
|
streamUrl = new URL(userConfig.url);
|
|
1655
|
-
console.log("Retrieving nodes
|
|
1655
|
+
console.log("Retrieving nodes - matching", hostName);
|
|
1656
1656
|
_context11.next = 21;
|
|
1657
1657
|
return this.SpaceNodes({
|
|
1658
1658
|
matchEndpoint: hostName
|
package/dist/src/client/NFT.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
2
2
|
var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
3
3
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
4
|
-
function ownKeys(
|
|
5
|
-
function _objectSpread(
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
6
|
/**
|
|
7
7
|
* Methods for creating and managing NFTs
|
|
8
8
|
*
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
2
2
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
3
3
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
4
|
-
function ownKeys(
|
|
5
|
-
function _objectSpread(
|
|
4
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
5
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
6
6
|
var Utils = require("../Utils");
|
|
7
7
|
var UrlJoin = require("url-join");
|
|
8
8
|
var _require = require("./Utils"),
|
|
@@ -2,8 +2,8 @@ var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
|
2
2
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
3
3
|
var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
4
4
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
5
|
-
function ownKeys(
|
|
6
|
-
function _objectSpread(
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
7
|
var Utils = require("../Utils");
|
|
8
8
|
var UrlJoin = require("url-join");
|
|
9
9
|
var StateStorePath = function StateStorePath(_ref) {
|
|
@@ -2,8 +2,8 @@ var _regeneratorRuntime = require("@babel/runtime/regenerator");
|
|
|
2
2
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
3
3
|
var _defineProperty = require("@babel/runtime/helpers/defineProperty");
|
|
4
4
|
var _slicedToArray = require("@babel/runtime/helpers/slicedToArray");
|
|
5
|
-
function ownKeys(
|
|
6
|
-
function _objectSpread(
|
|
5
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
6
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
7
7
|
var Utils = require("../Utils");
|
|
8
8
|
var RarityToPercentage = function RarityToPercentage(rarity) {
|
|
9
9
|
if (!rarity) {
|
|
@@ -5,8 +5,8 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
5
5
|
var _asyncToGenerator = require("@babel/runtime/helpers/asyncToGenerator");
|
|
6
6
|
var _classCallCheck = require("@babel/runtime/helpers/classCallCheck");
|
|
7
7
|
var _createClass = require("@babel/runtime/helpers/createClass");
|
|
8
|
-
function ownKeys(
|
|
9
|
-
function _objectSpread(
|
|
8
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
9
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
10
10
|
var _require = require("../ElvClient"),
|
|
11
11
|
ElvClient = _require.ElvClient;
|
|
12
12
|
var Configuration = require("./Configuration");
|
package/package.json
CHANGED
|
@@ -1075,7 +1075,7 @@ exports.ContentObjectVersions = async function({libraryId, objectId}) {
|
|
|
1075
1075
|
};
|
|
1076
1076
|
|
|
1077
1077
|
/**
|
|
1078
|
-
* Retrieve the version hash of the latest version of the specified object
|
|
1078
|
+
* Retrieve the version hash of the latest version of the specified object from chain
|
|
1079
1079
|
*
|
|
1080
1080
|
* @methodGroup Content Objects
|
|
1081
1081
|
* @namedParams
|
|
@@ -1122,6 +1122,42 @@ exports.LatestVersionHash = async function({objectId, versionHash}) {
|
|
|
1122
1122
|
return latestHash;
|
|
1123
1123
|
};
|
|
1124
1124
|
|
|
1125
|
+
/**
|
|
1126
|
+
* Retrieve the version hash of the latest version of the specified object via fabric API.
|
|
1127
|
+
* Requires authorization.
|
|
1128
|
+
*
|
|
1129
|
+
* @methodGroup Content Objects
|
|
1130
|
+
* @namedParams
|
|
1131
|
+
* @param {string=} objectId - ID of the object
|
|
1132
|
+
* @param {string=} versionHash - Version hash of the object
|
|
1133
|
+
*
|
|
1134
|
+
* @returns {Promise<string>} - The latest version hash of the object
|
|
1135
|
+
*/
|
|
1136
|
+
exports.LatestVersionHashV2 = async function({objectId, versionHash}) {
|
|
1137
|
+
if(versionHash) { objectId = this.utils.DecodeVersionHash(versionHash).objectId; }
|
|
1138
|
+
|
|
1139
|
+
ValidateObject(objectId);
|
|
1140
|
+
|
|
1141
|
+
let latestHash;
|
|
1142
|
+
try {
|
|
1143
|
+
let path = UrlJoin("q", objectId);
|
|
1144
|
+
|
|
1145
|
+
let q = await this.utils.ResponseToJson(
|
|
1146
|
+
this.HttpClient.Request({
|
|
1147
|
+
headers: await this.authClient.AuthorizationHeader({objectId}),
|
|
1148
|
+
method: "GET",
|
|
1149
|
+
path: path
|
|
1150
|
+
})
|
|
1151
|
+
);
|
|
1152
|
+
latestHash = q.hash;
|
|
1153
|
+
|
|
1154
|
+
} catch(error) {
|
|
1155
|
+
console.log("ERROR", error);
|
|
1156
|
+
throw Error(`Unable to determine latest version hash for ${versionHash || objectId}`);
|
|
1157
|
+
}
|
|
1158
|
+
return latestHash;
|
|
1159
|
+
};
|
|
1160
|
+
|
|
1125
1161
|
/* URL Methods */
|
|
1126
1162
|
|
|
1127
1163
|
/**
|
|
@@ -1044,11 +1044,26 @@ exports.PublishContentVersion = async function({objectId, versionHash, awaitComm
|
|
|
1044
1044
|
|
|
1045
1045
|
if(confirmEvent) {
|
|
1046
1046
|
// Found confirmation
|
|
1047
|
-
this.Log(`Commit confirmed: ${objectHash}`);
|
|
1047
|
+
this.Log(`Commit confirmed on chain: ${objectHash}`);
|
|
1048
1048
|
break;
|
|
1049
1049
|
}
|
|
1050
1050
|
}
|
|
1051
1051
|
}
|
|
1052
|
+
|
|
1053
|
+
// APIv2 ensure the fabric API returns the correct hash
|
|
1054
|
+
if(awaitCommitConfirmation) {
|
|
1055
|
+
const pollingInterval = 500; // ms
|
|
1056
|
+
let tries = 20;
|
|
1057
|
+
while (tries > 0) {
|
|
1058
|
+
const h = await this.LatestVersionHashV2({objectId});
|
|
1059
|
+
if (h == versionHash) {
|
|
1060
|
+
this.Log(`Commit confirmed on fabric node: ${versionHash}`);
|
|
1061
|
+
break;
|
|
1062
|
+
}
|
|
1063
|
+
await new Promise(resolve => setTimeout(resolve, pollingInterval));
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1052
1067
|
};
|
|
1053
1068
|
|
|
1054
1069
|
/**
|
package/src/client/LiveConf.js
CHANGED
|
@@ -209,6 +209,17 @@ class LiveConf {
|
|
|
209
209
|
return seg;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
/*
|
|
213
|
+
* Calculate output timebase from the encoder (codec) timebase. The videoTimeBase parameter
|
|
214
|
+
* represents the encoder timebase. The format muxer will change it so it is greater than 10000.
|
|
215
|
+
*/
|
|
216
|
+
calcOutputTimebase(codecTimebase) {
|
|
217
|
+
let outputTimebase = codecTimebase;
|
|
218
|
+
while (outputTimebase < 10000)
|
|
219
|
+
outputTimebase = outputTimebase * 2;
|
|
220
|
+
return outputTimebase;
|
|
221
|
+
}
|
|
222
|
+
|
|
212
223
|
calcSegDurationMpegts({sourceTimescale}) {
|
|
213
224
|
let videoStream = this.getStreamDataForCodecType("video");
|
|
214
225
|
let frameRate = videoStream.frame_rate;
|
|
@@ -270,7 +281,9 @@ class LiveConf {
|
|
|
270
281
|
|
|
271
282
|
switch(frameRate) {
|
|
272
283
|
case "24":
|
|
273
|
-
seg.
|
|
284
|
+
seg.videoTimeBase = 1536; // Output timebase: 12288
|
|
285
|
+
seg.videoFrameDurationTs = 512;
|
|
286
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
274
287
|
seg.keyint = 48;
|
|
275
288
|
seg.duration = "30";
|
|
276
289
|
break;
|
|
@@ -280,7 +293,9 @@ class LiveConf {
|
|
|
280
293
|
seg.duration = "30";
|
|
281
294
|
break;
|
|
282
295
|
case "30":
|
|
283
|
-
seg.
|
|
296
|
+
seg.videoTimeBase = 960; // Output timebase: 15360
|
|
297
|
+
seg.videoFrameDurationTs = 512;
|
|
298
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
284
299
|
seg.keyint = 60;
|
|
285
300
|
seg.duration = "30";
|
|
286
301
|
break;
|
|
@@ -290,7 +305,9 @@ class LiveConf {
|
|
|
290
305
|
seg.duration = "30.03";
|
|
291
306
|
break;
|
|
292
307
|
case "48":
|
|
293
|
-
seg.
|
|
308
|
+
seg.videoTimeBase = 1536; // Output timebase: 12288
|
|
309
|
+
seg.videoFrameDurationTs = 256;
|
|
310
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
294
311
|
seg.keyint = 96;
|
|
295
312
|
seg.duration = "30";
|
|
296
313
|
break;
|
|
@@ -300,7 +317,9 @@ class LiveConf {
|
|
|
300
317
|
seg.duration = "30";
|
|
301
318
|
break;
|
|
302
319
|
case "60":
|
|
303
|
-
seg.
|
|
320
|
+
seg.videoTimeBase = 960; // Output timebase: 15360
|
|
321
|
+
seg.videoFrameDurationTs = 256;
|
|
322
|
+
seg.video = this.calcOutputTimebase(seg.videoTimeBase) * 30;
|
|
304
323
|
seg.keyint = 120;
|
|
305
324
|
seg.duration = "30";
|
|
306
325
|
break;
|
|
@@ -397,7 +416,9 @@ class LiveConf {
|
|
|
397
416
|
// Optional override output timebase and frame duration (ts)
|
|
398
417
|
if(segDurations.videoTimeBase) {
|
|
399
418
|
conf.live_recording.recording_config.recording_params.xc_params.video_time_base = segDurations.videoTimeBase;
|
|
400
|
-
|
|
419
|
+
|
|
420
|
+
// Note 'source_timescale' needs to be set to the output timebase and is used by playout
|
|
421
|
+
conf.live_recording.recording_config.recording_params.source_timescale = this.calcOutputTimebase(segDurations.videoTimeBase);
|
|
401
422
|
}
|
|
402
423
|
if(segDurations.videoFrameDurationTs) {
|
|
403
424
|
conf.live_recording.recording_config.recording_params.xc_params.video_frame_duration_ts = segDurations.videoFrameDurationTs;
|
package/src/client/LiveStream.js
CHANGED
|
@@ -1322,7 +1322,7 @@ exports.StreamConfig = async function({name, customSettings={}}) {
|
|
|
1322
1322
|
const hostName = userConfig.url.replace("udp://", "").replace("rtmp://", "").replace("srt://", "").split(":")[0];
|
|
1323
1323
|
const streamUrl = new URL(userConfig.url);
|
|
1324
1324
|
|
|
1325
|
-
console.log("Retrieving nodes
|
|
1325
|
+
console.log("Retrieving nodes - matching", hostName);
|
|
1326
1326
|
let nodes = await this.SpaceNodes({matchEndpoint: hostName});
|
|
1327
1327
|
if(nodes.length < 1) {
|
|
1328
1328
|
status.error = "No node matching stream URL " + streamUrl.href;
|