@eluvio/elv-client-js 3.2.44 → 4.0.0

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.
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  const UrlJoin = require("url-join");
8
+ const objectPath = require("object-path");
8
9
 
9
10
  const HttpClient = require("../HttpClient");
10
11
 
@@ -581,17 +582,18 @@ exports.ContentObjects = async function({libraryId, filterOptions={}}) {
581
582
  * @param {string=} libraryId - ID of the library
582
583
  * @param {string=} objectId - ID of the object
583
584
  * @param {string=} versionHash - Version hash of the object -- if not specified, latest version is returned
585
+ * @param {string=} writeToken - Write token for an object draft -- if supplied, versionHash will be ignored
584
586
  *
585
587
  * @returns {Promise<Object>} - Description of content object
586
588
  */
587
- exports.ContentObject = async function({libraryId, objectId, versionHash}) {
589
+ exports.ContentObject = async function({libraryId, objectId, versionHash, writeToken}) {
588
590
  ValidateParameters({libraryId, objectId, versionHash});
589
591
 
590
- this.Log(`Retrieving content object: ${libraryId || ""} ${objectId || versionHash}`);
592
+ this.Log(`Retrieving content object: ${libraryId || ""} ${writeToken || versionHash || objectId}`);
591
593
 
592
594
  if(versionHash) { objectId = this.utils.DecodeVersionHash(versionHash).objectId; }
593
595
 
594
- let path = UrlJoin("q", versionHash || objectId);
596
+ let path = UrlJoin("q", writeToken || versionHash || objectId);
595
597
 
596
598
  return await this.utils.ResponseToJson(
597
599
  this.HttpClient.Request({
@@ -925,8 +927,17 @@ exports.ContentObjectMetadata = async function({
925
927
  if(error.status !== 404) {
926
928
  throw error;
927
929
  }
928
-
929
- metadata = metadataSubtree === "/" ? {} : undefined;
930
+ // For a 404 error, check if error was due to write token not found
931
+ const errQwtoken = objectPath.get(error.body, "errors[0].cause.cause.cause.qwtoken");
932
+ if(errQwtoken) {
933
+ // if so, re-throw rather than suppress error
934
+ throw error;
935
+ } else {
936
+ // For all other 404 errors (not just 'subtree not found'), suppress error and
937
+ // return an empty value. (there are function call chains that depend on this behavior,
938
+ // e.g. CreateABRMezzanine -> CreateEncryptionConk -> ContentObjectMetadata)
939
+ metadata = metadataSubtree === "/" ? {} : undefined;
940
+ }
930
941
  }
931
942
 
932
943
  if(!produceLinkUrls) { return metadata; }
@@ -2361,7 +2372,7 @@ exports.CreateEncryptionConk = async function({libraryId, objectId, versionHash,
2361
2372
  });
2362
2373
 
2363
2374
  if(existingUserCap) {
2364
- this.encryptionConks[objectId] = await this.Crypto.DecryptCap(existingUserCap, this.signer.signingKey.privateKey);
2375
+ this.encryptionConks[objectId] = await this.Crypto.DecryptCap(existingUserCap, this.signer._signingKey().privateKey);
2365
2376
  } else {
2366
2377
  this.encryptionConks[objectId] = await this.Crypto.GeneratePrimaryConk({
2367
2378
  spaceId: this.contentSpaceId,
@@ -2373,7 +2384,7 @@ exports.CreateEncryptionConk = async function({libraryId, objectId, versionHash,
2373
2384
  objectId,
2374
2385
  writeToken,
2375
2386
  metadataSubtree: capKey,
2376
- metadata: await this.Crypto.EncryptConk(this.encryptionConks[objectId], this.signer.signingKey.publicKey)
2387
+ metadata: await this.Crypto.EncryptConk(this.encryptionConks[objectId], this.signer._signingKey().publicKey)
2377
2388
  });
2378
2389
  }
2379
2390
 
@@ -2464,7 +2475,7 @@ exports.EncryptionConk = async function({libraryId, objectId, versionHash, write
2464
2475
  });
2465
2476
 
2466
2477
  if(existingUserCap) {
2467
- this.encryptionConks[objectId] = await this.Crypto.DecryptCap(existingUserCap, this.signer.signingKey.privateKey);
2478
+ this.encryptionConks[objectId] = await this.Crypto.DecryptCap(existingUserCap, this.signer._signingKey().privateKey);
2468
2479
  } else if(writeToken) {
2469
2480
  await this.CreateEncryptionConk({libraryId, objectId, versionHash, writeToken, createKMSConk: false});
2470
2481
  } else {
@@ -656,7 +656,7 @@ exports.CopyContentObject = async function({libraryId, originalVersionHash, opti
656
656
  const userCapKey = `eluv.caps.iusr${this.utils.AddressToHash(this.signer.address)}`;
657
657
 
658
658
  if(metadata[userCapKey]) {
659
- const userConkKey = await this.Crypto.DecryptCap(metadata[userCapKey], this.signer.signingKey.privateKey);
659
+ const userConkKey = await this.Crypto.DecryptCap(metadata[userCapKey], this.signer._signingKey().privateKey);
660
660
  userConkKey.qid = objectId;
661
661
 
662
662
  await this.ReplaceMetadata({
@@ -664,7 +664,7 @@ exports.CopyContentObject = async function({libraryId, originalVersionHash, opti
664
664
  objectId,
665
665
  writeToken,
666
666
  metadataSubtree: userCapKey,
667
- metadata: await this.Crypto.EncryptConk(userConkKey, this.signer.signingKey.publicKey)
667
+ metadata: await this.Crypto.EncryptConk(userConkKey, this.signer._signingKey().publicKey)
668
668
  });
669
669
  }
670
670
 
@@ -709,7 +709,7 @@ exports.CreateNonOwnerCap = async function({objectId, libraryId, publicKey, writ
709
709
  throw Error("No user cap found for current user");
710
710
  }
711
711
 
712
- const userConk = await this.Crypto.DecryptCap(userCapValue, this.signer.signingKey.privateKey);
712
+ const userConk = await this.Crypto.DecryptCap(userCapValue, this.signer._signingKey().privateKey);
713
713
 
714
714
  const publicAddress = this.utils.PublicKeyToAddress(publicKey);
715
715
 
@@ -750,7 +750,7 @@ exports.CreateNonOwnerCap = async function({objectId, libraryId, publicKey, writ
750
750
  * meta: New metadata for the object - will be merged into existing metadata if specified
751
751
  * type: New type for the object - Object ID, version hash or name of type
752
752
  *
753
- * @returns {Promise<object>} - Response containing the object ID and write token of the draft
753
+ * @returns {Promise<object>} - Response containing the object ID and write token of the draft, as well as URL of node handling the draft
754
754
  */
755
755
  exports.EditContentObject = async function({libraryId, objectId, options={}}) {
756
756
  ValidateParameters({libraryId, objectId});
@@ -774,20 +774,27 @@ exports.EditContentObject = async function({libraryId, objectId, options={}}) {
774
774
 
775
775
  let path = UrlJoin("qid", objectId);
776
776
 
777
- let editResponse = await this.utils.ResponseToJson(
778
- this.HttpClient.Request({
779
- headers: await this.authClient.AuthorizationHeader({libraryId, objectId, update: true}),
780
- method: "POST",
781
- path: path,
782
- body: options
783
- })
784
- );
777
+ const rawEditResponse = await this.HttpClient.Request({
778
+ headers: await this.authClient.AuthorizationHeader({libraryId, objectId, update: true}),
779
+ method: "POST",
780
+ path: path,
781
+ body: options
782
+ });
783
+
784
+ const actualUrl = new URL(rawEditResponse.url);
785
+ actualUrl.pathname = "";
786
+ actualUrl.search = "";
787
+ actualUrl.hash = "";
788
+ const nodeUrl = actualUrl.href;
789
+
790
+ let editResponse = await this.utils.ResponseToJson(rawEditResponse);
785
791
 
786
792
  // Record the node used in creating this write token
787
- this.HttpClient.RecordWriteToken(editResponse.write_token);
793
+ this.HttpClient.RecordWriteToken(editResponse.write_token, nodeUrl);
788
794
 
789
795
  editResponse.writeToken = editResponse.write_token;
790
796
  editResponse.objectId = editResponse.id;
797
+ editResponse.nodeUrl = nodeUrl;
791
798
 
792
799
  return editResponse;
793
800
  };
@@ -1045,7 +1052,7 @@ exports.PublishContentVersion = async function({objectId, versionHash, awaitComm
1045
1052
  });
1046
1053
 
1047
1054
  const confirmEvent = events.find(blockEvents =>
1048
- blockEvents.find(event => objectHash === (event && event.values && event.values.objectHash))
1055
+ blockEvents.find(event => objectHash === (event && event.args && event.args.objectHash))
1049
1056
  );
1050
1057
 
1051
1058
  if(confirmEvent) {
@@ -455,7 +455,7 @@ exports.ExtractEventFromLogs = function({abi, event, eventName}) {
455
455
  */
456
456
  exports.ExtractValueFromEvent = function({abi, event, eventName, eventValue}) {
457
457
  const eventLog = this.ethClient.ExtractEventFromLogs({abi, event, eventName, eventValue});
458
- return eventLog ? eventLog.values[eventValue] : undefined;
458
+ return eventLog ? eventLog.args[eventValue] : undefined;
459
459
  };
460
460
 
461
461
  exports.FormatBlockNumbers = async function({fromBlock, toBlock, count=10}) {
@@ -2,50 +2,21 @@ const { ElvClient } = require("../src/ElvClient");
2
2
  const { ElvWalletClient } = require("../src/walletClient/index");
3
3
  const ClientConfiguration = require("../TestConfiguration.json");
4
4
 
5
+ const ethers = require("ethers");
6
+
5
7
  const Test = async () => {
6
8
  try {
7
- /*
8
- const client = await ElvClient.FromConfigurationUrl({
9
- configUrl: ClientConfiguration["config-url"]
9
+
10
+ const client = await ElvClient.FromNetworkName({
11
+ networkName: "demo"
10
12
  });
11
13
 
12
- let wallet = client.GenerateWallet();
13
- let signer = wallet.AddAccount({
14
+ const wallet = client.GenerateWallet();
15
+ const signer = wallet.AddAccount({
14
16
  privateKey: process.env.PRIVATE_KEY
15
17
  });
16
18
 
17
19
  client.SetSigner({signer});
18
-
19
- */
20
- //const idToken = "eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..-hVeBqfPm9f0dsZ_.h7ECJlFBsX1y8rfAVanFXoper2YBRd_yH3HyJiyV5fZJ-GGxMJR8y7gP_YIWS1D-zps4fR2QkFZ1j7DZKHQwZH0kOkCq-OYyNvLDHulF-uIY1HW9U-yfpyPO2K6Ukr0QcUvGASB7RyqqVLhvDAxCBYTpm4vEHo9DQrVal--9YlkdGogeF6HLLfYoFFCGdjb5korzaQIKyWTP4LsDDTZXITcCjHaCR9GC8rNHOybLy58IbEjukvJzooKpaRxzp20OuKr96-TDApKpklpCDCgiCsCvnOj5-CxhI10rs4frsFKF4s4d2RAa93RLplzy2SLJkg9zRe6cyezp9APZYGRUHb2wjEK8YXH0-_Uus48OIfPJQIbA-BatMHZUMTUJ9ZnYRCIL2FrIRu3QcaBR1KL2DYOJLVC3uQvNwUYV0_Yxr4CgooP2e6wb0Y61d5qU_O649XjIXIqHn0slr9lcAufIrG1or5D9Gc-yliF9BCoRZQi3Zgm80L6T3imO0XT8J3abTJpBJ9PtoW5cADPKEXz5GAENkjjay3YUyC4ZX_3u0ZdaNTOd8JAL6wKQRI3lBfJS_77MkTk8ea2JDCX4MJjYCIVOpIo_YVNOmx9cQEPSZiQ5.ZPc2LOM-vuHeZBrETCCOaA";
21
- //const idToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Inlwd1ZUbXJkWENkYU5tcjAzVGRDaCJ9.eyJodHRwczovL2F1dGguY29udGVudGZhYnJpYy5pby9nZW8iOnsiY291bnRyeV9jb2RlIjoiVVMiLCJjb3VudHJ5X2NvZGUzIjoiVVNBIiwiY291bnRyeV9uYW1lIjoiVW5pdGVkIFN0YXRlcyIsImNpdHlfbmFtZSI6IkZvbHNvbSIsImxhdGl0dWRlIjozOC42NzExLCJsb25naXR1ZGUiOi0xMjEuMTQ5NSwidGltZV96b25lIjoiQW1lcmljYS9Mb3NfQW5nZWxlcyIsImNvbnRpbmVudF9jb2RlIjoiTkEiLCJzdWJkaXZpc2lvbl9jb2RlIjoiQ0EiLCJzdWJkaXZpc2lvbl9uYW1lIjoiQ2FsaWZvcm5pYSJ9LCJuaWNrbmFtZSI6ImtldmluKzciLCJuYW1lIjoia2V2aW4rN0BlbHV2LmlvIiwicGljdHVyZSI6Imh0dHBzOi8vcy5ncmF2YXRhci5jb20vYXZhdGFyL2ZkNDMxN2Y4ZjdmMzBjNTVkZTA2YTI5Y2ExY2I2OWYxP3M9NDgwJnI9cGcmZD1odHRwcyUzQSUyRiUyRmNkbi5hdXRoMC5jb20lMkZhdmF0YXJzJTJGa2UucG5nIiwidXBkYXRlZF9hdCI6IjIwMjItMDctMjJUMjE6NTU6MjkuOTQ4WiIsImVtYWlsIjoia2V2aW4rN0BlbHV2LmlvIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJpc3MiOiJodHRwczovL2F1dGguY29udGVudGZhYnJpYy5pby8iLCJzdWIiOiJhdXRoMHw2MTY2NzcxNzg5OWI5MjAwNzBmMzRhYzQiLCJhdWQiOiJPTnl1YlA5ckZJNUJIem1ZZ2xRS0JaMWJCYml5b0IzUyIsImlhdCI6MTY1ODUyNzA1NywiZXhwIjoxNjU4NTYzMDU3LCJub25jZSI6Ilh6a3pUakF1VW5CRFgwVTVkR1pxU0dWK2JHazFjVXArUlZOamJWTlhlbFZzUzJSSWFUZE9hSEJsT1E9PSJ9.nLH00sOatOcuIv-QPgCp6Pjm565RpLqqy3VOtzJt9p2rSsIBgJxfl6j1zuFQV_H5UquYTx15BNN3_WglqVXF7U-aCb7ozsYsQCl4nv8rjumkla2pRUGCFt89B7-NR8yGXr9eak6IgE6ADe6uqiM10CWmxp8BI3Z1PficNGVDUcwmrTW_IeDFyqTw_gedDVAeYcd79xMGR5exqiHD6P2AljXKAXzNaaAVrRbBp1FBrNZnuD97k-EDta6G6lr1qqN1Gc2oS2vTrfjPjmHMBtz99_UYSrfPjPSrRMpPi9Vt3YTzEBTb-BTOKG1SSfBVHkxOqIRO1ZlNxE_bPCMJXwhSVA"
22
- //const idToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2NTg1MjkwMTQsIm5iZiI6MTY1ODUyODcxNCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly93ZGNiMmMuYjJjbG9naW4uY29tL3RmcC9mYWVhYTg5ZS02YTA1LTRjMzEtOGJkNS01MGRlNWNkNGQyZTEvYjJjXzFfbXNfc2lnbl91cF9pbi92Mi4wLyIsInN1YiI6IjVhYWIyOWNiLWRiZDMtNDM1ZS04MzViLTlmYmFkYTBkODg2MyIsImF1ZCI6ImFjYjQ3MjMzLTk3ZDUtNGFjMy04OWQzLTdkMTUzNjFjMjYzNiIsImlhdCI6MTY1ODUyODcxNCwiYXV0aF90aW1lIjoxNjU4NTI4NzAxLCJpZHAiOiJsaXZlLmNvbSIsImVtYWlscyI6WyJrZXZpbkBlbHV2LmlvIl0sInRmcCI6IkIyQ18xX21zX3NpZ25fdXBfaW4ifQ.H9-YrUQFDBM8potZpGJsNA1roQ15SiBUg40_C9XVy5LQ6thGKuM7TzxJj1ALViwLTEL1ytL5r6g8r0tVYWOiQwfU1W7m7m0rK4D6VJ-pby69o0f4jZaqdWLak-ALncxAl1IOaxtDD2vpmx8XTT8Qabp8DImzK9xzc0bAUirPERUK08lJ3LR8bZjH2TaLMvEii9i-Ss0kZoSvdZI_a4xQqXcU2knJ-2Ds-S-upAAq70lMnSlmG16-MGHM2ZGtz7w6O2FoS9CRs0QI9FBtziSEVMAVigKIMLtWcJwPOnFDeCv_qY2TpOabUzyjfm0DZDlcQRnNjV6i0LfwYLyNWGmcHg";
23
- const idToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2NTg1MzAyMjYsIm5iZiI6MTY1ODUyOTkyNiwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly93ZGNiMmMuYjJjbG9naW4uY29tL3RmcC9mYWVhYTg5ZS02YTA1LTRjMzEtOGJkNS01MGRlNWNkNGQyZTEvYjJjXzFfbXNfc2lnbl91cF9pbi92Mi4wLyIsInN1YiI6IjVhYWIyOWNiLWRiZDMtNDM1ZS04MzViLTlmYmFkYTBkODg2MyIsImF1ZCI6ImFjYjQ3MjMzLTk3ZDUtNGFjMy04OWQzLTdkMTUzNjFjMjYzNiIsImlhdCI6MTY1ODUyOTkyNiwiYXV0aF90aW1lIjoxNjU4NTI5OTA2LCJpZHAiOiJsaXZlLmNvbSIsImVtYWlscyI6WyJrZXZpbkBlbHV2LmlvIl0sInRmcCI6IkIyQ18xX21zX3NpZ25fdXBfaW4ifQ.H1rbbrKCzU2dkdWe62GCTlOHACLbr8IV8UDiL1nukyerGrBVq_LtguLJAOjKO1jBClyJDOTMgI9y1wGb1zHdF2tCeN75wNwXCUUC5hn_TcemLOgp-haAEMC7KFFdR-4K_5A7IUUW9IqOQciE5DKNCKRDOKVNsDoMg7eV3VFp8QSeSCp7OGWL9FI1dWLmD6D_uoHfyYxE96LPrB-VCveCThQgsLMb6QE072S05w8ZM8CGxbLXcgKWG3VVaKT95e1e0NlDWQYlQQGFMBirUISpA3D82q3Wm4QlrANfGv49oypdnj-T4Uclu6pVnNwLvCIisj5w2GLobiyyyqMhEEsI1Q";
24
-
25
- const client = await ElvWalletClient.Initialize({
26
- network: "demo",
27
- mode: "staging"
28
- });
29
-
30
- /*
31
- console.log(
32
- await client.AuthenticateOAuth({
33
- idToken,
34
- signerURIs: [
35
- "https://wlt.stg.svc.eluv.io"
36
- ]
37
- })
38
- );
39
-
40
- */
41
-
42
- await client.Authenticate({
43
- token: "DYxK5cLMW5ofVh3pU23TmbAzkpFAsYrQQLsantU3uHFCJgyAjNoRHE7HvSCbQzZx1F33JM65R6oWZ1ZLYPEUhfA3WrnN9emo69A6AAKyFNBecKSFn3T6PP5MxMMPZRwN6AgwmuRgZMJQthF1xo7cMUqVwZCXtdHARYSrTHoRe3QMPggd6EJ6MzK7WHv2Sb7MPGGyVCR8uC4mK9SbncNm77Fj4H2LWxQpQggnF579GWv3SwAYiUBhbtgnfw6WEzyo1ZmBTV8vSkMiDAyBoMC138nokWNZc6DkpBNkyn6z3GwszoPsdXezKv7vANEVF6rrD3odbjosJpRoWbeEoPkebjoVySTgU8ywJybCDzeoFcg2XC1FQ4nyBhv5o3UVyXWispw3hN7oNs65vt9DaXmXwy45HzG3vL7PNdK8qviBg5XttCHUxkQ2aeYXTXcUzBYJ34PgDTXPBUwrj7a5FBa3gyC42eu48DAyxaFtV6GC5SXJCczTgQW6DPTrXiwzyEkBbVCoyDbMepaAA5MWH5WmpeWWzuexbHhKd3qW2ukWMHyjJpwAy1aUMZXGrAx3eGjTTmev342DqsV8ECHw9zPuzKv7MufkU7A9N9Wgi6jWoZXZvbMySxuRo81CV7XQZ6Zvcfy2xXFbtu5rgYA1xxhZaGZBioMUgT3HwEo1eqJuvs7r1QW3t1mMx9zbAJDTJtHFsYu4nkvyrDHQwDgKvQmnzSDhUs7yxeKeVKeFi2wy4QkXz56VJKxp3CtB9gM8qMLP3eUg1B3BRaNH8uPmy7qVYn3wn9epwPA2fDwR6MbunU5C4kx7rTbZmiQtKW4VUVP8iL6MvVy6Wx3NEXCeTmaSDz2BAfkrv7zFmC9ERyeqfrPvCYDyeTV2PHA6vVmdh5cXo6meJWKCD6jc5QAd6J7D1hJw6PWP8gyUQZGtZ6Xd9v82v3cP1L6njMWc4kpivB41mUF7Q86Zy8EoZ2xYhFrU3MoUuNPV3ApVKRqUmcL4cpKhbcSCgPi8QvnhUCjZGyEtxLwzCaRhXa"
44
- })
45
-
46
- console.log(
47
- await client.PersonalSign({message: "test"})
48
- )
49
20
  } catch(error) {
50
21
  console.error(error);
51
22
  console.error(JSON.stringify(error, null, 2));