@eluvio/elv-client-js 4.0.105 → 4.0.108

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 (41) hide show
  1. package/dist/ElvClient-min.js +14 -15
  2. package/dist/ElvClient-node-min.js +13 -14
  3. package/dist/ElvFrameClient-min.js +10 -10
  4. package/dist/ElvPermissionsClient-min.js +9 -9
  5. package/dist/ElvWalletClient-min.js +14 -15
  6. package/dist/ElvWalletClient-node-min.js +13 -14
  7. package/dist/src/AuthorizationClient.js +12 -9
  8. package/dist/src/ContentObjectAudit.js +3 -3
  9. package/dist/src/ContentObjectVerification.js +3 -3
  10. package/dist/src/Crypto.js +2 -2
  11. package/dist/src/ElvClient.js +28 -47
  12. package/dist/src/ElvWallet.js +5 -7
  13. package/dist/src/EthClient.js +9 -8
  14. package/dist/src/FrameClient.js +9 -8
  15. package/dist/src/HttpClient.js +2 -1
  16. package/dist/src/Id.js +2 -1
  17. package/dist/src/PermissionsClient.js +19 -31
  18. package/dist/src/RemoteSigner.js +8 -6
  19. package/dist/src/UserProfileClient.js +180 -167
  20. package/dist/src/Utils.js +3 -2
  21. package/dist/src/Validation.js +1 -13
  22. package/dist/src/client/ABRPublishing.js +2 -2
  23. package/dist/src/client/AccessGroups.js +2 -2
  24. package/dist/src/client/ContentAccess.js +3 -2
  25. package/dist/src/client/ContentManagement.js +3 -3
  26. package/dist/src/client/Contracts.js +433 -108
  27. package/dist/src/client/Files.js +2 -2
  28. package/dist/src/client/LiveConf.js +6 -4
  29. package/dist/src/client/LiveStream.js +231 -136
  30. package/dist/src/client/NFT.js +2 -2
  31. package/dist/src/walletClient/ClientMethods.js +2 -2
  32. package/dist/src/walletClient/Profile.js +2 -2
  33. package/dist/src/walletClient/Utils.js +2 -2
  34. package/dist/src/walletClient/index.js +14 -17
  35. package/package.json +1 -1
  36. package/src/UserProfileClient.js +20 -21
  37. package/src/Validation.js +0 -6
  38. package/src/client/Contracts.js +244 -42
  39. package/src/client/LiveConf.js +1 -1
  40. package/src/client/LiveStream.js +122 -44
  41. package/testScripts/TestAddTenantContractId.js +45 -4
@@ -415,16 +415,23 @@ exports.StreamStatus = async function({name, stopLro=false, showParams=false}) {
415
415
 
416
416
  status.edge_write_token = edgeWriteToken;
417
417
  status.stream_id = edgeWriteToken; // By convention the stream ID is its write token
418
- let edgeMeta = await this.ContentObjectMetadata({
419
- libraryId: libraryId,
420
- objectId: objectId,
421
- writeToken: edgeWriteToken,
422
- select: [
423
- "live_recording"
424
- ]
425
- });
418
+ let edgeMeta;
419
+ try {
420
+ edgeMeta = await this.ContentObjectMetadata({
421
+ libraryId: libraryId,
422
+ objectId: objectId,
423
+ writeToken: edgeWriteToken,
424
+ select: [
425
+ "live_recording"
426
+ ]
427
+ });
428
+ } catch(error) {
429
+ console.error("Unable to read edge write token metadata. Has token been deleted?", error);
430
+ status.state = "inactive";
431
+ return status;
432
+ }
426
433
 
427
- status.edge_meta_size = JSON.stringify(edgeMeta).length;
434
+ status.edge_meta_size = JSON.stringify(edgeMeta || "").length;
428
435
 
429
436
  // If a stream has never been started return state 'inactive'
430
437
  if(edgeMeta.live_recording === undefined ||
@@ -1785,26 +1792,36 @@ exports.StreamCopyToVod = async function({
1785
1792
  *
1786
1793
  * @methodGroup Live Stream
1787
1794
  * @namedParams
1795
+ * @param {string=} libraryId - Library ID of the live stream
1788
1796
  * @param {string} objectId - Object ID of the live stream
1797
+ * @param {string=} writeToken - Write token of the draft
1789
1798
  * @param {Array<string>} types - Specify which type of watermark to remove. Possible values:
1790
1799
  * - "image"
1791
1800
  * - "text"
1801
+ * - "forensic"
1792
1802
  * @param {boolean=} finalize - If enabled, target object will be finalized after removing watermark
1793
1803
  *
1794
1804
  * @return {Promise<Object>} - The finalize response
1795
1805
  */
1796
1806
  exports.StreamRemoveWatermark = async function({
1807
+ libraryId,
1797
1808
  objectId,
1809
+ writeToken,
1798
1810
  types,
1799
1811
  finalize=true
1800
1812
  }) {
1801
1813
  ValidateObject(objectId);
1802
1814
 
1803
- const libraryId = await this.ContentObjectLibraryId({objectId});
1804
- const {writeToken} = await this.EditContentObject({
1805
- objectId,
1806
- libraryId
1807
- });
1815
+ if(!libraryId) {
1816
+ libraryId = await this.ContentObjectLibraryId({objectId});
1817
+ }
1818
+
1819
+ if(!writeToken) {
1820
+ ({writeToken} = await this.EditContentObject({
1821
+ objectId,
1822
+ libraryId
1823
+ }));
1824
+ }
1808
1825
 
1809
1826
  this.Log(`Removing watermark types: ${types.join(", ")} ${libraryId} ${objectId}`);
1810
1827
 
@@ -1814,25 +1831,27 @@ exports.StreamRemoveWatermark = async function({
1814
1831
  metadataSubtree: "/live_recording/fabric_config/edge_write_token"
1815
1832
  });
1816
1833
 
1817
- const recordingParamsPath = "live_recording/recording_config/recording_params";
1834
+ const metadataPath = "live_recording/playout_config";
1818
1835
 
1819
- const recordingMetadata = await this.ContentObjectMetadata({
1836
+ const objectMetadata = await this.ContentObjectMetadata({
1820
1837
  libraryId,
1821
1838
  objectId,
1822
1839
  writeToken,
1823
- metadataSubtree: recordingParamsPath,
1840
+ metadataSubtree: metadataPath,
1824
1841
  resolveLinks: false
1825
1842
  });
1826
1843
 
1827
- if(!recordingMetadata) {
1828
- throw Error("Stream object must be configured");
1844
+ if(!objectMetadata) {
1845
+ throw Error("Stream object must be configured before removing a watermark");
1829
1846
  }
1830
1847
 
1831
1848
  types.forEach(type => {
1832
1849
  if(type === "text") {
1833
- delete recordingMetadata.simple_watermark;
1850
+ delete objectMetadata.simple_watermark;
1834
1851
  } else if(type === "image") {
1835
- delete recordingMetadata.image_watermark;
1852
+ delete objectMetadata.image_watermark;
1853
+ } else if(type === "forensic") {
1854
+ delete objectMetadata.forensic_watermark;
1836
1855
  }
1837
1856
  });
1838
1857
 
@@ -1840,8 +1859,8 @@ exports.StreamRemoveWatermark = async function({
1840
1859
  libraryId,
1841
1860
  objectId,
1842
1861
  writeToken,
1843
- metadataSubtree: recordingParamsPath,
1844
- metadata: recordingMetadata
1862
+ metadataSubtree: metadataPath,
1863
+ metadata: objectMetadata
1845
1864
  });
1846
1865
 
1847
1866
  if(edgeWriteToken) {
@@ -1849,8 +1868,8 @@ exports.StreamRemoveWatermark = async function({
1849
1868
  libraryId,
1850
1869
  objectId,
1851
1870
  writeToken: edgeWriteToken,
1852
- metadataSubtree: recordingParamsPath,
1853
- metadata: recordingMetadata
1871
+ metadataSubtree: metadataPath,
1872
+ metadata: objectMetadata
1854
1873
  });
1855
1874
  }
1856
1875
 
@@ -1871,26 +1890,72 @@ exports.StreamRemoveWatermark = async function({
1871
1890
  *
1872
1891
  * @methodGroup Live Stream
1873
1892
  * @namedParams
1893
+ * @param {string=} libraryId - Library ID of the live stream
1874
1894
  * @param {string} objectId - Object ID of the live stream
1895
+ * @param {string=} writeToken - Write token of the draft
1875
1896
  * @param {Object} simpleWatermark - Text watermark
1876
1897
  * @param {Object} imageWatermark - Image watermark
1898
+ * @param {Object} forensicWatermark - Forensic watermark
1877
1899
  * @param {boolean=} finalize - If enabled, target object will be finalized after adding watermark
1900
+ * Watermark examples:
1901
+ *
1902
+ * Simple Watermark:
1903
+ {
1904
+ "font_color": "",
1905
+ "font_relative_height": 0,
1906
+ "shadow": false,
1907
+ "template": "",
1908
+ "timecode": "",
1909
+ "timecode_rate": 0,
1910
+ "x": "",
1911
+ "y": ""
1912
+ }
1913
+ *
1914
+ * Image watermark:
1915
+ {
1916
+ "image": "",
1917
+ "align_h": "",
1918
+ "align_v": "",
1919
+ "target_video_height": 0,
1920
+ "wm_enabled": false
1921
+ }
1922
+ *
1923
+ * Forensic watermark:
1924
+ {
1925
+ "algo": 6,
1926
+ "forensic_duration": 0,
1927
+ "forensic_start": "",
1928
+ "image_a": <path_to_image>,
1929
+ "image_b": <path_to_image>,
1930
+ "is_stub": true,
1931
+ "payload_bit_nb": 23,
1932
+ "wm_enabled": true
1933
+ }
1934
+ *
1878
1935
  *
1879
1936
  * @return {Promise<Object>} - The finalize response
1880
1937
  */
1881
1938
  exports.StreamAddWatermark = async function({
1939
+ libraryId,
1882
1940
  objectId,
1941
+ writeToken,
1883
1942
  simpleWatermark,
1884
1943
  imageWatermark,
1944
+ forensicWatermark,
1885
1945
  finalize=true
1886
1946
  }) {
1887
1947
  ValidateObject(objectId);
1888
1948
 
1889
- const libraryId = await this.ContentObjectLibraryId({objectId});
1890
- const {writeToken} = await this.EditContentObject({
1891
- objectId,
1892
- libraryId
1893
- });
1949
+ if(!libraryId) {
1950
+ libraryId = await this.ContentObjectLibraryId({objectId});
1951
+ }
1952
+
1953
+ if(!writeToken) {
1954
+ ({writeToken} = await this.EditContentObject({
1955
+ objectId,
1956
+ libraryId
1957
+ }));
1958
+ }
1894
1959
 
1895
1960
  const edgeWriteToken = await this.ContentObjectMetadata({
1896
1961
  objectId,
@@ -1898,34 +1963,46 @@ exports.StreamAddWatermark = async function({
1898
1963
  metadataSubtree: "/live_recording/fabric_config/edge_write_token"
1899
1964
  });
1900
1965
 
1901
- this.Log(`Adding watermarking type: ${imageWatermark ? "image" : "text"} ${libraryId} ${objectId}`);
1966
+ const watermarkType = imageWatermark ? "image" : forensicWatermark ? "forensic" : "text";
1967
+ const metadataPath = "live_recording/playout_config";
1902
1968
 
1903
- const recordingParamsPath = "live_recording/recording_config/recording_params";
1969
+ this.Log(`Adding watermarking type: ${watermarkType} ${libraryId} ${objectId}`);
1904
1970
 
1905
- const recordingMetadata = await this.ContentObjectMetadata({
1971
+ const objectMetadata = await this.ContentObjectMetadata({
1906
1972
  libraryId,
1907
1973
  objectId,
1908
1974
  writeToken,
1909
- metadataSubtree: recordingParamsPath,
1975
+ metadataSubtree: metadataPath,
1910
1976
  resolveLinks: false
1911
1977
  });
1912
1978
 
1913
- if(!recordingMetadata) {
1914
- throw Error("Stream object must be configured");
1979
+ if(!objectMetadata) {
1980
+ throw Error("Stream object must be configured before adding a watermark");
1981
+ }
1982
+
1983
+ const watermarkArgCount = [simpleWatermark, imageWatermark, forensicWatermark].filter(i => !!i).length;
1984
+ console.log("watermark arg count", watermarkArgCount)
1985
+
1986
+ if(watermarkArgCount === 0) {
1987
+ throw Error("No watermark was provided");
1988
+ } else if(watermarkArgCount > 1) {
1989
+ throw Error("Only one watermark is allowed")
1915
1990
  }
1916
1991
 
1917
1992
  if(simpleWatermark) {
1918
- recordingMetadata.simple_watermark = simpleWatermark;
1993
+ objectMetadata.simple_watermark = simpleWatermark;
1919
1994
  } else if(imageWatermark) {
1920
- recordingMetadata.image_watermark = imageWatermark;
1995
+ objectMetadata.image_watermark = imageWatermark;
1996
+ } else if(forensicWatermark) {
1997
+ objectMetadata.forensic_watermark = forensicWatermark;
1921
1998
  }
1922
1999
 
1923
2000
  await this.ReplaceMetadata({
1924
2001
  libraryId,
1925
2002
  objectId,
1926
2003
  writeToken,
1927
- metadataSubtree: recordingParamsPath,
1928
- metadata: recordingMetadata
2004
+ metadataSubtree: metadataPath,
2005
+ metadata: objectMetadata
1929
2006
  });
1930
2007
 
1931
2008
  if(edgeWriteToken) {
@@ -1933,14 +2010,15 @@ exports.StreamAddWatermark = async function({
1933
2010
  libraryId,
1934
2011
  objectId,
1935
2012
  writeToken: edgeWriteToken,
1936
- metadataSubtree: recordingParamsPath,
1937
- metadata: recordingMetadata
2013
+ metadataSubtree: metadataPath,
2014
+ metadata: objectMetadata
1938
2015
  });
1939
2016
  }
1940
2017
 
1941
2018
  const response = {
1942
- "imageWatermark": recordingMetadata.image_watermark,
1943
- "textWatermark": recordingMetadata.simple_watermark
2019
+ "imageWatermark": objectMetadata.image_watermark,
2020
+ "textWatermark": objectMetadata.simple_watermark,
2021
+ "forensicWatermark": objectMetadata.forensic_watermark
1944
2022
  };
1945
2023
 
1946
2024
  if(finalize) {
@@ -7,15 +7,28 @@ const argv = yargs
7
7
  description: "Fabric configuration URL (e.g. https://main.net955210.contentfabric.io/config)"
8
8
  })
9
9
  .option("tenantContractId", {
10
- description: "tenant Contract Id to set for the user"
10
+ description: "tenant Contract Id to set for the objects"
11
+ })
12
+ .option("tenantIdToBeReplaced", {
13
+ description: "tenant Id to be changed for the objects"
11
14
  })
12
15
  .demandOption(
13
- ["configUrl", "tenantContractId"],
14
- "\nUsage: PRIVATE_KEY=<private-key> node CreateUserWithTenantId --configUrl <config-url> --tenantContractId <tenant_id>\n"
16
+ ["configUrl", "tenantContractId", "tenantIdToBeReplaced" ],
17
+ "\nUsage: PRIVATE_KEY=<private-key> node TestAddTenantContractId --configUrl <config-url> --tenantContractId <tenant_contract_id> --tenantIdToBeReplaced <tenant_id>\n"
15
18
  )
16
19
  .argv;
17
20
 
18
- const TestAddTenantContractId = async ({configUrl, tenantContractId}) => {
21
+ /**
22
+ * TestAddTenantContractId adds tenantContractId to wallet,library,group,content-type object
23
+ * and change tenantId to value provided.
24
+ *
25
+ * @param {string} configUrl - Config Url
26
+ * @param {string} tenantContractId - Id of tenantContract to be set
27
+ * @param {string} tenantIdToBeReplaced - Id of tenant admin group to be replaced
28
+ * @returns {Promise<void>}
29
+ * @constructor
30
+ */
31
+ const TestAddTenantContractId = async ({configUrl, tenantContractId, tenantIdToBeReplaced}) => {
19
32
  try {
20
33
  if(!process.env.PRIVATE_KEY) {
21
34
  console.log("ERROR: 'PRIVATE_KEY' environment variable must be set");
@@ -79,6 +92,34 @@ const TestAddTenantContractId = async ({configUrl, tenantContractId}) => {
79
92
  // libraryId: client.contentSpaceLibraryId,
80
93
  // objectId: client.utils.AddressToObjectId(groupAddress)}));
81
94
 
95
+
96
+ // Change tenantID (which in turn changes tenantContractId) to user, group, library and content-type
97
+ await client.userProfileClient.SetTenantId({id: tenantIdToBeReplaced});
98
+ const newTenantId = await client.userProfileClient.TenantId();
99
+ if(newTenantId !== tenantIdToBeReplaced) {
100
+ throw Error(`tenant mismatch, actual: ${tenantInfo.tenantId}, expected: ${tenantIdToBeReplaced}`);
101
+ }
102
+ console.log();
103
+ console.log(`tenantId for user changed to ${tenantIdToBeReplaced}`);
104
+
105
+ tenantInfo = await client.SetTenantId({objectId: libraryId, tenantId: tenantIdToBeReplaced});
106
+ if(tenantInfo.tenantId !== tenantIdToBeReplaced) {
107
+ throw Error(`tenant mismatch, actual: ${tenantInfo.tenantId}, expected: ${tenantIdToBeReplaced}`);
108
+ }
109
+ console.log(`tenantId for library changed to ${tenantIdToBeReplaced}`);
110
+
111
+ tenantInfo = await client.SetTenantId({contractAddress: contentTypeAddress, tenantId: tenantIdToBeReplaced});
112
+ if(tenantInfo.tenantId !== tenantIdToBeReplaced) {
113
+ throw Error(`tenant mismatch, actual: ${tenantInfo.tenantId}, expected: ${tenantIdToBeReplaced}`);
114
+ }
115
+ console.log(`tenantId for content-type object changed to ${tenantIdToBeReplaced}`)
116
+
117
+ tenantInfo = await client.SetTenantId({contractAddress: groupAddress, tenantId: tenantIdToBeReplaced});
118
+ if(tenantInfo.tenantId !== tenantIdToBeReplaced) {
119
+ throw Error(`tenant mismatch, actual: ${tenantInfo.tenantId}, expected: ${tenantIdToBeReplaced}`);
120
+ }
121
+ console.log(`tenantId for group-address changed to ${tenantIdToBeReplaced}`)
122
+
82
123
  } catch(e){
83
124
  console.error(e);
84
125
  }