@eluvio/elv-client-js 4.2.13 → 4.2.14

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 (45) 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 +723 -710
  8. package/dist/src/ContentObjectAudit.js +56 -56
  9. package/dist/src/Crypto.js +85 -85
  10. package/dist/src/ElvClient.js +502 -530
  11. package/dist/src/ElvWallet.js +28 -30
  12. package/dist/src/EthClient.js +311 -311
  13. package/dist/src/FrameClient.js +65 -64
  14. package/dist/src/HttpClient.js +60 -60
  15. package/dist/src/Id.js +2 -1
  16. package/dist/src/PermissionsClient.js +487 -499
  17. package/dist/src/RemoteSigner.js +178 -123
  18. package/dist/src/UserProfileClient.js +374 -392
  19. package/dist/src/Utils.js +66 -69
  20. package/dist/src/Validation.js +10 -10
  21. package/dist/src/client/ABRPublishing.js +239 -239
  22. package/dist/src/client/AccessGroups.js +474 -477
  23. package/dist/src/client/ContentAccess.js +1713 -1708
  24. package/dist/src/client/ContentManagement.js +871 -871
  25. package/dist/src/client/Contracts.js +736 -582
  26. package/dist/src/client/Files.js +684 -700
  27. package/dist/src/client/LiveConf.js +6 -1
  28. package/dist/src/client/LiveStream.js +686 -722
  29. package/dist/src/client/NFT.js +14 -14
  30. package/dist/src/client/NTP.js +84 -84
  31. package/dist/src/client/Shares.js +60 -53
  32. package/dist/src/walletClient/ClientMethods.js +951 -977
  33. package/dist/src/walletClient/Notifications.js +14 -14
  34. package/dist/src/walletClient/Profile.js +66 -66
  35. package/dist/src/walletClient/Utils.js +15 -15
  36. package/dist/src/walletClient/index.js +584 -581
  37. package/package.json +3 -2
  38. package/src/ElvClient.js +2 -1
  39. package/src/FrameClient.js +3 -0
  40. package/src/LogMessage.js +1 -1
  41. package/src/RemoteSigner.js +17 -3
  42. package/src/client/ABRPublishing.js +1 -1
  43. package/src/client/ContentAccess.js +16 -13
  44. package/src/client/Contracts.js +88 -7
  45. package/src/walletClient/index.js +15 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eluvio/elv-client-js",
3
- "version": "4.2.13",
3
+ "version": "4.2.14",
4
4
  "description": "Javascript client for the Eluvio Content Fabric",
5
5
  "main": "src/index.js",
6
6
  "author": "Kevin Talmadge",
@@ -101,6 +101,8 @@
101
101
  "@babel/cli": "^7.28.0",
102
102
  "@babel/plugin-transform-runtime": "^7.8.3",
103
103
  "@babel/preset-env": "^7.4.5",
104
+ "@eslint/eslintrc": "^3.3.3",
105
+ "@eslint/js": "^9.39.1",
104
106
  "@jsdoc/salty": "^0.2.9",
105
107
  "chai": "^4.2.0",
106
108
  "chai-as-promised": "^7.1.1",
@@ -108,7 +110,6 @@
108
110
  "colors": "^1.4.0",
109
111
  "copy-webpack-plugin": "^6.0.2",
110
112
  "eslint": "^9.32.0",
111
- "eslint-plugin-html": "^5.0.0",
112
113
  "jsdoc": "^4.0.0",
113
114
  "jsdom": "^26.1.0",
114
115
  "moment": "^2.27.0",
package/src/ElvClient.js CHANGED
@@ -838,10 +838,11 @@ class ElvClient {
838
838
  * @param {Array<string>=} signerURIs - (Only if using custom OAuth) - URIs corresponding to the key server(s) to use
839
839
  * @param {boolean=} unsignedPublicAuth=false - If specified, the client will use an unsigned static token for calls that don't require authorization (reduces remote signature calls)
840
840
  */
841
- async SetRemoteSigner({idToken, authToken, tenantId, extraData, signerURIs, unsignedPublicAuth}) {
841
+ async SetRemoteSigner({idToken, userIdCode, authToken, tenantId, extraData, signerURIs, unsignedPublicAuth}) {
842
842
  const signer = new RemoteSigner({
843
843
  signerURIs: signerURIs || this.authServiceURIs,
844
844
  idToken,
845
+ userIdCode,
845
846
  authToken,
846
847
  tenantId,
847
848
  provider: await this.ethClient.Provider(),
@@ -486,6 +486,9 @@ class FrameClient {
486
486
  "SetStaticToken",
487
487
  "SetTenantContractId",
488
488
  "SetTenantId",
489
+ "TenantAdminGroup",
490
+ "ContentAdminGroup",
491
+ "TenantUsersGroup",
489
492
  "SetVisibility",
490
493
  "SetPermission",
491
494
  "ShareInfo",
package/src/LogMessage.js CHANGED
@@ -29,4 +29,4 @@ const LogMessage = (reporter, message, error = false) => {
29
29
  console.log(standardMsg);
30
30
  };
31
31
 
32
- module.exports = {LogMessage};
32
+ module.exports = {LogMessage};
@@ -8,6 +8,7 @@ class RemoteSigner extends Ethers.Signer {
8
8
  constructor({
9
9
  signerURIs,
10
10
  idToken,
11
+ userIdCode,
11
12
  authToken,
12
13
  tenantId,
13
14
  provider,
@@ -21,6 +22,7 @@ class RemoteSigner extends Ethers.Signer {
21
22
 
22
23
  this.HttpClient = new HttpClient({uris: signerURIs});
23
24
  this.idToken = idToken;
25
+ this.userIdCode = userIdCode;
24
26
  this.tenantId = tenantId;
25
27
 
26
28
  this.authToken = authToken;
@@ -33,13 +35,25 @@ class RemoteSigner extends Ethers.Signer {
33
35
 
34
36
  async Initialize() {
35
37
  if(!this.authToken) {
38
+ let body = {
39
+ ext: this.extraLoginData || {}
40
+ };
41
+
42
+ if(this.tenantId) {
43
+ body.tid = this.tenantId;
44
+ }
45
+
46
+ if(this.userIdCode) {
47
+ body.code = this.userIdCode;
48
+ }
49
+
36
50
  const {addr, eth, token} = await Utils.ResponseToJson(
37
51
  this.HttpClient.Request({
38
- path: UrlJoin("as", "wlt", "login", "jwt"),
52
+ path: UrlJoin("as", "wlt", "login", this.userIdCode ? "code" : "jwt"),
39
53
  method: "POST",
40
- body: this.tenantId ? { tid: this.tenantId, ext: this.extraLoginData || {} } : { ext: this.extraLoginData || {} },
54
+ body,
41
55
  headers: {
42
- Authorization: `Bearer ${this.idToken}`
56
+ Authorization: `Bearer ${this.userIdCode || this.idToken}`
43
57
  }
44
58
  })
45
59
  );
@@ -323,7 +323,7 @@ exports.CreateABRMezzanine = async function({
323
323
  // determine master object id if a master write token was passed in
324
324
  ValidateWriteToken(masterWriteToken);
325
325
  masterObjectId = this.utils.DecodeWriteToken(masterWriteToken).objectId;
326
- masterLibId = await client.ContentObjectLibraryId({objectId: masterObjectId});
326
+ masterLibId = await this.ContentObjectLibraryId({objectId: masterObjectId});
327
327
  }
328
328
 
329
329
  // if pre-existing mez object id passed in, validate
@@ -597,19 +597,19 @@ exports.ContentObject = async function({objectId, versionHash, writeToken, noCac
597
597
  const id = writeToken || versionHash || objectId;
598
598
  if(noCache || !this.objectInfo[id] || Date.now() - this.objectInfo[id].retrievedAt > 30000) {
599
599
  let path = UrlJoin("q", id);
600
+ const info = await this.HttpClient.RequestJsonBody({
601
+ headers: await this.authClient.AuthorizationHeader({objectId, versionHash}),
602
+ method: "GET",
603
+ path: path,
604
+ queryParams: {
605
+ details: true,
606
+ profile: true
607
+ }
608
+ })
609
+
600
610
  this.objectInfo[id] = {
601
611
  retrievedAt: Date.now(),
602
- info: (
603
- await this.HttpClient.RequestJsonBody({
604
- headers: await this.authClient.AuthorizationHeader({objectId, versionHash}),
605
- method: "GET",
606
- path: path,
607
- queryParams: {
608
- details: true,
609
- profile: true
610
- }
611
- })
612
- )
612
+ info
613
613
  };
614
614
  }
615
615
 
@@ -1909,6 +1909,7 @@ exports.MakeFileServiceRequest = async function({
1909
1909
  * @param {string=} versionHash - Hash of the object version - if not specified, latest version will be used
1910
1910
  * @param {string=} writeToken - Write token of an object draft - if calling bitcode of a draft object
1911
1911
  * @param {string} method - Bitcode method to call
1912
+ * @param {string} verb - HTTP verb (GET, POST, PUT, DELETE, ...)
1912
1913
  * @param {Object=} queryParams - Query parameters to include in the request
1913
1914
  * @param {Object=} body - Request body to include, if calling a non-constant method
1914
1915
  * @param {Object=} headers - Request headers to include
@@ -1924,6 +1925,7 @@ exports.CallBitcodeMethod = async function({
1924
1925
  versionHash,
1925
1926
  writeToken,
1926
1927
  method,
1928
+ verb,
1927
1929
  queryParams={},
1928
1930
  body={},
1929
1931
  headers={},
@@ -1952,9 +1954,10 @@ exports.CallBitcodeMethod = async function({
1952
1954
  ).Authorization;
1953
1955
  }
1954
1956
 
1957
+ verb = verb ? verb : (constant ? "GET" : "POST");
1955
1958
  this.Log(
1956
1959
  `Calling bitcode method: ${libraryId || ""} ${objectId || versionHash} ${writeToken || ""}
1957
- ${constant ? "GET" : "POST"} ${path}
1960
+ ${verb} ${path}
1958
1961
  Query Params:
1959
1962
  ${JSON.stringify(queryParams || "")}
1960
1963
  Body:
@@ -1968,7 +1971,7 @@ exports.CallBitcodeMethod = async function({
1968
1971
  await this.HttpClient.Request({
1969
1972
  body,
1970
1973
  headers,
1971
- method: constant ? "GET" : "POST",
1974
+ method: verb,
1972
1975
  path,
1973
1976
  queryParams,
1974
1977
  allowFailover: false
@@ -785,7 +785,6 @@ exports.SetTenantContractId = async function({contractAddress, objectId, version
785
785
  if(tenantContractId && (!tenantContractId.startsWith("iten") || !Utils.ValidHash(tenantContractId))) {
786
786
  throw Error(`Invalid tenant ID: ${tenantContractId}`);
787
787
  }
788
- const tenantAddress = Utils.HashToAddress(tenantContractId);
789
788
 
790
789
  const version = await this.authClient.AccessType(tenantContractId);
791
790
  if(version !== this.authClient.ACCESS_TYPES.TENANT) {
@@ -793,12 +792,7 @@ exports.SetTenantContractId = async function({contractAddress, objectId, version
793
792
  }
794
793
 
795
794
  // get tenant admin group
796
- const tenantAdminGroupAddress = await this.CallContractMethod({
797
- contractAddress: tenantAddress,
798
- methodName: "groupsMapping",
799
- methodArgs: ["tenant_admin", 0],
800
- formatArguments: true,
801
- });
795
+ const tenantAdminGroupAddress = await this.TenantAdminGroup({tenantContractId});
802
796
 
803
797
  const hasPutMetaMethod = await this.authClient.ContractHasMethod({
804
798
  contractAddress: contractAddress,
@@ -928,6 +922,93 @@ exports.ResetTenantId = async function({contractAddress, objectId, versionHash})
928
922
  }
929
923
  };
930
924
 
925
+ async function GetTenantGroupAddress({ctx, tenantContractId, groupName}) {
926
+ if(!tenantContractId) {
927
+ throw new Error("tenantContractId is required");
928
+ }
929
+
930
+ if(!tenantContractId.startsWith("iten")) {
931
+ throw new Error(`Invalid Tenant Contract ID format: ${tenantContractId}`);
932
+ }
933
+
934
+ const tenantAddress = Utils.HashToAddress(tenantContractId);
935
+
936
+ // Needs to be tenant type
937
+ const version = await ctx.authClient.AccessType(tenantContractId);
938
+ if(version !== ctx.authClient.ACCESS_TYPES.TENANT) {
939
+ throw new Error(
940
+ `Contract ${tenantContractId} is not a Tenant. Actual version: ${version}`
941
+ );
942
+ }
943
+
944
+ try {
945
+ const groupAddress = await ctx.CallContractMethod({
946
+ contractAddress: tenantAddress,
947
+ methodName: "groupsMapping",
948
+ methodArgs: [groupName, 0],
949
+ formatArguments: true,
950
+ });
951
+
952
+ if (!groupAddress) {
953
+ throw new Error(`${groupName} group address not set.`);
954
+ }
955
+
956
+ return groupAddress;
957
+ } catch (err) {
958
+ this.Log(err);
959
+ throw new Error(`Failed to retrieve ${groupName} group address.`);
960
+ }
961
+
962
+ }
963
+
964
+ /**
965
+ * Returns the tenant_admin group address for a given tenant contract.
966
+ *
967
+ * @methodGroup Tenant
968
+ * @namedParams
969
+ * @param {string=} tenantContractId - The ID of the tenant contract
970
+ * @returns {Promise<*|undefined>}
971
+ */
972
+ exports.TenantAdminGroup = async function({ tenantContractId }) {
973
+ return GetTenantGroupAddress({
974
+ ctx : this,
975
+ tenantContractId,
976
+ groupName: "tenant_admin"
977
+ });
978
+ };
979
+
980
+ /**
981
+ * Returns the content_admin group address for a given tenant contract.
982
+ *
983
+ * @methodGroup Tenant
984
+ * @namedParams
985
+ * @param {string=} tenantContractId - The ID of the tenant contract
986
+ * @returns {Promise<*|undefined>}
987
+ */
988
+ exports.ContentAdminGroup = async function({tenantContractId}){
989
+ return GetTenantGroupAddress({
990
+ ctx : this,
991
+ tenantContractId,
992
+ groupName: "content_admin"
993
+ });
994
+ };
995
+
996
+ /**
997
+ * Returns the tenant_users group address for a given tenant contract.
998
+ *
999
+ * @methodGroup Tenant
1000
+ * @namedParams
1001
+ * @param {string=} tenantContractId - The ID of the tenant contract
1002
+ * @returns {Promise<*|undefined>}
1003
+ */
1004
+ exports.TenantUsersGroup = async function({tenantContractId}){
1005
+ return GetTenantGroupAddress({
1006
+ ctx : this,
1007
+ tenantContractId,
1008
+ groupName: "tenant_users"
1009
+ });
1010
+ };
1011
+
931
1012
  /**
932
1013
  * Enum for object types that can be cleaned up after object deletion.
933
1014
  * Used by the ObjectCleanup method to determine which associated objects to clean.
@@ -476,6 +476,7 @@ class ElvWalletClient {
476
476
  */
477
477
  async AuthenticateOAuth({
478
478
  idToken,
479
+ userIdCode,
479
480
  tenantId,
480
481
  email,
481
482
  signerURIs,
@@ -494,7 +495,17 @@ class ElvWalletClient {
494
495
  tenantId = this.selectedMarketplaceInfo.tenantId;
495
496
  }
496
497
 
497
- await this.client.SetRemoteSigner({idToken, tenantId, signerURIs, extraData: { ...extraData, share_email: shareEmail }, unsignedPublicAuth: true});
498
+ await this.client.SetRemoteSigner({
499
+ idToken,
500
+ userIdCode,
501
+ tenantId,
502
+ signerURIs,
503
+ extraData: {
504
+ ...extraData,
505
+ share_email: shareEmail
506
+ },
507
+ unsignedPublicAuth: true
508
+ });
498
509
 
499
510
  let fabricToken, refreshToken, expiresAt;
500
511
  if(createRemoteToken && this.client.signer.remoteSigner) {
@@ -511,9 +522,9 @@ class ElvWalletClient {
511
522
  context: email ? {usr: {email}} : {}
512
523
  });
513
524
  }
514
- const address = this.client.utils.FormatAddress(this.client.CurrentAccountAddress());
515
525
 
516
- if(!email) {
526
+ const address = this.client.utils.FormatAddress(this.client.CurrentAccountAddress());
527
+ if(!email && idToken) {
517
528
  try {
518
529
  const decodedToken = JSON.parse(this.utils.FromB64URL(idToken.split(".")[1]));
519
530
  email = decodedToken.email;
@@ -1253,7 +1264,7 @@ class ElvWalletClient {
1253
1264
  return response
1254
1265
  .map(status => {
1255
1266
  let [op, address, id] = status.op.split(":");
1256
- address = address.startsWith("0x") ? Utils.FormatAddress(address) : address;
1267
+ address = address && address.startsWith("0x") ? Utils.FormatAddress(address) : address;
1257
1268
 
1258
1269
  let confirmationId, tokenId, offerId, giftId;
1259
1270
  if(op === "nft-buy") {