core-3nweb-client-lib 0.47.4 → 0.48.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.
Files changed (88) hide show
  1. package/build/core/asmail/delivery/common.d.ts +2 -0
  2. package/build/core/asmail/delivery/msg.js +2 -2
  3. package/build/core/asmail/inbox/attachments/fs.d.ts +2 -1
  4. package/build/core/asmail/inbox/attachments/fs.js +4 -3
  5. package/build/core/asmail/inbox/index.d.ts +3 -0
  6. package/build/core/asmail/inbox/index.js +4 -3
  7. package/build/core/asmail/index.d.ts +3 -1
  8. package/build/core/asmail/index.js +5 -2
  9. package/build/core/asmail/msg/packer.d.ts +4 -2
  10. package/build/core/asmail/msg/packer.js +28 -22
  11. package/build/core/asmail/sending-params/index.d.ts +2 -1
  12. package/build/core/asmail/sending-params/index.js +2 -2
  13. package/build/core/asmail/sending-params/invitations-anon.d.ts +3 -1
  14. package/build/core/asmail/sending-params/invitations-anon.js +6 -5
  15. package/build/core/id-manager/index.d.ts +4 -2
  16. package/build/core/id-manager/index.js +8 -7
  17. package/build/core/index.d.ts +3 -1
  18. package/build/core/index.js +11 -10
  19. package/build/core/keyring/common.d.ts +3 -2
  20. package/build/core/keyring/common.js +7 -7
  21. package/build/core/keyring/correspondent-keys.d.ts +4 -2
  22. package/build/core/keyring/correspondent-keys.js +10 -9
  23. package/build/core/keyring/index.d.ts +3 -1
  24. package/build/core/keyring/index.js +6 -5
  25. package/build/core/keyring/published-intro-key.d.ts +3 -1
  26. package/build/core/keyring/published-intro-key.js +5 -4
  27. package/build/core/startup/sign-up.d.ts +7 -5
  28. package/build/core/startup/sign-up.js +9 -8
  29. package/build/core/storage/index.d.ts +5 -3
  30. package/build/core/storage/index.js +9 -8
  31. package/build/core/storage/local/storage.d.ts +3 -1
  32. package/build/core/storage/local/storage.js +5 -4
  33. package/build/core/storage/synced/storage.d.ts +4 -2
  34. package/build/core/storage/synced/storage.js +7 -6
  35. package/build/injected-globals/platform-devfs.d.ts +1 -1
  36. package/build/ipc-via-protobuf/connector-services-side.js +1 -2
  37. package/build/lib-client/mailer-id/provisioner.d.ts +3 -1
  38. package/build/lib-client/mailer-id/provisioner.js +3 -3
  39. package/build/lib-client/request-utils.d.ts +2 -2
  40. package/build/lib-client/request-utils.js +3 -3
  41. package/build/lib-client/xsp-fs/common.d.ts +2 -0
  42. package/build/lib-client/xsp-fs/common.js +2 -1
  43. package/build/lib-client/xsp-fs/file-node.d.ts +2 -1
  44. package/build/lib-client/xsp-fs/file-node.js +3 -3
  45. package/build/lib-client/xsp-fs/folder-node.d.ts +3 -2
  46. package/build/lib-client/xsp-fs/folder-node.js +10 -11
  47. package/build/lib-client/xsp-fs/link-node.d.ts +2 -1
  48. package/build/lib-client/xsp-fs/link-node.js +3 -3
  49. package/build/lib-client/xsp-fs/node-persistence.d.ts +4 -2
  50. package/build/lib-client/xsp-fs/node-persistence.js +4 -4
  51. package/build/lib-common/mailerid-sigs/id-provider.d.ts +6 -5
  52. package/build/lib-common/mailerid-sigs/id-provider.js +7 -7
  53. package/build/lib-common/mailerid-sigs/user.d.ts +3 -2
  54. package/build/lib-common/mailerid-sigs/user.js +1 -1
  55. package/build/lib-common/mailerid-sigs/utils-NaCl-Ed.d.ts +3 -2
  56. package/build/lib-common/mailerid-sigs/utils-NaCl-Ed.js +4 -4
  57. package/build/lib-common/rng-def.d.ts +3 -0
  58. package/build/lib-common/rng-def.js +32 -0
  59. package/build/{lib-common → lib-common-on-node}/random-node.js +2 -2
  60. package/build/lib-common-on-node/request-from-node.js +2 -2
  61. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.js +2 -2
  62. package/build/tests/caps-api/file-sink-checks/different-cases.js +1 -1
  63. package/build/tests/caps-api/file-sink-checks/splice.js +5 -5
  64. package/build/tests/caps-api/file-sink-checks/truncate.js +2 -2
  65. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.js +3 -3
  66. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.js +2 -2
  67. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.js +3 -3
  68. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.js +10 -10
  69. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.js +1 -1
  70. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.js +1 -1
  71. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.js +1 -1
  72. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.js +1 -1
  73. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.js +1 -1
  74. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.js +1 -1
  75. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.js +1 -1
  76. package/build/tests/caps-api/fs-checks/versioned/getByteSink.js +4 -4
  77. package/build/tests/caps-api/fs-checks/versioned/getByteSource.js +2 -2
  78. package/build/tests/caps-api/fs-checks/versioned/readBytes.js +3 -3
  79. package/build/tests/caps-api/fs-checks/versioned/writeBytes.js +9 -9
  80. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.js +1 -1
  81. package/build/tests/caps-api/startup/signin-empty-cache.js +1 -1
  82. package/build/tests/computer.3nweb.core/id-manager.js +1 -1
  83. package/build/tests/libs-for-tests/core-runner.js +2 -2
  84. package/build/tests/units/folder-node-serialization.js +1 -1
  85. package/build/tests/units/mid-sigs-NaCl-Ed.js +10 -9
  86. package/build/tests/units/obj-folders.js +1 -1
  87. package/package.json +1 -1
  88. /package/build/{lib-common → lib-common-on-node}/random-node.d.ts +0 -0
@@ -22,7 +22,6 @@ const user_with_pkl_session_1 = require("../user-with-pkl-session");
22
22
  const jwkeys_1 = require("../../lib-common/jwkeys");
23
23
  const json_utils_1 = require("../../lib-common/json-utils");
24
24
  const canonical_address_1 = require("../../lib-common/canonical-address");
25
- const random = require("../../lib-common/random-node");
26
25
  const api = require("../../lib-common/service-api/mailer-id/provisioning");
27
26
  const assert_1 = require("../../lib-common/assert");
28
27
  const user_1 = require("../../lib-common/mailerid-sigs/user");
@@ -40,11 +39,12 @@ class MailerIdProvisioner extends user_with_pkl_session_1.ServiceUser {
40
39
  * @param userId
41
40
  * @param uri identifies place of MailerId service.
42
41
  */
43
- constructor(userId, serviceUri, net) {
42
+ constructor(userId, serviceUri, net, random) {
44
43
  super(userId, {
45
44
  login: '',
46
45
  logout: ''
47
46
  }, net);
47
+ this.random = random;
48
48
  this.userCert = undefined;
49
49
  this.provCert = undefined;
50
50
  this.midDomain = undefined;
@@ -142,7 +142,7 @@ class MailerIdProvisioner extends user_with_pkl_session_1.ServiceUser {
142
142
  * Undefined value means that a default key should be used.
143
143
  */
144
144
  async provisionSigner(keyId) {
145
- const pair = (0, user_1.generateSigningKeyPair)(random.bytesSync);
145
+ const pair = await (0, user_1.generateSigningKeyPair)(this.random);
146
146
  await this.setUrlAndDomain();
147
147
  const login = await this.super_login(keyId);
148
148
  const completion = async (dhsharedKeyCalc, certDuration, assertDuration = DEFAULT_ASSERTION_VALIDITY) => {
@@ -28,9 +28,9 @@ export interface Headers {
28
28
  get(name: string): string | undefined;
29
29
  }
30
30
  export type ContentType = 'application/json' | 'application/octet-stream' | 'text/plain';
31
- export type RequestFn<T> = (opts: RequestOpts, contentType?: ContentType, reqBody?: Uint8Array) => Promise<Reply<T>>;
31
+ export type RequestFn<T> = (opts: RequestOpts, reqContentType?: ContentType, reqBody?: Uint8Array) => Promise<Reply<T>>;
32
32
  export declare function processRequest<T>(requester: (opts: https.RequestOptions) => ClientRequest, httpsOpts: https.RequestOptions, opts: RequestOpts, reqBody: Uint8Array | undefined, attempt?: number): Promise<Reply<T>>;
33
- export declare function formHttpsReqOpts(opts: RequestOpts, contentType?: ContentType, reqBody?: Uint8Array): https.RequestOptions;
33
+ export declare function formHttpsReqOpts(opts: RequestOpts, reqContentType?: ContentType, reqBody?: Uint8Array): https.RequestOptions;
34
34
  export declare function extractIntHeader(rep: Reply<any>, headerName: string): number;
35
35
  export type OpenWebSocket = (url: string, sessionId: string) => Promise<Reply<WebSocket>>;
36
36
  export interface NetClient {
@@ -45,7 +45,7 @@ async function processRequest(requester, httpsOpts, opts, reqBody, attempt = 0)
45
45
  throw err;
46
46
  }
47
47
  }
48
- function formHttpsReqOpts(opts, contentType, reqBody) {
48
+ function formHttpsReqOpts(opts, reqContentType, reqBody) {
49
49
  var _a;
50
50
  if (!opts.url) {
51
51
  throw new Error(`Cannot send net request, cause url is not set in given options.`);
@@ -65,8 +65,8 @@ function formHttpsReqOpts(opts, contentType, reqBody) {
65
65
  if (reqBody) {
66
66
  netReqOpts.headers['Content-Length'] = reqBody.length;
67
67
  }
68
- if (contentType) {
69
- netReqOpts.headers[exports.CONTENT_TYPE_HEADER] = contentType;
68
+ if (reqContentType) {
69
+ netReqOpts.headers[exports.CONTENT_TYPE_HEADER] = reqContentType;
70
70
  }
71
71
  if (opts.sessionId) {
72
72
  netReqOpts.headers[exports.SESSION_ID_HEADER] = opts.sessionId;
@@ -3,6 +3,7 @@ import type { AsyncSBoxCryptor, Subscribe, ObjSource } from 'xsp-files';
3
3
  import type { Observable } from 'rxjs';
4
4
  import type { LogError } from '../logging/log-to-file';
5
5
  import { StorageConnectionStatus } from '../../core/storage/synced/remote-events';
6
+ import { AsyncRNG } from '../../lib-common/rng-def';
6
7
  export type { AsyncSBoxCryptor } from 'xsp-files';
7
8
  export type { FolderInJSON } from './folder-node';
8
9
  type StorageType = web3n.files.FSType;
@@ -48,6 +49,7 @@ export interface Storage {
48
49
  readonly type: StorageType;
49
50
  readonly versioned: boolean;
50
51
  readonly cryptor: AsyncSBoxCryptor;
52
+ readonly random: AsyncRNG;
51
53
  readonly nodes: NodesContainer;
52
54
  readonly logError: LogError;
53
55
  getNodeEvents(): Observable<NodeEvent>;
@@ -103,7 +103,8 @@ function wrapStorageImplementation(impl) {
103
103
  close: impl.close.bind(impl),
104
104
  removeObj: impl.removeObj.bind(impl),
105
105
  status: impl.status.bind(impl),
106
- cryptor: impl.cryptor
106
+ cryptor: impl.cryptor,
107
+ random: impl.random
107
108
  };
108
109
  return Object.freeze(wrap);
109
110
  }
@@ -8,6 +8,7 @@ import { Storage, AsyncSBoxCryptor } from './common';
8
8
  import { Subscribe, ObjSource } from 'xsp-files';
9
9
  import { CommonAttrs, XAttrs } from './attrs';
10
10
  import { NodePersistance } from './node-persistence';
11
+ import { AsyncRNG } from '../../lib-common/rng-def';
11
12
  type FileByteSource = web3n.files.FileByteSource;
12
13
  type FileByteSink = web3n.files.FileByteSink;
13
14
  type XAttrsChanges = web3n.files.XAttrsChanges;
@@ -20,7 +21,7 @@ interface FileAttrs {
20
21
  xattrs?: XAttrs;
21
22
  }
22
23
  declare class FilePersistance extends NodePersistance {
23
- constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
24
+ constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor, random: AsyncRNG);
24
25
  getFileAttrs(objSrc: ObjSource): Promise<FileAttrs>;
25
26
  getFileSource(objSrc: ObjSource): Promise<FileByteSource>;
26
27
  readBytes(objSrc: ObjSource, start: number | undefined, end: number | undefined): Promise<Uint8Array | undefined>;
@@ -30,8 +30,8 @@ const attrs_1 = require("./attrs");
30
30
  const file_1 = require("../../lib-common/exceptions/file");
31
31
  const node_persistence_1 = require("./node-persistence");
32
32
  class FilePersistance extends node_persistence_1.NodePersistance {
33
- constructor(zNonce, key, cryptor) {
34
- super(zNonce, key, cryptor);
33
+ constructor(zNonce, key, cryptor, random) {
34
+ super(zNonce, key, cryptor, random);
35
35
  Object.seal(this);
36
36
  }
37
37
  async getFileAttrs(objSrc) {
@@ -87,7 +87,7 @@ class FileNode extends node_in_fs_1.NodeInFS {
87
87
  if (!fileName || !objId) {
88
88
  throw new Error("Bad file parameter(s) given");
89
89
  }
90
- this.crypto = new FilePersistance((0, xsp_files_1.idToHeaderNonce)(this.objId), key, this.storage.cryptor);
90
+ this.crypto = new FilePersistance((0, xsp_files_1.idToHeaderNonce)(this.objId), key, this.storage.cryptor, this.storage.random);
91
91
  Object.seal(this);
92
92
  }
93
93
  static async makeForNew(storage, parentId, name, key) {
@@ -6,6 +6,7 @@ import { LinkParameters } from '../fs-utils/files';
6
6
  import { AsyncSBoxCryptor, Subscribe, ObjSource } from 'xsp-files';
7
7
  import { CommonAttrs, XAttrs } from './attrs';
8
8
  import { NodePersistance } from './node-persistence';
9
+ import { AsyncRNG } from '../../lib-common/rng-def';
9
10
  type ListingEntry = web3n.files.ListingEntry;
10
11
  type XAttrsChanges = web3n.files.XAttrsChanges;
11
12
  type FolderDiff = web3n.files.FolderDiff;
@@ -54,14 +55,14 @@ export interface FolderInJSON extends FolderInfo {
54
55
  xattrs?: any;
55
56
  }
56
57
  declare class FolderPersistance extends NodePersistance {
57
- constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
58
+ constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor, random: AsyncRNG);
58
59
  write(folderInfo: FolderInfo, version: number, attrs: CommonAttrs, xattrs: XAttrs | undefined): Promise<Subscribe>;
59
60
  read(src: ObjSource): Promise<{
60
61
  folderInfo: FolderInfo;
61
62
  attrs: CommonAttrs;
62
63
  xattrs?: XAttrs;
63
64
  }>;
64
- static readFolderContent(objId: string | null, key: Uint8Array, src: ObjSource, cryptor: AsyncSBoxCryptor): Promise<FolderInfo>;
65
+ static readFolderContent(objId: string | null, key: Uint8Array, src: ObjSource, cryptor: AsyncSBoxCryptor, random: AsyncRNG): Promise<FolderInfo>;
65
66
  }
66
67
  export interface FolderLinkParams {
67
68
  folderName: string;
@@ -32,7 +32,6 @@ const exceptions_1 = require("./exceptions");
32
32
  const deferred_1 = require("../../lib-common/processes/deferred");
33
33
  const json_utils_1 = require("../../lib-common/json-utils");
34
34
  const xsp_files_1 = require("xsp-files");
35
- const random = require("../../lib-common/random-node");
36
35
  const folder_node_serialization_1 = require("./folder-node-serialization");
37
36
  const attrs_1 = require("./attrs");
38
37
  const node_persistence_1 = require("./node-persistence");
@@ -50,8 +49,8 @@ function jsonToInfoAndAttrs(json) {
50
49
  return { attrs, folderInfo };
51
50
  }
52
51
  class FolderPersistance extends node_persistence_1.NodePersistance {
53
- constructor(zNonce, key, cryptor) {
54
- super(zNonce, key, cryptor);
52
+ constructor(zNonce, key, cryptor, random) {
53
+ super(zNonce, key, cryptor, random);
55
54
  Object.seal(this);
56
55
  }
57
56
  async write(folderInfo, version, attrs, xattrs) {
@@ -63,12 +62,12 @@ class FolderPersistance extends node_persistence_1.NodePersistance {
63
62
  const folderInfo = (0, folder_node_serialization_1.parseFolderInfo)(content);
64
63
  return { folderInfo, xattrs, attrs: attrs_1.CommonAttrs.fromAttrs(attrs) };
65
64
  }
66
- static async readFolderContent(objId, key, src, cryptor) {
65
+ static async readFolderContent(objId, key, src, cryptor, random) {
67
66
  if (objId === null) {
68
67
  throw new Error("Missing objId for non-root folder");
69
68
  }
70
69
  const zNonce = (0, xsp_files_1.idToHeaderNonce)(objId);
71
- const { folderInfo } = await (new FolderPersistance(zNonce, key, cryptor)).read(src);
70
+ const { folderInfo } = await (new FolderPersistance(zNonce, key, cryptor, random)).read(src);
72
71
  return folderInfo;
73
72
  }
74
73
  }
@@ -95,14 +94,14 @@ class FolderNode extends node_in_fs_1.NodeInFS {
95
94
  else if (objId === null) {
96
95
  throw new Error("Missing objId for non-root folder");
97
96
  }
98
- this.crypto = new FolderPersistance(zNonce, key, storage.cryptor);
97
+ this.crypto = new FolderPersistance(zNonce, key, storage.cryptor, storage.random);
99
98
  if (setNewAttrs) {
100
99
  this.attrs = attrs_1.CommonAttrs.makeForTimeNow();
101
100
  }
102
101
  Object.seal(this);
103
102
  }
104
103
  static async newRoot(storage, key) {
105
- const zNonce = await random.bytes(xsp_files_1.NONCE_LENGTH);
104
+ const zNonce = await storage.random(xsp_files_1.NONCE_LENGTH);
106
105
  const rf = new FolderNode(storage, undefined, null, zNonce, 0, undefined, key, true);
107
106
  rf.storage.nodes.set(rf);
108
107
  await rf.saveFirstVersion(undefined);
@@ -486,7 +485,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
486
485
  * @param name
487
486
  */
488
487
  async makeAndSaveNewChildFolderNode(name, changes) {
489
- const key = await random.bytes(xsp_files_1.KEY_LENGTH);
488
+ const key = await this.storage.random(xsp_files_1.KEY_LENGTH);
490
489
  const childObjId = await this.storage.generateNewObjId();
491
490
  const node = new FolderNode(this.storage, name, childObjId, (0, xsp_files_1.idToHeaderNonce)(childObjId), 0, this.objId, key, true);
492
491
  await node.saveFirstVersion(changes).catch((exc) => {
@@ -514,7 +513,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
514
513
  * @param name
515
514
  */
516
515
  async makeAndSaveNewChildFileNode(name) {
517
- const key = await random.bytes(xsp_files_1.KEY_LENGTH);
516
+ const key = await this.storage.random(xsp_files_1.KEY_LENGTH);
518
517
  const node = await file_node_1.FileNode.makeForNew(this.storage, this.objId, name, key);
519
518
  await node.save([]).catch((exc) => {
520
519
  if (!exc.objExists) {
@@ -531,7 +530,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
531
530
  * @param params
532
531
  */
533
532
  async makeAndSaveNewChildLinkNode(name, params) {
534
- const key = await random.bytes(xsp_files_1.KEY_LENGTH);
533
+ const key = await this.storage.random(xsp_files_1.KEY_LENGTH);
535
534
  const node = await link_node_1.LinkNode.makeForNew(this.storage, this.objId, name, key);
536
535
  await node.save(params).catch((exc) => {
537
536
  if (!exc.objExists) {
@@ -895,7 +894,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
895
894
  if (node.isFolder) {
896
895
  const objs = [node.objId];
897
896
  const src = await storage.getObjSrc(node.objId, versionBeforeRm, true);
898
- const folderContent = await FolderPersistance.readFolderContent(node.objId, node.key, src, storage.cryptor);
897
+ const folderContent = await FolderPersistance.readFolderContent(node.objId, node.key, src, storage.cryptor, storage.random);
899
898
  for (const child of Object.values(folderContent.nodes)) {
900
899
  (0, for_arrays_1.appendArray)(objs, await this.listRemovedInTreeToUploadRm(child));
901
900
  }
@@ -8,10 +8,11 @@ import { Storage, AsyncSBoxCryptor } from './common';
8
8
  import { ObjSource, Subscribe } from 'xsp-files';
9
9
  import { CommonAttrs, XAttrs } from './attrs';
10
10
  import { NodePersistance } from './node-persistence';
11
+ import { AsyncRNG } from '../../lib-common/rng-def';
11
12
  type VersionedReadFlags = web3n.files.VersionedReadFlags;
12
13
  type Stats = web3n.files.Stats;
13
14
  declare class LinkPersistance extends NodePersistance {
14
- constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
15
+ constructor(zNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor, random: AsyncRNG);
15
16
  read(src: ObjSource): Promise<{
16
17
  params: LinkParameters<any>;
17
18
  attrs: CommonAttrs;
@@ -30,8 +30,8 @@ const xsp_files_1 = require("xsp-files");
30
30
  const attrs_1 = require("./attrs");
31
31
  const node_persistence_1 = require("./node-persistence");
32
32
  class LinkPersistance extends node_persistence_1.NodePersistance {
33
- constructor(zNonce, key, cryptor) {
34
- super(zNonce, key, cryptor);
33
+ constructor(zNonce, key, cryptor, random) {
34
+ super(zNonce, key, cryptor, random);
35
35
  Object.seal(this);
36
36
  }
37
37
  async read(src) {
@@ -82,7 +82,7 @@ class LinkNode extends node_in_fs_1.NodeInFS {
82
82
  if (!name || !objId || !parentId) {
83
83
  throw new Error("Bad link parameter(s) given");
84
84
  }
85
- this.crypto = new LinkPersistance((0, xsp_files_1.idToHeaderNonce)(this.objId), key, this.storage.cryptor);
85
+ this.crypto = new LinkPersistance((0, xsp_files_1.idToHeaderNonce)(this.objId), key, this.storage.cryptor, this.storage.random);
86
86
  Object.seal(this);
87
87
  }
88
88
  static async makeForNew(storage, parentId, name, key) {
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { AsyncSBoxCryptor, Subscribe, ObjSource } from 'xsp-files';
6
6
  import { CommonAttrs, XAttrs } from './attrs';
7
+ import { AsyncRNG } from '../../lib-common/rng-def';
7
8
  /**
8
9
  * This does reading and writing, keeping keys. This and extending objects are
9
10
  * used in file system nodes as thematic place with persistence functionality.
@@ -11,9 +12,10 @@ import { CommonAttrs, XAttrs } from './attrs';
11
12
  export declare abstract class NodePersistance {
12
13
  private zerothHeaderNonce;
13
14
  private key;
14
- private cryptor;
15
+ private readonly cryptor;
16
+ protected readonly random: AsyncRNG;
15
17
  private workLabel;
16
- protected constructor(zerothHeaderNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
18
+ protected constructor(zerothHeaderNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor, random: AsyncRNG);
17
19
  wipe(): void;
18
20
  compareKey(keyB64: string): boolean;
19
21
  fileKeyInBase64(): string;
@@ -24,7 +24,6 @@ exports.NodePersistance = void 0;
24
24
  const xsp_files_1 = require("xsp-files");
25
25
  const buffer_utils_1 = require("../../lib-common/buffer-utils");
26
26
  const deferred_1 = require("../../lib-common/processes/deferred");
27
- const random = require("../../lib-common/random-node");
28
27
  const cryptor_work_labels_1 = require("../cryptor-work-labels");
29
28
  const pv1 = require("./xsp-payload-v1");
30
29
  const pv2 = require("./xsp-payload-v2");
@@ -34,10 +33,11 @@ const SEG_SIZE = 16; // in 256-byte blocks = 4K in bytes
34
33
  * used in file system nodes as thematic place with persistence functionality.
35
34
  */
36
35
  class NodePersistance {
37
- constructor(zerothHeaderNonce, key, cryptor) {
36
+ constructor(zerothHeaderNonce, key, cryptor, random) {
38
37
  this.zerothHeaderNonce = zerothHeaderNonce;
39
38
  this.key = key;
40
39
  this.cryptor = cryptor;
40
+ this.random = random;
41
41
  this.workLabel = cryptor_work_labels_1.cryptoWorkLabels.makeForNonce('storage', this.zerothHeaderNonce);
42
42
  }
43
43
  wipe() {
@@ -62,13 +62,13 @@ class NodePersistance {
62
62
  if (!this.key) {
63
63
  throw new Error("Cannot use wiped object.");
64
64
  }
65
- return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, version, { type: 'new', segSize: SEG_SIZE, payloadFormat: 2 }, random.bytes, this.cryptor, this.workLabel);
65
+ return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, version, { type: 'new', segSize: SEG_SIZE, payloadFormat: 2 }, this.random, this.cryptor, this.workLabel);
66
66
  }
67
67
  async segWriterWithBase(newVersion, base) {
68
68
  if (!this.key) {
69
69
  throw new Error("Cannot use wiped object.");
70
70
  }
71
- return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, newVersion, { type: 'update', base, payloadFormat: 2 }, random.bytes, this.cryptor, this.workLabel);
71
+ return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, newVersion, { type: 'update', base, payloadFormat: 2 }, this.random, this.cryptor, this.workLabel);
72
72
  }
73
73
  async decryptedByteSrc(src) {
74
74
  if (!this.key) {
@@ -1,4 +1,5 @@
1
- import { GetRandom, arrays } from "ecma-nacl";
1
+ import { arrays } from "ecma-nacl";
2
+ import { AsyncRNG } from "../rng-def";
2
3
  type JsonKey = web3n.keys.JsonKey;
3
4
  type SignedLoad = web3n.keys.SignedLoad;
4
5
  export declare const KID_BYTES_LENGTH = 9;
@@ -15,10 +16,10 @@ export declare function makeSelfSignedCert(address: string, validityPeriod: numb
15
16
  * @return Generated root key and a self-signed certificate for respective
16
17
  * public key.
17
18
  */
18
- export declare function generateRootKey(address: string, validityPeriod: number, random: GetRandom, arrFactory?: arrays.Factory): {
19
+ export declare function generateRootKey(address: string, validityPeriod: number, random: AsyncRNG, arrFactory?: arrays.Factory): Promise<{
19
20
  cert: SignedLoad;
20
21
  skey: JsonKey;
21
- };
22
+ }>;
22
23
  /**
23
24
  * @param address is an address of an issuer
24
25
  * @param validityPeriod validity period of a generated self-signed
@@ -29,10 +30,10 @@ export declare function generateRootKey(address: string, validityPeriod: number,
29
30
  * @return Generated provider's key and a certificate for a respective
30
31
  * public key.
31
32
  */
32
- export declare function generateProviderKey(address: string, validityPeriod: number, rootJKey: JsonKey, random: GetRandom, arrFactory?: arrays.Factory): {
33
+ export declare function generateProviderKey(address: string, validityPeriod: number, rootJKey: JsonKey, random: AsyncRNG, arrFactory?: arrays.Factory): Promise<{
33
34
  cert: SignedLoad;
34
35
  skey: JsonKey;
35
- };
36
+ }>;
36
37
  /**
37
38
  * MailerId providing service should use this object to generate certificates.
38
39
  */
@@ -25,12 +25,12 @@ const ecma_nacl_1 = require("ecma-nacl");
25
25
  const jwkeys_1 = require("../jwkeys");
26
26
  const buffer_utils_1 = require("../buffer-utils");
27
27
  const index_1 = require("./index");
28
- function genSignKeyPair(use, kidLen, random, arrFactory) {
29
- const pair = ecma_nacl_1.signing.generate_keypair(random(32), arrFactory);
28
+ async function genSignKeyPair(use, kidLen, random, arrFactory) {
29
+ const pair = ecma_nacl_1.signing.generate_keypair(await random(32), arrFactory);
30
30
  const pkey = {
31
31
  use: use,
32
32
  alg: ecma_nacl_1.signing.JWK_ALG_NAME,
33
- kid: buffer_utils_1.base64.pack(random(kidLen)),
33
+ kid: buffer_utils_1.base64.pack(await random(kidLen)),
34
34
  k: buffer_utils_1.base64.pack(pair.pkey)
35
35
  };
36
36
  const skey = {
@@ -87,11 +87,11 @@ function makeSelfSignedCert(address, validityPeriod, sjkey, arrFactory) {
87
87
  * @return Generated root key and a self-signed certificate for respective
88
88
  * public key.
89
89
  */
90
- function generateRootKey(address, validityPeriod, random, arrFactory) {
90
+ async function generateRootKey(address, validityPeriod, random, arrFactory) {
91
91
  if (validityPeriod < 1) {
92
92
  throw new Error(`Illegal validity period: ${validityPeriod}`);
93
93
  }
94
- const rootPair = genSignKeyPair(index_1.KEY_USE.ROOT, exports.KID_BYTES_LENGTH, random, arrFactory);
94
+ const rootPair = await genSignKeyPair(index_1.KEY_USE.ROOT, exports.KID_BYTES_LENGTH, random, arrFactory);
95
95
  const now = Math.floor(Date.now() / 1000);
96
96
  const rootCert = makeCert(rootPair.pkey, address, address, now, now + validityPeriod, rootPair.skey, arrFactory);
97
97
  return { cert: rootCert, skey: (0, jwkeys_1.keyToJson)(rootPair.skey) };
@@ -106,12 +106,12 @@ function generateRootKey(address, validityPeriod, random, arrFactory) {
106
106
  * @return Generated provider's key and a certificate for a respective
107
107
  * public key.
108
108
  */
109
- function generateProviderKey(address, validityPeriod, rootJKey, random, arrFactory) {
109
+ async function generateProviderKey(address, validityPeriod, rootJKey, random, arrFactory) {
110
110
  if (validityPeriod < 1) {
111
111
  throw new Error(`Illegal validity period: ${validityPeriod}`);
112
112
  }
113
113
  const rootKey = (0, jwkeys_1.keyFromJson)(rootJKey, index_1.KEY_USE.ROOT, ecma_nacl_1.signing.JWK_ALG_NAME, ecma_nacl_1.signing.SECRET_KEY_LENGTH);
114
- const provPair = genSignKeyPair(index_1.KEY_USE.PROVIDER, exports.KID_BYTES_LENGTH, random, arrFactory);
114
+ const provPair = await genSignKeyPair(index_1.KEY_USE.PROVIDER, exports.KID_BYTES_LENGTH, random, arrFactory);
115
115
  const now = Math.floor(Date.now() / 1000);
116
116
  const rootCert = makeCert(provPair.pkey, address, address, now, now + validityPeriod, rootKey, arrFactory);
117
117
  return { cert: rootCert, skey: (0, jwkeys_1.keyToJson)(provPair.skey) };
@@ -1,5 +1,6 @@
1
- import { GetRandom, arrays } from "ecma-nacl";
1
+ import { arrays } from "ecma-nacl";
2
2
  import { Keypair } from "./index";
3
+ import { AsyncRNG } from "../rng-def";
3
4
  type JsonKey = web3n.keys.JsonKey;
4
5
  type Key = web3n.keys.Key;
5
6
  type SignedLoad = web3n.keys.SignedLoad;
@@ -44,7 +45,7 @@ export interface MailerIdSigner {
44
45
  }
45
46
  export declare const KID_BYTES_LENGTH = 9;
46
47
  export declare const MAX_SIG_VALIDITY: number;
47
- export declare function generateSigningKeyPair(random: GetRandom, arrFactory?: arrays.Factory): Keypair;
48
+ export declare function generateSigningKeyPair(random: AsyncRNG, arrFactory?: arrays.Factory): Promise<Keypair>;
48
49
  /**
49
50
  * @param signKey which will be used to sign assertions/keys. Note that
50
51
  * this key shall be wiped, when signer is destroyed, as key is neither
@@ -34,7 +34,7 @@ function correlateSKeyWithItsCert(skey, cert) {
34
34
  }
35
35
  exports.KID_BYTES_LENGTH = 9;
36
36
  exports.MAX_SIG_VALIDITY = 30 * 60;
37
- function generateSigningKeyPair(random, arrFactory) {
37
+ async function generateSigningKeyPair(random, arrFactory) {
38
38
  return (0, utils_NaCl_Ed_1.genSignKeyPair)(index_1.KEY_USE.SIGN, exports.KID_BYTES_LENGTH, random, arrFactory);
39
39
  }
40
40
  /**
@@ -1,8 +1,9 @@
1
- import { GetRandom, arrays } from "ecma-nacl";
1
+ import { arrays } from "ecma-nacl";
2
2
  import { Keypair } from "./index";
3
+ import { AsyncRNG } from "../rng-def";
3
4
  type JsonKey = web3n.keys.JsonKey;
4
5
  type Key = web3n.keys.Key;
5
6
  type SignedLoad = web3n.keys.SignedLoad;
6
- export declare function genSignKeyPair(use: string, kidLen: number, random: GetRandom, arrFactory?: arrays.Factory): Keypair;
7
+ export declare function genSignKeyPair(use: string, kidLen: number, random: AsyncRNG, arrFactory?: arrays.Factory): Promise<Keypair>;
7
8
  export declare function makeCert(pkey: JsonKey, principalAddr: string, issuer: string, issuedAt: number, expiresAt: number, signKey: Key, arrFactory?: arrays.Factory): SignedLoad;
8
9
  export {};
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2015 - 2017, 2025 3NSoft Inc.
3
+ Copyright (C) 2015 - 2017, 2025 - 2026 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -21,12 +21,12 @@ exports.makeCert = makeCert;
21
21
  const ecma_nacl_1 = require("ecma-nacl");
22
22
  const buffer_utils_1 = require("../buffer-utils");
23
23
  const index_1 = require("./index");
24
- function genSignKeyPair(use, kidLen, random, arrFactory) {
25
- const pair = ecma_nacl_1.signing.generate_keypair(random(ecma_nacl_1.signing.SEED_LENGTH), arrFactory);
24
+ async function genSignKeyPair(use, kidLen, random, arrFactory) {
25
+ const pair = ecma_nacl_1.signing.generate_keypair(await random(ecma_nacl_1.signing.SEED_LENGTH), arrFactory);
26
26
  const pkey = {
27
27
  use: use,
28
28
  alg: ecma_nacl_1.signing.JWK_ALG_NAME,
29
- kid: buffer_utils_1.base64.pack(random(kidLen)),
29
+ kid: buffer_utils_1.base64.pack(await random(kidLen)),
30
30
  k: buffer_utils_1.base64.pack(pair.pkey)
31
31
  };
32
32
  const skey = {
@@ -0,0 +1,3 @@
1
+ export type AsyncRNG = (n: number) => Promise<Uint8Array>;
2
+ export declare function stringOfB64UrlSafeChars(numOfChars: number, random: AsyncRNG): Promise<string>;
3
+ export declare function stringOfB64Chars(numOfChars: number, random: AsyncRNG): Promise<string>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2026 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License along with
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.stringOfB64UrlSafeChars = stringOfB64UrlSafeChars;
20
+ exports.stringOfB64Chars = stringOfB64Chars;
21
+ const buffer_utils_1 = require("./buffer-utils");
22
+ async function stringOfB64UrlSafeChars(numOfChars, random) {
23
+ const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
24
+ const byteArr = await random(numOfbytes);
25
+ return buffer_utils_1.base64urlSafe.pack(byteArr).substring(0, numOfChars);
26
+ }
27
+ async function stringOfB64Chars(numOfChars, random) {
28
+ const numOfbytes = 3 * (1 + Math.floor(numOfChars / 4));
29
+ const byteArr = await random(numOfbytes);
30
+ return byteArr.toString('base64').substring(0, numOfChars);
31
+ }
32
+ Object.freeze(exports);
@@ -25,7 +25,7 @@ exports.stringOfB64UrlSafeCharsSync = stringOfB64UrlSafeCharsSync;
25
25
  exports.stringOfB64CharsSync = stringOfB64CharsSync;
26
26
  exports.stringOfB64UrlSafeChars = stringOfB64UrlSafeChars;
27
27
  exports.stringOfB64Chars = stringOfB64Chars;
28
- const buffer_utils_1 = require("./buffer-utils");
28
+ const buffer_utils_1 = require("../lib-common/buffer-utils");
29
29
  const crypto_1 = require("crypto");
30
30
  function bytesSync(numOfBytes) {
31
31
  return (0, crypto_1.randomBytes)(numOfBytes);
@@ -44,7 +44,7 @@ function uint8Sync() {
44
44
  return (0, crypto_1.randomBytes)(1)[0];
45
45
  }
46
46
  async function uint8() {
47
- return (await (0, crypto_1.randomBytes)(1))[0];
47
+ return (await bytes(1))[0];
48
48
  }
49
49
  function uint48Sync() {
50
50
  const b = (0, crypto_1.randomBytes)(6);
@@ -21,8 +21,8 @@ const https = require("https");
21
21
  const request_utils_1 = require("../lib-client/request-utils");
22
22
  function makeRequestFromNode() {
23
23
  const nodeRequest = (opts) => https.request(opts);
24
- return (opts, contentType, reqBody) => {
25
- const httpsOpts = (0, request_utils_1.formHttpsReqOpts)(opts, contentType, reqBody);
24
+ return (opts, reqContentType, reqBody) => {
25
+ const httpsOpts = (0, request_utils_1.formHttpsReqOpts)(opts, reqContentType, reqBody);
26
26
  return (0, request_utils_1.processRequest)(nodeRequest, httpsOpts, opts, reqBody);
27
27
  };
28
28
  }
@@ -17,10 +17,10 @@
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.specs = void 0;
20
- const random_node_1 = require("../../../../lib-common/random-node");
20
+ const random_node_1 = require("../../../../lib-common-on-node/random-node");
21
21
  const test_utils_1 = require("../test-utils");
22
22
  const sleep_1 = require("../../../../lib-common/processes/sleep");
23
- const random_node_2 = require("../../../../lib-common/random-node");
23
+ const random_node_2 = require("../../../../lib-common-on-node/random-node");
24
24
  const files = [{
25
25
  content: 'This is file content for file #1',
26
26
  name: 'file1'
@@ -17,7 +17,7 @@
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.specs = void 0;
20
- const random_node_1 = require("../../../lib-common/random-node");
20
+ const random_node_1 = require("../../../lib-common-on-node/random-node");
21
21
  exports.specs = {
22
22
  description: 'gives file sink',
23
23
  its: []
@@ -17,7 +17,7 @@
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.specs = void 0;
20
- const random_node_1 = require("../../../lib-common/random-node");
20
+ const random_node_1 = require("../../../lib-common-on-node/random-node");
21
21
  const bytes_equal_1 = require("../../libs-for-tests/bytes-equal");
22
22
  exports.specs = {
23
23
  description: 'gives file sinks, able to splice file content',
@@ -44,14 +44,14 @@ it.func = async function (s) {
44
44
  let layout = await sink.showLayout();
45
45
  expect(Array.isArray(layout.sections)).toBeTruthy();
46
46
  expect(layout.sections.length).toBe(0);
47
- const chunk1 = (0, random_node_1.bytesSync)(10000);
47
+ const chunk1 = await (0, random_node_1.bytes)(10000);
48
48
  await sink.splice(0, chunk1.length, chunk1);
49
49
  size = await sink.getSize();
50
50
  expect(size).toBe(10000);
51
51
  layout = await sink.showLayout();
52
52
  expect(layout.sections.length).toBe(1);
53
53
  expectSection(layout, 0, 'new', 0, size);
54
- const chunk2 = (0, random_node_1.bytesSync)(100);
54
+ const chunk2 = await (0, random_node_1.bytes)(100);
55
55
  await sink.splice(11000, 0, chunk2);
56
56
  size = await sink.getSize();
57
57
  layout = await sink.showLayout();
@@ -89,9 +89,9 @@ it.func = async function (s) {
89
89
  // setup original file
90
90
  const fName = 'file1';
91
91
  let sink = await testFS.getByteSink(fName, { create: true, exclusive: true });
92
- const chunk1 = (0, random_node_1.bytesSync)(10000);
92
+ const chunk1 = await (0, random_node_1.bytes)(10000);
93
93
  await sink.splice(0, chunk1.length, chunk1);
94
- const chunk2 = (0, random_node_1.bytesSync)(100);
94
+ const chunk2 = await (0, random_node_1.bytes)(100);
95
95
  await sink.splice(11000, 0, chunk2);
96
96
  await sink.done();
97
97
  const initSize = await sink.getSize();
@@ -17,7 +17,7 @@
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.specs = void 0;
20
- const random_node_1 = require("../../../lib-common/random-node");
20
+ const random_node_1 = require("../../../lib-common-on-node/random-node");
21
21
  const bytes_equal_1 = require("../../libs-for-tests/bytes-equal");
22
22
  exports.specs = {
23
23
  description: 'gives file sinks, able to truncate file content',
@@ -55,7 +55,7 @@ it.func = async function (s) {
55
55
  else {
56
56
  expectSection(layout, 0, 'empty', 0, 10000);
57
57
  }
58
- const chunk = (0, random_node_1.bytesSync)(10000);
58
+ const chunk = await (0, random_node_1.bytes)(10000);
59
59
  await sink.splice(0, chunk.length, chunk);
60
60
  size = await sink.getSize();
61
61
  expect(size).toBe(10000);