core-3nweb-client-lib 0.27.8 → 0.27.10

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.
@@ -42,7 +42,7 @@ export declare class NodesContainer {
42
42
  node?: T;
43
43
  nodePromise?: Promise<T>;
44
44
  };
45
- setPromise(objId: string, promise: Promise<Node>): void;
45
+ setPromise<T extends Node>(objId: string, promise: Promise<T>): Promise<T>;
46
46
  delete(node: Node): boolean;
47
47
  reserveId(objId: string): boolean;
48
48
  clear(): void;
@@ -44,7 +44,7 @@ class NodesContainer {
44
44
  }
45
45
  set(node) {
46
46
  const existing = this.nodes.get(node.objId);
47
- if (existing) {
47
+ if (existing && (existing !== node)) {
48
48
  throw new Error(`Cannot add second node for the same id ${node.objId}`);
49
49
  }
50
50
  this.nodes.set(node.objId, node);
@@ -72,6 +72,7 @@ class NodesContainer {
72
72
  })();
73
73
  this.promises.set(objId, envelopedPromise);
74
74
  envelopedPromise.catch(noop);
75
+ return envelopedPromise;
75
76
  }
76
77
  delete(node) {
77
78
  const existing = this.get(node.objId);
@@ -127,7 +127,16 @@ class FolderNode extends node_in_fs_1.NodeInFS {
127
127
  return rf;
128
128
  }
129
129
  static async rootFromLinkParams(storage, params) {
130
- const existingNode = storage.nodes.get(params.objId);
130
+ let { node: existingNode, nodePromise } = storage.nodes.getNodeOrPromise(params.objId);
131
+ if (nodePromise) {
132
+ try {
133
+ existingNode = await nodePromise;
134
+ }
135
+ catch (err) {
136
+ // ignore errors from other invokation
137
+ return FolderNode.rootFromLinkParams(storage, params);
138
+ }
139
+ }
131
140
  if (existingNode) {
132
141
  if (existingNode.type !== 'folder') {
133
142
  throw new Error(`Existing object ${params.objId} type is ${existingNode.type}, while link parameters ask for folder.`);
@@ -135,12 +144,16 @@ class FolderNode extends node_in_fs_1.NodeInFS {
135
144
  // Note that, although we return existing folder node, we should check
136
145
  // if link parameters contained correct key. Only holder of a correct
137
146
  // key may use existing object.
138
- existingNode.crypto.compareKey(params.fKey);
147
+ if (!existingNode.crypto.compareKey(params.fKey)) {
148
+ throw new Error(`Link parameters don't contain correct key to instantiate target folder.`);
149
+ }
139
150
  return existingNode;
140
151
  }
141
- const src = await storage.getObjSrc(params.objId);
142
- const key = buffer_utils_1.base64.open(params.fKey);
143
- return FolderNode.rootFromObjBytes(storage, params.folderName, params.objId, src, key);
152
+ return await storage.nodes.setPromise(params.objId, storage.getObjSrc(params.objId)
153
+ .then(async (src) => {
154
+ const key = buffer_utils_1.base64.open(params.fKey);
155
+ return FolderNode.rootFromObjBytes(storage, params.folderName, params.objId, src, key);
156
+ }));
144
157
  }
145
158
  static rootFromJSON(storage, name, folderJson) {
146
159
  const rf = new FolderNode(storage, name, 'readonly-root', EMPTY_ARR, 0, undefined, EMPTY_ARR, false);
@@ -294,7 +307,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
294
307
  return nodePromise;
295
308
  }
296
309
  const deferred = (0, deferred_1.defer)();
297
- this.storage.nodes.setPromise(info.objId, deferred.promise);
310
+ const nodeSet = this.storage.nodes.setPromise(info.objId, deferred.promise);
298
311
  try {
299
312
  let node;
300
313
  if (info.isFile) {
@@ -311,14 +324,14 @@ class FolderNode extends node_in_fs_1.NodeInFS {
311
324
  throw new Error(`Unknown type of fs node`);
312
325
  }
313
326
  deferred.resolve(node);
314
- return deferred.promise;
327
+ return nodeSet;
315
328
  }
316
329
  catch (exc) {
317
330
  if (exc.objNotFound) {
318
331
  await this.fixMissingChildAndThrow(exc, info);
319
332
  }
320
333
  deferred.reject((0, error_1.errWithCause)(exc, `Failed to instantiate fs node '${this.name}/${info.name}'`));
321
- return deferred.promise;
334
+ return nodeSet;
322
335
  }
323
336
  }
324
337
  getFolder(name, undefOnMissing = false) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "core-3nweb-client-lib",
3
- "version": "0.27.8",
3
+ "version": "0.27.10",
4
4
  "description": "3NWeb client core library, embeddable into different environments",
5
5
  "main": "build/lib-index.js",
6
6
  "types": "build/lib-index.d.ts",