@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.
- package/dist/ElvClient-min.js +14 -15
- package/dist/ElvClient-node-min.js +13 -14
- package/dist/ElvFrameClient-min.js +10 -10
- package/dist/ElvPermissionsClient-min.js +9 -9
- package/dist/ElvWalletClient-min.js +14 -15
- package/dist/ElvWalletClient-node-min.js +13 -14
- package/dist/src/AuthorizationClient.js +12 -9
- package/dist/src/ContentObjectAudit.js +3 -3
- package/dist/src/ContentObjectVerification.js +3 -3
- package/dist/src/Crypto.js +2 -2
- package/dist/src/ElvClient.js +28 -47
- package/dist/src/ElvWallet.js +5 -7
- package/dist/src/EthClient.js +9 -8
- package/dist/src/FrameClient.js +9 -8
- package/dist/src/HttpClient.js +2 -1
- package/dist/src/Id.js +2 -1
- package/dist/src/PermissionsClient.js +19 -31
- package/dist/src/RemoteSigner.js +8 -6
- package/dist/src/UserProfileClient.js +180 -167
- package/dist/src/Utils.js +3 -2
- package/dist/src/Validation.js +1 -13
- package/dist/src/client/ABRPublishing.js +2 -2
- package/dist/src/client/AccessGroups.js +2 -2
- package/dist/src/client/ContentAccess.js +3 -2
- package/dist/src/client/ContentManagement.js +3 -3
- package/dist/src/client/Contracts.js +433 -108
- package/dist/src/client/Files.js +2 -2
- package/dist/src/client/LiveConf.js +6 -4
- package/dist/src/client/LiveStream.js +231 -136
- 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 +14 -17
- package/package.json +1 -1
- package/src/UserProfileClient.js +20 -21
- package/src/Validation.js +0 -6
- package/src/client/Contracts.js +244 -42
- package/src/client/LiveConf.js +1 -1
- package/src/client/LiveStream.js +122 -44
- package/testScripts/TestAddTenantContractId.js +45 -4
package/src/client/LiveStream.js
CHANGED
|
@@ -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
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
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
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
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
|
|
1834
|
+
const metadataPath = "live_recording/playout_config";
|
|
1818
1835
|
|
|
1819
|
-
const
|
|
1836
|
+
const objectMetadata = await this.ContentObjectMetadata({
|
|
1820
1837
|
libraryId,
|
|
1821
1838
|
objectId,
|
|
1822
1839
|
writeToken,
|
|
1823
|
-
metadataSubtree:
|
|
1840
|
+
metadataSubtree: metadataPath,
|
|
1824
1841
|
resolveLinks: false
|
|
1825
1842
|
});
|
|
1826
1843
|
|
|
1827
|
-
if(!
|
|
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
|
|
1850
|
+
delete objectMetadata.simple_watermark;
|
|
1834
1851
|
} else if(type === "image") {
|
|
1835
|
-
delete
|
|
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:
|
|
1844
|
-
metadata:
|
|
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:
|
|
1853
|
-
metadata:
|
|
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
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
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
|
-
|
|
1966
|
+
const watermarkType = imageWatermark ? "image" : forensicWatermark ? "forensic" : "text";
|
|
1967
|
+
const metadataPath = "live_recording/playout_config";
|
|
1902
1968
|
|
|
1903
|
-
|
|
1969
|
+
this.Log(`Adding watermarking type: ${watermarkType} ${libraryId} ${objectId}`);
|
|
1904
1970
|
|
|
1905
|
-
const
|
|
1971
|
+
const objectMetadata = await this.ContentObjectMetadata({
|
|
1906
1972
|
libraryId,
|
|
1907
1973
|
objectId,
|
|
1908
1974
|
writeToken,
|
|
1909
|
-
metadataSubtree:
|
|
1975
|
+
metadataSubtree: metadataPath,
|
|
1910
1976
|
resolveLinks: false
|
|
1911
1977
|
});
|
|
1912
1978
|
|
|
1913
|
-
if(!
|
|
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
|
-
|
|
1993
|
+
objectMetadata.simple_watermark = simpleWatermark;
|
|
1919
1994
|
} else if(imageWatermark) {
|
|
1920
|
-
|
|
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:
|
|
1928
|
-
metadata:
|
|
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:
|
|
1937
|
-
metadata:
|
|
2013
|
+
metadataSubtree: metadataPath,
|
|
2014
|
+
metadata: objectMetadata
|
|
1938
2015
|
});
|
|
1939
2016
|
}
|
|
1940
2017
|
|
|
1941
2018
|
const response = {
|
|
1942
|
-
"imageWatermark":
|
|
1943
|
-
"textWatermark":
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
}
|