glow.ts 1.0.3 → 1.1.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.
- package/README.md +6 -15
- package/dist/glow.cjs.js +4 -0
- package/dist/glow.cjs.js.map +1 -0
- package/dist/glow.es.js +993 -0
- package/dist/glow.es.js.map +1 -0
- package/dist/index.d.ts +544 -0
- package/package.json +34 -26
- package/dist/cjs2/config.js +0 -18
- package/dist/cjs2/config.js.map +0 -1
- package/dist/cjs2/crypto-storage/crypto-storage.js +0 -118
- package/dist/cjs2/crypto-storage/crypto-storage.js.map +0 -1
- package/dist/cjs2/crypto-storage/in-memory-storage.js +0 -36
- package/dist/cjs2/crypto-storage/in-memory-storage.js.map +0 -1
- package/dist/cjs2/crypto-storage/local-storage.driver.js +0 -36
- package/dist/cjs2/crypto-storage/local-storage.driver.js.map +0 -1
- package/dist/cjs2/crypto-storage/storage-driver.interface.js +0 -3
- package/dist/cjs2/crypto-storage/storage-driver.interface.js.map +0 -1
- package/dist/cjs2/index.js +0 -28
- package/dist/cjs2/index.js.map +0 -1
- package/dist/cjs2/keyring/keyring.js +0 -151
- package/dist/cjs2/keyring/keyring.js.map +0 -1
- package/dist/cjs2/keys/keys.js +0 -40
- package/dist/cjs2/keys/keys.js.map +0 -1
- package/dist/cjs2/mailbox/mailbox.js +0 -352
- package/dist/cjs2/mailbox/mailbox.js.map +0 -1
- package/dist/cjs2/nacl/encryption.helper.js +0 -101
- package/dist/cjs2/nacl/encryption.helper.js.map +0 -1
- package/dist/cjs2/nacl/js-nacl-driver.js +0 -110
- package/dist/cjs2/nacl/js-nacl-driver.js.map +0 -1
- package/dist/cjs2/nacl/keypair.interface.js +0 -3
- package/dist/cjs2/nacl/keypair.interface.js.map +0 -1
- package/dist/cjs2/nacl/nacl-driver.interface.js +0 -3
- package/dist/cjs2/nacl/nacl-driver.interface.js.map +0 -1
- package/dist/cjs2/nacl/nacl.js +0 -29
- package/dist/cjs2/nacl/nacl.js.map +0 -1
- package/dist/cjs2/relay/network-error.js +0 -12
- package/dist/cjs2/relay/network-error.js.map +0 -1
- package/dist/cjs2/relay/relay-factory.js +0 -22
- package/dist/cjs2/relay/relay-factory.js.map +0 -1
- package/dist/cjs2/relay/relay.js +0 -300
- package/dist/cjs2/relay/relay.js.map +0 -1
- package/dist/cjs2/utils/utils.js +0 -39
- package/dist/cjs2/utils/utils.js.map +0 -1
- package/dist/cjs2/zax.interface.js +0 -46
- package/dist/cjs2/zax.interface.js.map +0 -1
- package/dist/esm/config.js +0 -15
- package/dist/esm/config.js.map +0 -1
- package/dist/esm/crypto-storage/crypto-storage.js +0 -114
- package/dist/esm/crypto-storage/crypto-storage.js.map +0 -1
- package/dist/esm/crypto-storage/in-memory-storage.js +0 -32
- package/dist/esm/crypto-storage/in-memory-storage.js.map +0 -1
- package/dist/esm/crypto-storage/local-storage.driver.js +0 -32
- package/dist/esm/crypto-storage/local-storage.driver.js.map +0 -1
- package/dist/esm/crypto-storage/storage-driver.interface.js +0 -2
- package/dist/esm/crypto-storage/storage-driver.interface.js.map +0 -1
- package/dist/esm/index.js +0 -14
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/keyring/keyring.js +0 -147
- package/dist/esm/keyring/keyring.js.map +0 -1
- package/dist/esm/keys/keys.js +0 -36
- package/dist/esm/keys/keys.js.map +0 -1
- package/dist/esm/mailbox/mailbox.js +0 -348
- package/dist/esm/mailbox/mailbox.js.map +0 -1
- package/dist/esm/nacl/encryption.helper.js +0 -97
- package/dist/esm/nacl/encryption.helper.js.map +0 -1
- package/dist/esm/nacl/js-nacl-driver.js +0 -106
- package/dist/esm/nacl/js-nacl-driver.js.map +0 -1
- package/dist/esm/nacl/keypair.interface.js +0 -2
- package/dist/esm/nacl/keypair.interface.js.map +0 -1
- package/dist/esm/nacl/nacl-driver.interface.js +0 -2
- package/dist/esm/nacl/nacl-driver.interface.js.map +0 -1
- package/dist/esm/nacl/nacl.js +0 -25
- package/dist/esm/nacl/nacl.js.map +0 -1
- package/dist/esm/relay/network-error.js +0 -8
- package/dist/esm/relay/network-error.js.map +0 -1
- package/dist/esm/relay/relay-factory.js +0 -18
- package/dist/esm/relay/relay-factory.js.map +0 -1
- package/dist/esm/relay/relay.js +0 -293
- package/dist/esm/relay/relay.js.map +0 -1
- package/dist/esm/utils/utils.js +0 -35
- package/dist/esm/utils/utils.js.map +0 -1
- package/dist/esm/zax.interface.js +0 -43
- package/dist/esm/zax.interface.js.map +0 -1
- package/dist/types/config.d.ts +0 -10
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/crypto-storage/crypto-storage.d.ts +0 -20
- package/dist/types/crypto-storage/crypto-storage.d.ts.map +0 -1
- package/dist/types/crypto-storage/in-memory-storage.d.ts +0 -17
- package/dist/types/crypto-storage/in-memory-storage.d.ts.map +0 -1
- package/dist/types/crypto-storage/local-storage.driver.d.ts +0 -15
- package/dist/types/crypto-storage/local-storage.driver.d.ts.map +0 -1
- package/dist/types/crypto-storage/storage-driver.interface.d.ts +0 -11
- package/dist/types/crypto-storage/storage-driver.interface.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -16
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/keyring/keyring.d.ts +0 -43
- package/dist/types/keyring/keyring.d.ts.map +0 -1
- package/dist/types/keys/keys.d.ts +0 -16
- package/dist/types/keys/keys.d.ts.map +0 -1
- package/dist/types/mailbox/mailbox.d.ts +0 -148
- package/dist/types/mailbox/mailbox.d.ts.map +0 -1
- package/dist/types/nacl/encryption.helper.d.ts +0 -37
- package/dist/types/nacl/encryption.helper.d.ts.map +0 -1
- package/dist/types/nacl/js-nacl-driver.d.ts +0 -39
- package/dist/types/nacl/js-nacl-driver.d.ts.map +0 -1
- package/dist/types/nacl/keypair.interface.d.ts +0 -5
- package/dist/types/nacl/keypair.interface.d.ts.map +0 -1
- package/dist/types/nacl/nacl-driver.interface.d.ts +0 -28
- package/dist/types/nacl/nacl-driver.interface.d.ts.map +0 -1
- package/dist/types/nacl/nacl.d.ts +0 -13
- package/dist/types/nacl/nacl.d.ts.map +0 -1
- package/dist/types/relay/network-error.d.ts +0 -6
- package/dist/types/relay/network-error.d.ts.map +0 -1
- package/dist/types/relay/relay-factory.d.ts +0 -10
- package/dist/types/relay/relay-factory.d.ts.map +0 -1
- package/dist/types/relay/relay.d.ts +0 -88
- package/dist/types/relay/relay.d.ts.map +0 -1
- package/dist/types/utils/utils.d.ts +0 -9
- package/dist/types/utils/utils.d.ts.map +0 -1
- package/dist/types/zax.interface.d.ts +0 -101
- package/dist/types/zax.interface.d.ts.map +0 -1
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export class LocalStorageDriver {
|
|
2
|
-
constructor(root = 'storage.') {
|
|
3
|
-
this.rootTag = `__glow.${root}`;
|
|
4
|
-
}
|
|
5
|
-
async get(key) {
|
|
6
|
-
return (await this.getMultiple([key]))[0];
|
|
7
|
-
}
|
|
8
|
-
async getMultiple(keys) {
|
|
9
|
-
return keys.map(key => localStorage.getItem(this.tag(key)) || null);
|
|
10
|
-
}
|
|
11
|
-
async set(key, value) {
|
|
12
|
-
return this.setMultiple({ [key]: value });
|
|
13
|
-
}
|
|
14
|
-
async setMultiple(values) {
|
|
15
|
-
for (const key in values) {
|
|
16
|
-
const value = values[key];
|
|
17
|
-
if (value !== null) {
|
|
18
|
-
localStorage.setItem(this.tag(key), value);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async remove(key) {
|
|
23
|
-
this.removeMultiple([key]);
|
|
24
|
-
}
|
|
25
|
-
async removeMultiple(keys) {
|
|
26
|
-
keys.forEach(key => localStorage.removeItem(this.tag(key)));
|
|
27
|
-
}
|
|
28
|
-
tag(key) {
|
|
29
|
-
return `${this.rootTag}.${key}`;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=local-storage.driver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-storage.driver.js","sourceRoot":"","sources":["../../../src/crypto-storage/local-storage.driver.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAG7B,YAAY,IAAI,GAAG,UAAU;QAC3B,IAAI,CAAC,OAAO,GAAG,UAAU,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAoB;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyC;QACzD,KAAI,MAAM,GAAG,IAAI,MAAM,EAAE;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,IAAI,EAAE;gBAClB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;aAC5C;SACF;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAc;QACjC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage-driver.interface.js","sourceRoot":"","sources":["../../../src/crypto-storage/storage-driver.interface.ts"],"names":[],"mappings":""}
|
package/dist/esm/index.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { NaCl } from './nacl/nacl';
|
|
2
|
-
import { Keys } from './keys/keys.js';
|
|
3
|
-
import { KeyRing } from './keyring/keyring.js';
|
|
4
|
-
import { CryptoStorage } from './crypto-storage/crypto-storage.js';
|
|
5
|
-
import { LocalStorageDriver } from './crypto-storage/local-storage.driver.js';
|
|
6
|
-
import { Mailbox } from './mailbox/mailbox';
|
|
7
|
-
import { Relay } from './relay/relay';
|
|
8
|
-
import { ZaxMessageKind } from './zax.interface';
|
|
9
|
-
import { JsNaClDriver } from './nacl/js-nacl-driver';
|
|
10
|
-
import { Utils } from './utils/utils';
|
|
11
|
-
import { NetworkError } from './relay/network-error';
|
|
12
|
-
import { InMemoryStorage } from './crypto-storage/in-memory-storage';
|
|
13
|
-
export { NaCl, Keys, KeyRing, Mailbox, Relay, CryptoStorage, LocalStorageDriver, ZaxMessageKind, JsNaClDriver, Utils, NetworkError, InMemoryStorage };
|
|
14
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EACL,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,KAAK,EACL,aAAa,EAEb,kBAAkB,EAClB,cAAc,EAOd,YAAY,EACZ,KAAK,EACL,YAAY,EACZ,eAAe,EAChB,CAAC"}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { CryptoStorage } from '../crypto-storage/crypto-storage';
|
|
2
|
-
import { Keys } from '../keys/keys';
|
|
3
|
-
import { NaCl } from '../nacl/nacl';
|
|
4
|
-
import { Utils } from '../utils/utils';
|
|
5
|
-
const commKeyTag = '__::commKey::__';
|
|
6
|
-
// Manages the set of public keys of counterparties
|
|
7
|
-
export class KeyRing {
|
|
8
|
-
constructor(naclDriver, cryptoStorage, commKey) {
|
|
9
|
-
this.guestKeys = new Map();
|
|
10
|
-
this.nacl = naclDriver;
|
|
11
|
-
this.storage = cryptoStorage;
|
|
12
|
-
this.commKey = commKey;
|
|
13
|
-
}
|
|
14
|
-
static async new(id) {
|
|
15
|
-
const nacl = NaCl.getInstance();
|
|
16
|
-
const cryptoStorage = await CryptoStorage.new(id);
|
|
17
|
-
const commKey = await KeyRing.getCommKeyOrCreate(nacl, cryptoStorage);
|
|
18
|
-
const keyRing = new KeyRing(nacl, cryptoStorage, commKey);
|
|
19
|
-
await keyRing.loadGuestKeys();
|
|
20
|
-
return keyRing;
|
|
21
|
-
}
|
|
22
|
-
static async fromBackup(id, backupString) {
|
|
23
|
-
const backup = JSON.parse(backupString);
|
|
24
|
-
const secretKey = Utils.fromBase64(backup[commKeyTag]);
|
|
25
|
-
const restoredKeyRing = await KeyRing.new(id);
|
|
26
|
-
await restoredKeyRing.setCommFromSecKey(secretKey);
|
|
27
|
-
for (const [key, value] of Object.entries(backup)) {
|
|
28
|
-
if (key !== commKeyTag) {
|
|
29
|
-
await restoredKeyRing.addGuest(key, value);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return restoredKeyRing;
|
|
33
|
-
}
|
|
34
|
-
getNumberOfGuests() {
|
|
35
|
-
return this.guestKeys.size;
|
|
36
|
-
}
|
|
37
|
-
get guests() {
|
|
38
|
-
return this.guestKeys;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Returns public identity, which is the default communication key.
|
|
42
|
-
* Correspondents can know it, whereas Relays do not need it (other than
|
|
43
|
-
* temporarily for internal use during the ownership proof)
|
|
44
|
-
*/
|
|
45
|
-
getPubCommKey() {
|
|
46
|
-
return this.commKey.publicKey;
|
|
47
|
-
}
|
|
48
|
-
getPrivateCommKey() {
|
|
49
|
-
return this.commKey.privateKey;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Returns HPK (hash of the public key) of the mailbox. This is what Zax relays
|
|
53
|
-
* uses as the universal address of the mailbox
|
|
54
|
-
*/
|
|
55
|
-
async getHpk() {
|
|
56
|
-
const hpk = await this.nacl.h2(Utils.fromBase64(this.commKey.publicKey));
|
|
57
|
-
return Utils.toBase64(hpk);
|
|
58
|
-
}
|
|
59
|
-
getTagByHpk(hpk) {
|
|
60
|
-
for (const [key, value] of this.guestKeys) {
|
|
61
|
-
if (value.hpk === hpk) {
|
|
62
|
-
return key;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
getGuestKey(guestTag) {
|
|
68
|
-
const keyRecord = this.guestKeys.get(guestTag);
|
|
69
|
-
if (keyRecord) {
|
|
70
|
-
return keyRecord.pk;
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
// Backups
|
|
75
|
-
async backup() {
|
|
76
|
-
const backup = {
|
|
77
|
-
[commKeyTag]: this.commKey.privateKey
|
|
78
|
-
};
|
|
79
|
-
if (this.getNumberOfGuests() > 0) {
|
|
80
|
-
for (const [key, value] of this.guestKeys) {
|
|
81
|
-
if (key && value) {
|
|
82
|
-
backup[key] = value.pk;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return JSON.stringify(backup);
|
|
87
|
-
}
|
|
88
|
-
async setCommFromSeed(seed) {
|
|
89
|
-
this.commKey = new Keys(await this.nacl.crypto_box_keypair_from_seed(seed));
|
|
90
|
-
await this.storage.save(KeyRing.commKeyTag, this.commKey.toString());
|
|
91
|
-
}
|
|
92
|
-
async setCommFromSecKey(rawSecretKey) {
|
|
93
|
-
this.commKey = new Keys(await this.nacl.crypto_box_keypair_from_raw_sk(rawSecretKey));
|
|
94
|
-
await this.storage.save(KeyRing.commKeyTag, this.commKey.toString());
|
|
95
|
-
}
|
|
96
|
-
async addGuest(guestTag, publicKey) {
|
|
97
|
-
const b64_h2 = Utils.toBase64(await this.nacl.h2(Utils.fromBase64(publicKey)));
|
|
98
|
-
this.guestKeys.set(guestTag, {
|
|
99
|
-
pk: publicKey,
|
|
100
|
-
hpk: b64_h2
|
|
101
|
-
});
|
|
102
|
-
await this.saveGuests();
|
|
103
|
-
return b64_h2;
|
|
104
|
-
}
|
|
105
|
-
async removeGuest(guestTag) {
|
|
106
|
-
if (this.guestKeys.has(guestTag)) {
|
|
107
|
-
this.guestKeys.delete(guestTag);
|
|
108
|
-
await this.saveGuests();
|
|
109
|
-
}
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
async loadGuestKeys() {
|
|
113
|
-
const guestKeys = await this.storage.get(KeyRing.guestRegistryTag);
|
|
114
|
-
if (!guestKeys) {
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
else if (typeof guestKeys === 'object') {
|
|
118
|
-
this.guestKeys = new Map(Object.entries(guestKeys));
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
throw new Error('[Keyring] Guest keys is not an object');
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
async saveGuests() {
|
|
125
|
-
await this.storage.save(KeyRing.guestRegistryTag, Utils.toObject(this.guestKeys.entries()));
|
|
126
|
-
}
|
|
127
|
-
static async getCommKeyOrCreate(nacl, storage) {
|
|
128
|
-
const commKeyRecord = await storage.get(KeyRing.commKeyTag);
|
|
129
|
-
if (commKeyRecord && typeof commKeyRecord === 'string') {
|
|
130
|
-
return new Keys(commKeyRecord);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
const keypair = await nacl.crypto_box_keypair();
|
|
134
|
-
const commKey = new Keys(keypair);
|
|
135
|
-
await storage.save(KeyRing.commKeyTag, commKey.toString());
|
|
136
|
-
return commKey;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
async selfDestruct() {
|
|
140
|
-
await this.storage.remove(KeyRing.guestRegistryTag);
|
|
141
|
-
await this.storage.remove(KeyRing.commKeyTag);
|
|
142
|
-
await this.storage.selfDestruct();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
KeyRing.commKeyTag = 'comm_key';
|
|
146
|
-
KeyRing.guestRegistryTag = 'guest_registry';
|
|
147
|
-
//# sourceMappingURL=keyring.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../../src/keyring/keyring.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/keys/keys.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Utils } from '../utils/utils';
|
|
2
|
-
/**
|
|
3
|
-
* A simple wrapper around a public/private keys pair.
|
|
4
|
-
* Stores keys in base64 format.
|
|
5
|
-
*/
|
|
6
|
-
export class Keys {
|
|
7
|
-
constructor(keys) {
|
|
8
|
-
this.keys = keys;
|
|
9
|
-
if (typeof keys === 'string') {
|
|
10
|
-
const { boxPk, boxSk } = JSON.parse(keys);
|
|
11
|
-
this.keyPair = {
|
|
12
|
-
boxPk: Utils.fromBase64(boxPk),
|
|
13
|
-
boxSk: Utils.fromBase64(boxSk)
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
this.keyPair = keys;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
static isEqual(keys1, keys2) {
|
|
21
|
-
return keys1.toString() === keys2.toString();
|
|
22
|
-
}
|
|
23
|
-
toString() {
|
|
24
|
-
return JSON.stringify({
|
|
25
|
-
boxPk: this.publicKey,
|
|
26
|
-
boxSk: this.privateKey
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
get publicKey() {
|
|
30
|
-
return Utils.toBase64(this.keyPair.boxPk);
|
|
31
|
-
}
|
|
32
|
-
get privateKey() {
|
|
33
|
-
return Utils.toBase64(this.keyPair.boxSk);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=keys.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/keys/keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAG/C;;;GAGG;AACH,MAAM,OAAO,IAAI;IAGf,YAAmB,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;QACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,GAAG;gBACb,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;gBAC9B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;aAC/B,CAAC;SACH;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;SACrB;IACH,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,KAAW,EAAE,KAAW;QACrC,OAAO,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,KAAK,EAAE,IAAI,CAAC,UAAU;SACvB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,SAAS;QACX,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { NaCl } from '../nacl/nacl';
|
|
2
|
-
import { EncryptionHelper } from '../nacl/encryption.helper';
|
|
3
|
-
import { KeyRing } from '../keyring/keyring';
|
|
4
|
-
import { Utils } from '../utils/utils';
|
|
5
|
-
import { RelayCommand, ZaxMessageKind } from '../zax.interface';
|
|
6
|
-
import { RelayFactory } from '../relay/relay-factory';
|
|
7
|
-
import { Mutex } from 'async-mutex';
|
|
8
|
-
/**
|
|
9
|
-
* Mailbox class represents a wrapper around a Keyring that allows to exchange
|
|
10
|
-
* encrypted messages with other Mailboxes via a relay
|
|
11
|
-
*/
|
|
12
|
-
export class Mailbox {
|
|
13
|
-
constructor(naclDriver, keyRing, identity) {
|
|
14
|
-
/**
|
|
15
|
-
* each mailbox use it's own relays for connection
|
|
16
|
-
* this gives possibility to connect different mailboxes to same server simultaneously
|
|
17
|
-
* because they will use different session keys, tokens, server pub keys
|
|
18
|
-
*/
|
|
19
|
-
this.relayFactory = new RelayFactory;
|
|
20
|
-
this.relayConnectionMutexes = new Map();
|
|
21
|
-
this.nacl = naclDriver;
|
|
22
|
-
this.keyRing = keyRing;
|
|
23
|
-
this.identity = identity;
|
|
24
|
-
}
|
|
25
|
-
static async new(identity) {
|
|
26
|
-
return new Mailbox(NaCl.getInstance(), await KeyRing.new(identity), identity);
|
|
27
|
-
}
|
|
28
|
-
// ---------- Alternative initializers ----------
|
|
29
|
-
/**
|
|
30
|
-
* Create a Mailbox where the secret identity key is derived from a well-known seed
|
|
31
|
-
*/
|
|
32
|
-
static async fromSeed(id, seed) {
|
|
33
|
-
const mbx = await this.new(id);
|
|
34
|
-
if (!(seed instanceof Uint8Array)) {
|
|
35
|
-
seed = Utils.encode_latin1(seed);
|
|
36
|
-
}
|
|
37
|
-
await mbx.keyRing.setCommFromSeed(seed);
|
|
38
|
-
return mbx;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Create a Mailbox from the known secret identity key
|
|
42
|
-
*/
|
|
43
|
-
static async fromSecKey(id, rawSecretKey) {
|
|
44
|
-
const mbx = await this.new(id);
|
|
45
|
-
if (!(rawSecretKey instanceof Uint8Array)) {
|
|
46
|
-
rawSecretKey = Utils.fromBase64(rawSecretKey);
|
|
47
|
-
}
|
|
48
|
-
await mbx.keyRing.setCommFromSecKey(rawSecretKey);
|
|
49
|
-
return mbx;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Create a Mailbox from the backup string
|
|
53
|
-
*/
|
|
54
|
-
static async fromBackup(identity, backup) {
|
|
55
|
-
return new Mailbox(NaCl.getInstance(), await KeyRing.fromBackup(identity, backup), identity);
|
|
56
|
-
}
|
|
57
|
-
// ---------- Relay message commands (public API) ----------
|
|
58
|
-
/**
|
|
59
|
-
* Sends a free-form object to a guest we already have in our keyring. Set `encrypt` to `false` to
|
|
60
|
-
* send a plaintext message. Returns a token that can be used with `messageStatus` command to check
|
|
61
|
-
* the status of the message
|
|
62
|
-
*/
|
|
63
|
-
async upload(url, guestKey, message, encrypt = true) {
|
|
64
|
-
const relay = await this.prepareRelay(url);
|
|
65
|
-
const guestPk = this.getGuestKey(guestKey);
|
|
66
|
-
const payload = encrypt ? await this.encodeMessage(guestKey, message) : message;
|
|
67
|
-
const toHpk = Utils.toBase64(await this.nacl.h2(Utils.fromBase64(guestPk)));
|
|
68
|
-
const [token] = await this.runRelayCommand(relay, RelayCommand.upload, { to: toHpk, payload });
|
|
69
|
-
return token;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Downloads all messages from a relay, decrypts them with a relay key,
|
|
73
|
-
* and then parses each message to find out if it's a text message, file message,
|
|
74
|
-
* or if it can't be decrypted because HPK is missing in the keyring.
|
|
75
|
-
* Returns an array of mixed messages
|
|
76
|
-
*/
|
|
77
|
-
async download(url) {
|
|
78
|
-
const relay = await this.prepareRelay(url);
|
|
79
|
-
const response = await this.runRelayCommand(relay, RelayCommand.download);
|
|
80
|
-
const messages = await this.decryptResponse(relay, response);
|
|
81
|
-
const parsedMessages = [];
|
|
82
|
-
for (const message of messages) {
|
|
83
|
-
const senderTag = this.keyRing.getTagByHpk(message.from);
|
|
84
|
-
if (!senderTag) {
|
|
85
|
-
parsedMessages.push(await this.parsePlainMessage(message));
|
|
86
|
-
}
|
|
87
|
-
else if (message.kind === 'message') {
|
|
88
|
-
parsedMessages.push(await this.parseTextMessage(message, senderTag));
|
|
89
|
-
}
|
|
90
|
-
else if (message.kind === 'file') {
|
|
91
|
-
parsedMessages.push(await this.parseFileMessage(message, senderTag));
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
throw new Error('[Mailbox] download - Unknown message type');
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return parsedMessages;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Marks a raw Zax message as one that can't be decrypted,
|
|
101
|
-
* because sender's HPK is not found in the keyring
|
|
102
|
-
*/
|
|
103
|
-
async parsePlainMessage({ data, time, from, nonce }) {
|
|
104
|
-
return { data, time, from, nonce, kind: ZaxMessageKind.plain };
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Decrypts a message that represents uploaded file metadata
|
|
108
|
-
*/
|
|
109
|
-
async parseFileMessage(message, senderTag) {
|
|
110
|
-
const { nonce, ctext, uploadID } = JSON.parse(message.data);
|
|
111
|
-
const rawData = await this.decodeMessage(senderTag, nonce, ctext);
|
|
112
|
-
if (rawData === null) {
|
|
113
|
-
throw new Error('[Mailbox] Failed to decode file message');
|
|
114
|
-
}
|
|
115
|
-
const data = JSON.parse(rawData);
|
|
116
|
-
return { data, time: message.time, senderTag, uploadID, nonce, kind: ZaxMessageKind.file };
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Attempts to decrypt a regular encrypted Zax message. Returns plain message if it was sent encrypted
|
|
120
|
-
*/
|
|
121
|
-
async parseTextMessage(message, senderTag) {
|
|
122
|
-
let data = await this.decodeMessage(senderTag, message.nonce, message.data);
|
|
123
|
-
// If the message was sent unencrypted, the line above will return `null`
|
|
124
|
-
if (!data) {
|
|
125
|
-
data = message.data;
|
|
126
|
-
}
|
|
127
|
-
return ({ data, time: message.time, senderTag, nonce: message.nonce, kind: ZaxMessageKind.message });
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Returns the number of messages in the mailbox on a given relay
|
|
131
|
-
*/
|
|
132
|
-
async count(url) {
|
|
133
|
-
const relay = await this.prepareRelay(url);
|
|
134
|
-
const response = await this.runRelayCommand(relay, RelayCommand.count);
|
|
135
|
-
return await this.decryptResponse(relay, response);
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Deletes messages from a relay given a list of base64 message nonces,
|
|
139
|
-
* and returns the number of remaining messages
|
|
140
|
-
*/
|
|
141
|
-
async delete(url, nonceList) {
|
|
142
|
-
const relay = await this.prepareRelay(url);
|
|
143
|
-
const [response] = await this.runRelayCommand(relay, RelayCommand.delete, { payload: nonceList });
|
|
144
|
-
return parseInt(response, 10);
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Gets the status of a previously sent Zax message by a storage token.
|
|
148
|
-
* Returns "time to live" in seconds or a negative value if it's not applicable.
|
|
149
|
-
* See `MessageStatusResponse` values for reference
|
|
150
|
-
*/
|
|
151
|
-
async messageStatus(url, storageToken) {
|
|
152
|
-
const relay = await this.prepareRelay(url);
|
|
153
|
-
const [response] = await this.runRelayCommand(relay, RelayCommand.messageStatus, { token: storageToken });
|
|
154
|
-
const status = parseInt(response, 10);
|
|
155
|
-
return status;
|
|
156
|
-
}
|
|
157
|
-
// ---------- Relay file commands (public API) ----------
|
|
158
|
-
/**
|
|
159
|
-
* Asks Zax to start a new upload session, and returns a unique file identifier
|
|
160
|
-
* required to upload file chunks.
|
|
161
|
-
*/
|
|
162
|
-
async startFileUpload(url, guest, rawMetadata) {
|
|
163
|
-
const relay = await this.prepareRelay(url);
|
|
164
|
-
const guestPk = this.getGuestKey(guest);
|
|
165
|
-
const toHpk = Utils.toBase64(await this.nacl.h2(Utils.fromBase64(guestPk)));
|
|
166
|
-
const secretKey = await this.nacl.random_bytes(this.nacl.crypto_secretbox_KEYBYTES);
|
|
167
|
-
rawMetadata.skey = Utils.toBase64(secretKey);
|
|
168
|
-
const metadata = await this.encodeMessage(guest, JSON.stringify(rawMetadata));
|
|
169
|
-
const response = await this.runRelayCommand(relay, RelayCommand.startFileUpload, {
|
|
170
|
-
to: toHpk,
|
|
171
|
-
file_size: rawMetadata.orig_size,
|
|
172
|
-
metadata
|
|
173
|
-
});
|
|
174
|
-
const decrypted = await this.decryptResponse(relay, response);
|
|
175
|
-
// append symmetric secret key (unique for this upload session) to the server response
|
|
176
|
-
decrypted.skey = secretKey;
|
|
177
|
-
return decrypted;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Encrypts the file chunk symmetrically and transfers it to a relay
|
|
181
|
-
*/
|
|
182
|
-
async uploadFileChunk(url, uploadID, chunk, part, totalParts, skey) {
|
|
183
|
-
const relay = await this.prepareRelay(url);
|
|
184
|
-
const encodedChunk = await EncryptionHelper.encodeMessageSymmetric(chunk, skey);
|
|
185
|
-
const response = await this.runRelayCommand(relay, RelayCommand.uploadFileChunk, {
|
|
186
|
-
uploadID,
|
|
187
|
-
part,
|
|
188
|
-
last_chunk: (totalParts - 1 === part),
|
|
189
|
-
nonce: encodedChunk.nonce
|
|
190
|
-
}, encodedChunk.ctext); // do not encode file chunk contents, as it's already encoded with symmetric encryption
|
|
191
|
-
return await this.decryptResponse(relay, response);
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Returns the status of a file upload by its relay-specific uploadID. Uploader can call it
|
|
195
|
-
* to verify the correct transfer, and downloader can check if the file exists and retrieve
|
|
196
|
-
* the number of chunks
|
|
197
|
-
*/
|
|
198
|
-
async getFileStatus(url, uploadID) {
|
|
199
|
-
const relay = await this.prepareRelay(url);
|
|
200
|
-
const response = await this.runRelayCommand(relay, RelayCommand.fileStatus, { uploadID });
|
|
201
|
-
return await this.decryptResponse(relay, response);
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Fetches the file metadata by uploadID, which was declared by the uploader
|
|
205
|
-
*/
|
|
206
|
-
async getFileMetadata(url, uploadID) {
|
|
207
|
-
const messages = await this.download(url);
|
|
208
|
-
const fileMessage = messages
|
|
209
|
-
.filter(message => message.kind === 'file')
|
|
210
|
-
.find(message => message.uploadID === uploadID);
|
|
211
|
-
return fileMessage === null || fileMessage === void 0 ? void 0 : fileMessage.data;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Downloads a binary chunk of a file from a relay by a given uploadID. The total number of chunks
|
|
215
|
-
* can be retrieved via a `getFileStatus` request
|
|
216
|
-
*/
|
|
217
|
-
async downloadFileChunk(url, uploadID, part, skey) {
|
|
218
|
-
if (!(skey instanceof Uint8Array)) {
|
|
219
|
-
skey = Utils.fromBase64(skey);
|
|
220
|
-
}
|
|
221
|
-
const relay = await this.prepareRelay(url);
|
|
222
|
-
const response = await this.runRelayCommand(relay, RelayCommand.downloadFileChunk, { uploadID, part });
|
|
223
|
-
const [nonce, ctext, fileCtext] = response;
|
|
224
|
-
const decoded = await relay.decodeMessage(nonce, ctext);
|
|
225
|
-
return await EncryptionHelper.decodeMessageSymmetric(decoded.nonce, fileCtext, skey);
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Deletes a file from the relay (or all chunks uploaded so far, if the upload was not completed).
|
|
229
|
-
* Can be called by either the sender or recipient
|
|
230
|
-
*/
|
|
231
|
-
async deleteFile(url, uploadID) {
|
|
232
|
-
const relay = await this.prepareRelay(url);
|
|
233
|
-
const response = await this.runRelayCommand(relay, RelayCommand.deleteFile, { uploadID });
|
|
234
|
-
return await this.decryptResponse(relay, response);
|
|
235
|
-
}
|
|
236
|
-
// ---------- Dealing with Relay ----------
|
|
237
|
-
/**
|
|
238
|
-
* Establishes a session, exchanges temp keys and proves our ownership of this
|
|
239
|
-
* Mailbox to this specific relay. This is the first function to start
|
|
240
|
-
* communications with any relay. Returns the number of messages in the mailbox
|
|
241
|
-
*/
|
|
242
|
-
async connectToRelay(url) {
|
|
243
|
-
const relay = this.relayFactory.getInstance(url);
|
|
244
|
-
const connectionData = await relay.openConnection();
|
|
245
|
-
const encryptedSignature = await this.encryptSignature(connectionData);
|
|
246
|
-
const messagesNumber = await relay.prove(await relay.encodeMessage(JSON.stringify({
|
|
247
|
-
pub_key: this.keyRing.getPubCommKey(),
|
|
248
|
-
nonce: encryptedSignature.nonce,
|
|
249
|
-
ctext: encryptedSignature.ctext
|
|
250
|
-
})));
|
|
251
|
-
return parseInt(messagesNumber, 10);
|
|
252
|
-
}
|
|
253
|
-
clearSession(url) {
|
|
254
|
-
const relay = this.relayFactory.getInstance(url);
|
|
255
|
-
relay.clearToken();
|
|
256
|
-
relay.clearSession();
|
|
257
|
-
}
|
|
258
|
-
async encryptSignature(connection) {
|
|
259
|
-
const privateKey = Utils.fromBase64(this.keyRing.getPrivateCommKey());
|
|
260
|
-
return await EncryptionHelper.encodeMessage(connection.h2Signature, connection.relayPublicKey, privateKey);
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Gets a singleton Relay instance, and reconnects to a relay if a previous token has expired
|
|
264
|
-
*/
|
|
265
|
-
async prepareRelay(url) {
|
|
266
|
-
const relay = this.relayFactory.getInstance(url);
|
|
267
|
-
/**
|
|
268
|
-
* allow establishing only once connection for pair mailbox-relay
|
|
269
|
-
*/
|
|
270
|
-
await this.getRelayConnectionMutex(url).runExclusive(async () => {
|
|
271
|
-
if (!relay.isConnected) {
|
|
272
|
-
await this.connectToRelay(url);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
return relay;
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Encrypts the payload of the command and sends it to a relay
|
|
279
|
-
*/
|
|
280
|
-
async runRelayCommand(relay, command, params, ctext) {
|
|
281
|
-
params = Object.assign({ cmd: command }, params);
|
|
282
|
-
const hpk = await this.keyRing.getHpk();
|
|
283
|
-
const message = await relay.encodeMessage(JSON.stringify(params));
|
|
284
|
-
return await relay.runCmd(command, hpk, message, ctext);
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Parses relay's response to a command, for those commands that expect an encrypted message in return.
|
|
288
|
-
* Two lines of POST response will be nonce and ctext
|
|
289
|
-
*/
|
|
290
|
-
async decryptResponse(relay, response) {
|
|
291
|
-
const [nonce, ctext] = response;
|
|
292
|
-
return await relay.decodeMessage(nonce, ctext);
|
|
293
|
-
}
|
|
294
|
-
// ---------- Message encoding / decoding ----------
|
|
295
|
-
/**
|
|
296
|
-
* Encodes `message` to the guest key of a guest already
|
|
297
|
-
* added to the keyring
|
|
298
|
-
*/
|
|
299
|
-
async encodeMessage(guest, message) {
|
|
300
|
-
const guestPk = this.getGuestKey(guest);
|
|
301
|
-
const privateKey = this.keyRing.getPrivateCommKey();
|
|
302
|
-
return await EncryptionHelper.encodeMessage(await this.nacl.encode_utf8(message), Utils.fromBase64(guestPk), Utils.fromBase64(privateKey));
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Decodes a ciphertext from a guest key already in our keyring with this nonce
|
|
306
|
-
* @returns null if failed to decode
|
|
307
|
-
*/
|
|
308
|
-
async decodeMessage(guest, nonce, ctext) {
|
|
309
|
-
const guestPk = this.getGuestKey(guest);
|
|
310
|
-
const privateKey = this.keyRing.getPrivateCommKey();
|
|
311
|
-
let uint8ArrayCtext;
|
|
312
|
-
try {
|
|
313
|
-
uint8ArrayCtext = Utils.fromBase64(ctext);
|
|
314
|
-
}
|
|
315
|
-
catch (err) {
|
|
316
|
-
// looks like ctext was not encoded
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
return await EncryptionHelper.decodeMessage(Utils.fromBase64(nonce), uint8ArrayCtext, Utils.fromBase64(guestPk), Utils.fromBase64(privateKey));
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* Wrapper around `keyring.getGuestKey` that handles unknown guests
|
|
323
|
-
*/
|
|
324
|
-
getGuestKey(guest) {
|
|
325
|
-
const guestPk = this.keyRing.getGuestKey(guest);
|
|
326
|
-
if (!guestPk) {
|
|
327
|
-
throw new Error(`[Mailbox] Unknown guest ${guest}`);
|
|
328
|
-
}
|
|
329
|
-
return guestPk;
|
|
330
|
-
}
|
|
331
|
-
// ---------- Destroying Mailbox ----------
|
|
332
|
-
/**
|
|
333
|
-
* Deletes a Mailbox and all its data from local CryptoStorage. This is a very
|
|
334
|
-
* destructive operation, use with caution - it will delete the Mailbox
|
|
335
|
-
* keyring along with all stored public keys. To restore that information, you
|
|
336
|
-
* will need to do another key exchange with all the guests on your keyring.
|
|
337
|
-
*/
|
|
338
|
-
async selfDestruct() {
|
|
339
|
-
await this.keyRing.selfDestruct();
|
|
340
|
-
}
|
|
341
|
-
getRelayConnectionMutex(url) {
|
|
342
|
-
if (!this.relayConnectionMutexes.has(url)) {
|
|
343
|
-
this.relayConnectionMutexes.set(url, new Mutex());
|
|
344
|
-
}
|
|
345
|
-
return this.relayConnectionMutexes.get(url);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
//# sourceMappingURL=mailbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../../src/mailbox/mailbox.ts"],"names":[],"mappings":"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"}
|