@mtcute/core 0.1.0 → 0.1.1
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/cjs/base-client.js +4 -1
- package/cjs/base-client.js.map +1 -1
- package/cjs/network/auth-key.d.ts +3 -3
- package/cjs/network/auth-key.js +12 -12
- package/cjs/network/auth-key.js.map +1 -1
- package/cjs/network/authorization.js +62 -57
- package/cjs/network/authorization.js.map +1 -1
- package/cjs/network/mtproto-session.d.ts +2 -2
- package/cjs/network/mtproto-session.js +2 -2
- package/cjs/network/mtproto-session.js.map +1 -1
- package/cjs/network/multi-session-connection.d.ts +1 -1
- package/cjs/network/multi-session-connection.js +2 -2
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +1 -0
- package/cjs/network/network-manager.js +21 -27
- package/cjs/network/network-manager.js.map +1 -1
- package/cjs/network/session-connection.d.ts +2 -1
- package/cjs/network/session-connection.js +48 -35
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/intermediate.d.ts +3 -0
- package/cjs/network/transports/intermediate.js +5 -3
- package/cjs/network/transports/intermediate.js.map +1 -1
- package/cjs/network/transports/obfuscated.js +14 -18
- package/cjs/network/transports/obfuscated.js.map +1 -1
- package/cjs/storage/abstract.d.ts +23 -2
- package/cjs/storage/abstract.js.map +1 -1
- package/cjs/storage/json.js +8 -9
- package/cjs/storage/json.js.map +1 -1
- package/cjs/storage/localstorage.js +5 -2
- package/cjs/storage/localstorage.js.map +1 -1
- package/cjs/storage/memory.d.ts +7 -8
- package/cjs/storage/memory.js +7 -7
- package/cjs/storage/memory.js.map +1 -1
- package/cjs/utils/bigint-utils.d.ts +18 -11
- package/cjs/utils/bigint-utils.js +148 -47
- package/cjs/utils/bigint-utils.js.map +1 -1
- package/cjs/utils/buffer-utils.d.ts +7 -1
- package/cjs/utils/buffer-utils.js +16 -3
- package/cjs/utils/buffer-utils.js.map +1 -1
- package/cjs/utils/crypto/abstract.d.ts +16 -9
- package/cjs/utils/crypto/abstract.js +6 -9
- package/cjs/utils/crypto/abstract.js.map +1 -1
- package/cjs/utils/crypto/factorization.d.ts +2 -1
- package/cjs/utils/crypto/factorization.js +28 -36
- package/cjs/utils/crypto/factorization.js.map +1 -1
- package/cjs/utils/crypto/index.d.ts +4 -0
- package/cjs/utils/crypto/index.js +4 -0
- package/cjs/utils/crypto/index.js.map +1 -1
- package/cjs/utils/crypto/keys.d.ts +2 -2
- package/cjs/utils/crypto/keys.js +4 -4
- package/cjs/utils/crypto/keys.js.map +1 -1
- package/cjs/utils/crypto/miller-rabin.d.ts +2 -2
- package/cjs/utils/crypto/miller-rabin.js +20 -22
- package/cjs/utils/crypto/miller-rabin.js.map +1 -1
- package/cjs/utils/crypto/mtproto.d.ts +3 -3
- package/cjs/utils/crypto/mtproto.js +12 -12
- package/cjs/utils/crypto/mtproto.js.map +1 -1
- package/cjs/utils/crypto/node.d.ts +21 -0
- package/cjs/utils/crypto/node.js +74 -0
- package/cjs/utils/crypto/node.js.map +1 -0
- package/cjs/utils/crypto/password.js +22 -33
- package/cjs/utils/crypto/password.js.map +1 -1
- package/cjs/utils/crypto/wasm.d.ts +22 -0
- package/cjs/utils/crypto/wasm.js +41 -0
- package/cjs/utils/crypto/wasm.js.map +1 -0
- package/cjs/utils/crypto/web.d.ts +11 -0
- package/cjs/utils/crypto/web.js +40 -0
- package/cjs/utils/crypto/web.js.map +1 -0
- package/cjs/utils/deque.d.ts +1 -1
- package/cjs/utils/deque.js +9 -3
- package/cjs/utils/deque.js.map +1 -1
- package/cjs/utils/function-utils.d.ts +4 -1
- package/cjs/utils/function-utils.js +8 -1
- package/cjs/utils/function-utils.js.map +1 -1
- package/cjs/utils/index.d.ts +0 -1
- package/cjs/utils/index.js +0 -1
- package/cjs/utils/index.js.map +1 -1
- package/cjs/utils/logger.d.ts +0 -1
- package/cjs/utils/logger.js +3 -4
- package/cjs/utils/logger.js.map +1 -1
- package/cjs/utils/lru-map.d.ts +1 -0
- package/cjs/utils/lru-map.js +6 -0
- package/cjs/utils/lru-map.js.map +1 -1
- package/cjs/utils/peer-utils.js +5 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- package/cjs/utils/platform/crypto.js +2 -2
- package/cjs/utils/platform/crypto.js.map +1 -1
- package/cjs/utils/platform/crypto.web.js +2 -2
- package/cjs/utils/platform/crypto.web.js.map +1 -1
- package/cjs/utils/string-session.js +4 -2
- package/cjs/utils/string-session.js.map +1 -1
- package/esm/base-client.js +4 -1
- package/esm/base-client.js.map +1 -1
- package/esm/network/auth-key.d.ts +3 -3
- package/esm/network/auth-key.js +13 -13
- package/esm/network/auth-key.js.map +1 -1
- package/esm/network/authorization.js +64 -59
- package/esm/network/authorization.js.map +1 -1
- package/esm/network/mtproto-session.d.ts +2 -2
- package/esm/network/mtproto-session.js +2 -2
- package/esm/network/mtproto-session.js.map +1 -1
- package/esm/network/multi-session-connection.d.ts +1 -1
- package/esm/network/multi-session-connection.js +2 -2
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +1 -0
- package/esm/network/network-manager.js +21 -27
- package/esm/network/network-manager.js.map +1 -1
- package/esm/network/session-connection.d.ts +2 -1
- package/esm/network/session-connection.js +50 -37
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/intermediate.d.ts +3 -0
- package/esm/network/transports/intermediate.js +6 -4
- package/esm/network/transports/intermediate.js.map +1 -1
- package/esm/network/transports/obfuscated.js +15 -19
- package/esm/network/transports/obfuscated.js.map +1 -1
- package/esm/storage/abstract.d.ts +23 -2
- package/esm/storage/abstract.js.map +1 -1
- package/esm/storage/json.js +8 -9
- package/esm/storage/json.js.map +1 -1
- package/esm/storage/localstorage.js +5 -2
- package/esm/storage/localstorage.js.map +1 -1
- package/esm/storage/memory.d.ts +7 -8
- package/esm/storage/memory.js +7 -7
- package/esm/storage/memory.js.map +1 -1
- package/esm/utils/bigint-utils.d.ts +18 -11
- package/esm/utils/bigint-utils.js +142 -44
- package/esm/utils/bigint-utils.js.map +1 -1
- package/esm/utils/buffer-utils.d.ts +7 -1
- package/esm/utils/buffer-utils.js +14 -1
- package/esm/utils/buffer-utils.js.map +1 -1
- package/esm/utils/crypto/abstract.d.ts +16 -9
- package/esm/utils/crypto/abstract.js +6 -9
- package/esm/utils/crypto/abstract.js.map +1 -1
- package/esm/utils/crypto/factorization.d.ts +2 -1
- package/esm/utils/crypto/factorization.js +29 -34
- package/esm/utils/crypto/factorization.js.map +1 -1
- package/esm/utils/crypto/index.d.ts +4 -0
- package/esm/utils/crypto/index.js +4 -0
- package/esm/utils/crypto/index.js.map +1 -1
- package/esm/utils/crypto/keys.d.ts +2 -2
- package/esm/utils/crypto/keys.js +4 -4
- package/esm/utils/crypto/keys.js.map +1 -1
- package/esm/utils/crypto/miller-rabin.d.ts +2 -2
- package/esm/utils/crypto/miller-rabin.js +21 -20
- package/esm/utils/crypto/miller-rabin.js.map +1 -1
- package/esm/utils/crypto/mtproto.d.ts +3 -3
- package/esm/utils/crypto/mtproto.js +12 -12
- package/esm/utils/crypto/mtproto.js.map +1 -1
- package/esm/utils/crypto/node.d.ts +21 -0
- package/esm/utils/crypto/node.js +69 -0
- package/esm/utils/crypto/node.js.map +1 -0
- package/esm/utils/crypto/password.js +24 -32
- package/esm/utils/crypto/password.js.map +1 -1
- package/esm/utils/crypto/wasm.d.ts +22 -0
- package/esm/utils/crypto/wasm.js +37 -0
- package/esm/utils/crypto/wasm.js.map +1 -0
- package/esm/utils/crypto/web.d.ts +11 -0
- package/esm/utils/crypto/web.js +36 -0
- package/esm/utils/crypto/web.js.map +1 -0
- package/esm/utils/deque.d.ts +1 -1
- package/esm/utils/deque.js +9 -3
- package/esm/utils/deque.js.map +1 -1
- package/esm/utils/function-utils.d.ts +4 -1
- package/esm/utils/function-utils.js +8 -1
- package/esm/utils/function-utils.js.map +1 -1
- package/esm/utils/index.d.ts +0 -1
- package/esm/utils/index.js +0 -1
- package/esm/utils/index.js.map +1 -1
- package/esm/utils/logger.d.ts +0 -1
- package/esm/utils/logger.js +3 -4
- package/esm/utils/logger.js.map +1 -1
- package/esm/utils/lru-map.d.ts +1 -0
- package/esm/utils/lru-map.js +6 -0
- package/esm/utils/lru-map.js.map +1 -1
- package/esm/utils/peer-utils.js +5 -1
- package/esm/utils/peer-utils.js.map +1 -1
- package/esm/utils/platform/crypto.js +1 -1
- package/esm/utils/platform/crypto.js.map +1 -1
- package/esm/utils/platform/crypto.web.js +2 -2
- package/esm/utils/platform/crypto.web.js.map +1 -1
- package/esm/utils/string-session.js +4 -2
- package/esm/utils/string-session.js.map +1 -1
- package/package.json +4 -5
- package/cjs/utils/crypto/common.d.ts +0 -12
- package/cjs/utils/crypto/common.js +0 -54
- package/cjs/utils/crypto/common.js.map +0 -1
- package/cjs/utils/crypto/node-crypto.d.ts +0 -10
- package/cjs/utils/crypto/node-crypto.js +0 -46
- package/cjs/utils/crypto/node-crypto.js.map +0 -1
- package/cjs/utils/crypto/subtle.d.ts +0 -12
- package/cjs/utils/crypto/subtle.js +0 -86
- package/cjs/utils/crypto/subtle.js.map +0 -1
- package/cjs/utils/flood-control.d.ts +0 -14
- package/cjs/utils/flood-control.js +0 -65
- package/cjs/utils/flood-control.js.map +0 -1
- package/cjs/utils/platform/random.d.ts +0 -1
- package/cjs/utils/platform/random.js +0 -7
- package/cjs/utils/platform/random.js.map +0 -1
- package/cjs/utils/platform/random.web.d.ts +0 -1
- package/cjs/utils/platform/random.web.js +0 -10
- package/cjs/utils/platform/random.web.js.map +0 -1
- package/esm/utils/crypto/common.d.ts +0 -12
- package/esm/utils/crypto/common.js +0 -50
- package/esm/utils/crypto/common.js.map +0 -1
- package/esm/utils/crypto/node-crypto.d.ts +0 -10
- package/esm/utils/crypto/node-crypto.js +0 -42
- package/esm/utils/crypto/node-crypto.js.map +0 -1
- package/esm/utils/crypto/subtle.d.ts +0 -12
- package/esm/utils/crypto/subtle.js +0 -59
- package/esm/utils/crypto/subtle.js.map +0 -1
- package/esm/utils/flood-control.d.ts +0 -14
- package/esm/utils/flood-control.js +0 -61
- package/esm/utils/flood-control.js.map +0 -1
- package/esm/utils/platform/random.d.ts +0 -1
- package/esm/utils/platform/random.js +0 -4
- package/esm/utils/platform/random.js.map +0 -1
- package/esm/utils/platform/random.web.d.ts +0 -1
- package/esm/utils/platform/random.web.js +0 -6
- package/esm/utils/platform/random.web.js.map +0 -1
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { MaybeAsync } from '../../types/index.js';
|
|
2
|
-
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
-
export declare class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
-
createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme;
|
|
5
|
-
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
6
|
-
pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number, algo?: string): MaybeAsync<Uint8Array>;
|
|
7
|
-
sha1(data: Uint8Array): Uint8Array;
|
|
8
|
-
sha256(data: Uint8Array): Uint8Array;
|
|
9
|
-
hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array>;
|
|
10
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NodeCryptoProvider = void 0;
|
|
4
|
-
// eslint-disable-next-line no-restricted-imports
|
|
5
|
-
const crypto_1 = require("crypto");
|
|
6
|
-
const buffer_utils_js_1 = require("../buffer-utils.js");
|
|
7
|
-
const abstract_js_1 = require("./abstract.js");
|
|
8
|
-
class NodeCryptoProvider extends abstract_js_1.BaseCryptoProvider {
|
|
9
|
-
createAesCtr(key, iv, encrypt) {
|
|
10
|
-
const cipher = (encrypt ? crypto_1.createCipheriv : crypto_1.createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv);
|
|
11
|
-
const update = (data) => cipher.update(data);
|
|
12
|
-
return {
|
|
13
|
-
encrypt: update,
|
|
14
|
-
decrypt: update,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
createAesEcb(key) {
|
|
18
|
-
const methodName = `aes-${key.length * 8}-ecb`;
|
|
19
|
-
return {
|
|
20
|
-
encrypt(data) {
|
|
21
|
-
const cipher = (0, crypto_1.createCipheriv)(methodName, key, null);
|
|
22
|
-
cipher.setAutoPadding(false);
|
|
23
|
-
return (0, buffer_utils_js_1.concatBuffers)([cipher.update(data), cipher.final()]);
|
|
24
|
-
},
|
|
25
|
-
decrypt(data) {
|
|
26
|
-
const cipher = (0, crypto_1.createDecipheriv)(methodName, key, null);
|
|
27
|
-
cipher.setAutoPadding(false);
|
|
28
|
-
return (0, buffer_utils_js_1.concatBuffers)([cipher.update(data), cipher.final()]);
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
|
|
33
|
-
return new Promise((resolve, reject) => (0, crypto_1.pbkdf2)(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
|
|
34
|
-
}
|
|
35
|
-
sha1(data) {
|
|
36
|
-
return (0, crypto_1.createHash)('sha1').update(data).digest();
|
|
37
|
-
}
|
|
38
|
-
sha256(data) {
|
|
39
|
-
return (0, crypto_1.createHash)('sha256').update(data).digest();
|
|
40
|
-
}
|
|
41
|
-
hmacSha256(data, key) {
|
|
42
|
-
return (0, crypto_1.createHmac)('sha256', key).update(data).digest();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
exports.NodeCryptoProvider = NodeCryptoProvider;
|
|
46
|
-
//# sourceMappingURL=node-crypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-crypto.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node-crypto.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,mCAAyF;AAGzF,wDAAkD;AAClD,+CAAsF;AAEtF,MAAa,kBAAmB,SAAQ,gCAAkB;IACtD,YAAY,CAAC,GAAe,EAAE,EAAc,EAAE,OAAgB;QAC1D,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAc,CAAC,CAAC,CAAC,yBAAgB,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAElG,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAExD,OAAO;YACH,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAClB,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe;QACxB,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAA;QAE9C,OAAO;YACH,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACpD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,IAAA,+BAAa,EAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,IAAA,+BAAa,EAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;SACJ,CAAA;IACL,CAAC;IAED,MAAM,CACF,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAAM,GAAG,EAAE,EACX,IAAI,GAAG,QAAQ;QAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnC,IAAA,eAAM,EAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAiB,EAAE,GAAe,EAAE,EAAE,CACpF,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAC5C,CACJ,CAAA;IACL,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACnD,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACrD,CAAC;IAED,UAAU,CAAC,IAAgB,EAAE,GAAe;QACxC,OAAO,IAAA,mBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IAC1D,CAAC;CACJ;AAxDD,gDAwDC","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto'\n\nimport { MaybeAsync } from '../../types/index.js'\nimport { concatBuffers } from '../buffer-utils.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme {\n const cipher = (encrypt ? createCipheriv : createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv)\n\n const update = (data: Uint8Array) => cipher.update(data)\n\n return {\n encrypt: update,\n decrypt: update,\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const methodName = `aes-${key.length * 8}-ecb`\n\n return {\n encrypt(data: Uint8Array) {\n const cipher = createCipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\n decrypt(data: Uint8Array) {\n const cipher = createDecipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\n }\n }\n\n pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen = 64,\n algo = 'sha512',\n ): MaybeAsync<Uint8Array> {\n return new Promise((resolve, reject) =>\n pbkdf2(password, salt, iterations, keylen, algo, (err: Error | null, buf: Uint8Array) =>\n err !== null ? reject(err) : resolve(buf),\n ),\n )\n }\n\n sha1(data: Uint8Array): Uint8Array {\n return createHash('sha1').update(data).digest()\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return createHash('sha256').update(data).digest()\n }\n\n hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array> {\n return createHmac('sha256', key).update(data).digest()\n }\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { MaybeAsync } from '../../index.js';
|
|
2
|
-
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
-
export declare class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
-
readonly subtle: SubtleCrypto;
|
|
5
|
-
constructor(subtle: SubtleCrypto);
|
|
6
|
-
sha1(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
7
|
-
sha256(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
8
|
-
pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number | undefined, algo?: string | undefined): Promise<Uint8Array>;
|
|
9
|
-
hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
|
|
10
|
-
createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
|
|
11
|
-
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
12
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.SubtleCryptoProvider = void 0;
|
|
27
|
-
const abstract_js_1 = require("./abstract.js");
|
|
28
|
-
const aes_1 = __importStar(require("@cryptography/aes"));
|
|
29
|
-
const AES = 'default' in aes_1.default ? aes_1.default.default : aes_1.default;
|
|
30
|
-
const ALGO_TO_SUBTLE = {
|
|
31
|
-
sha256: 'SHA-256',
|
|
32
|
-
sha1: 'SHA-1',
|
|
33
|
-
sha512: 'SHA-512',
|
|
34
|
-
};
|
|
35
|
-
function wordsToBytes(words) {
|
|
36
|
-
const o = new Uint8Array(words.byteLength);
|
|
37
|
-
const len = words.length * 4;
|
|
38
|
-
for (let i = 0; i < len; ++i) {
|
|
39
|
-
o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
|
|
40
|
-
}
|
|
41
|
-
return o;
|
|
42
|
-
}
|
|
43
|
-
class SubtleCryptoProvider extends abstract_js_1.BaseCryptoProvider {
|
|
44
|
-
constructor(subtle) {
|
|
45
|
-
super();
|
|
46
|
-
this.subtle = subtle;
|
|
47
|
-
}
|
|
48
|
-
sha1(data) {
|
|
49
|
-
return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result));
|
|
50
|
-
}
|
|
51
|
-
sha256(data) {
|
|
52
|
-
return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result));
|
|
53
|
-
}
|
|
54
|
-
async pbkdf2(password, salt, iterations, keylen, algo) {
|
|
55
|
-
const keyMaterial = await this.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
|
|
56
|
-
return this.subtle
|
|
57
|
-
.deriveBits({
|
|
58
|
-
name: 'PBKDF2',
|
|
59
|
-
salt,
|
|
60
|
-
iterations,
|
|
61
|
-
hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',
|
|
62
|
-
}, keyMaterial, (keylen || 64) * 8)
|
|
63
|
-
.then((result) => new Uint8Array(result));
|
|
64
|
-
}
|
|
65
|
-
async hmacSha256(data, key) {
|
|
66
|
-
const keyMaterial = await this.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
|
|
67
|
-
const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data);
|
|
68
|
-
return new Uint8Array(res);
|
|
69
|
-
}
|
|
70
|
-
createAesCtr(key, iv) {
|
|
71
|
-
const aes = new aes_1.CTR(key, iv);
|
|
72
|
-
return {
|
|
73
|
-
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
74
|
-
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
createAesEcb(key) {
|
|
78
|
-
const aes = new AES(key);
|
|
79
|
-
return {
|
|
80
|
-
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
81
|
-
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
exports.SubtleCryptoProvider = SubtleCryptoProvider;
|
|
86
|
-
//# sourceMappingURL=subtle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subtle.js","sourceRoot":"","sources":["../../../../src/utils/crypto/subtle.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaybeAsync } from '../../index.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nimport AES_, { CTR } from '@cryptography/aes'\n\n// fucking weird flex with es modules.\n// i hate default imports please for the love of god never use them\ntype AES_ = typeof AES_.default\nconst AES = 'default' in AES_ ? AES_.default : AES_ as AES_\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nfunction wordsToBytes(words: Uint32Array): Uint8Array {\n const o = new Uint8Array(words.byteLength)\n\n const len = words.length * 4\n\n for (let i = 0; i < len; ++i) {\n o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)\n }\n\n return o\n}\n\nexport class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n constructor(\n readonly subtle: SubtleCrypto,\n ) {\n super()\n }\n\n sha1(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result))\n }\n\n sha256(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result))\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n const aes = new CTR(key, iv)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const aes = new AES(key)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n}\n"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flood limiter, based on TDlib
|
|
3
|
-
*/
|
|
4
|
-
export declare class FloodControl {
|
|
5
|
-
private _wakeupAt;
|
|
6
|
-
private _withoutUpdate;
|
|
7
|
-
private _events;
|
|
8
|
-
private _limits;
|
|
9
|
-
addLimit(duration: number, count: number): void;
|
|
10
|
-
addEvent(now: number): void;
|
|
11
|
-
clear(): void;
|
|
12
|
-
get wakeupAt(): number;
|
|
13
|
-
private _update;
|
|
14
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// based on https://github.dev/tdlib/td/blob/master/tdutils/td/utils/FloodControlStrict.h
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.FloodControl = void 0;
|
|
5
|
-
/**
|
|
6
|
-
* Flood limiter, based on TDlib
|
|
7
|
-
*/
|
|
8
|
-
class FloodControl {
|
|
9
|
-
constructor() {
|
|
10
|
-
this._wakeupAt = 1;
|
|
11
|
-
this._withoutUpdate = 0;
|
|
12
|
-
this._events = [];
|
|
13
|
-
// pair: duration, count
|
|
14
|
-
this._limits = [];
|
|
15
|
-
}
|
|
16
|
-
// no more than count in each duration
|
|
17
|
-
addLimit(duration, count) {
|
|
18
|
-
this._limits.push({ duration, count, pos: 0 });
|
|
19
|
-
this._withoutUpdate = 0;
|
|
20
|
-
}
|
|
21
|
-
addEvent(now) {
|
|
22
|
-
this._events.push(now);
|
|
23
|
-
if (this._withoutUpdate > 0) {
|
|
24
|
-
this._withoutUpdate -= 1;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
this._update(now);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
clear() {
|
|
31
|
-
this._events.length = 0;
|
|
32
|
-
this._withoutUpdate = 0;
|
|
33
|
-
this._wakeupAt = 1;
|
|
34
|
-
this._limits.forEach((limit) => (limit.pos = 0));
|
|
35
|
-
}
|
|
36
|
-
get wakeupAt() {
|
|
37
|
-
return this._wakeupAt;
|
|
38
|
-
}
|
|
39
|
-
_update(now) {
|
|
40
|
-
let minPos = this._events.length;
|
|
41
|
-
this._withoutUpdate = Infinity;
|
|
42
|
-
this._limits.forEach((limit) => {
|
|
43
|
-
if (limit.count < this._events.length - limit.pos) {
|
|
44
|
-
limit.pos = this._events.length - limit.count;
|
|
45
|
-
}
|
|
46
|
-
while (limit.pos < this._events.length && this._events[limit.pos] + limit.duration < now) {
|
|
47
|
-
limit.pos += 1;
|
|
48
|
-
}
|
|
49
|
-
if (limit.count + limit.pos < this._events.length) {
|
|
50
|
-
this._wakeupAt = Math.max(this._wakeupAt, this._events[limit.pos] + limit.duration);
|
|
51
|
-
this._withoutUpdate = 0;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
this._withoutUpdate = Math.min(this._withoutUpdate, limit.count + limit.pos - this._events.length - 1);
|
|
55
|
-
}
|
|
56
|
-
minPos = Math.min(minPos, limit.pos);
|
|
57
|
-
});
|
|
58
|
-
if (minPos * 2 > this._events.length) {
|
|
59
|
-
this._limits.forEach((limit) => (limit.pos -= minPos));
|
|
60
|
-
this._events.splice(0, minPos);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
exports.FloodControl = FloodControl;
|
|
65
|
-
//# sourceMappingURL=flood-control.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flood-control.js","sourceRoot":"","sources":["../../../src/utils/flood-control.ts"],"names":[],"mappings":"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","sourcesContent":["// based on https://github.dev/tdlib/td/blob/master/tdutils/td/utils/FloodControlStrict.h\n\ninterface FloodControlLimit {\n duration: number\n count: number\n pos: number\n}\n\n/**\n * Flood limiter, based on TDlib\n */\nexport class FloodControl {\n private _wakeupAt = 1\n private _withoutUpdate = 0\n private _events: number[] = []\n // pair: duration, count\n private _limits: FloodControlLimit[] = []\n\n // no more than count in each duration\n addLimit(duration: number, count: number): void {\n this._limits.push({ duration, count, pos: 0 })\n this._withoutUpdate = 0\n }\n\n addEvent(now: number): void {\n this._events.push(now)\n\n if (this._withoutUpdate > 0) {\n this._withoutUpdate -= 1\n } else {\n this._update(now)\n }\n }\n\n clear(): void {\n this._events.length = 0\n this._withoutUpdate = 0\n this._wakeupAt = 1\n this._limits.forEach((limit) => (limit.pos = 0))\n }\n\n get wakeupAt(): number {\n return this._wakeupAt\n }\n\n private _update(now: number): void {\n let minPos = this._events.length\n this._withoutUpdate = Infinity\n\n this._limits.forEach((limit) => {\n if (limit.count < this._events.length - limit.pos) {\n limit.pos = this._events.length - limit.count\n }\n\n while (limit.pos < this._events.length && this._events[limit.pos] + limit.duration < now) {\n limit.pos += 1\n }\n\n if (limit.count + limit.pos < this._events.length) {\n this._wakeupAt = Math.max(this._wakeupAt, this._events[limit.pos] + limit.duration)\n this._withoutUpdate = 0\n } else {\n this._withoutUpdate = Math.min(this._withoutUpdate, limit.count + limit.pos - this._events.length - 1)\n }\n\n minPos = Math.min(minPos, limit.pos)\n })\n\n if (minPos * 2 > this._events.length) {\n this._limits.forEach((limit) => (limit.pos -= minPos))\n this._events.splice(0, minPos)\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const _randomBytes: (size: number) => Uint8Array;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports._randomBytes = void 0;
|
|
4
|
-
// eslint-disable-next-line no-restricted-imports
|
|
5
|
-
const crypto_1 = require("crypto");
|
|
6
|
-
exports._randomBytes = crypto_1.randomBytes;
|
|
7
|
-
//# sourceMappingURL=random.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../../../src/utils/platform/random.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,mCAAoC;AAEvB,QAAA,YAAY,GAAG,oBAA2C,CAAA","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { randomBytes } from 'crypto'\n\nexport const _randomBytes = randomBytes as (size: number) => Uint8Array\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function _randomBytes(size: number): Uint8Array;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports._randomBytes = void 0;
|
|
4
|
-
function _randomBytes(size) {
|
|
5
|
-
const ret = new Uint8Array(size);
|
|
6
|
-
crypto.getRandomValues(ret);
|
|
7
|
-
return ret;
|
|
8
|
-
}
|
|
9
|
-
exports._randomBytes = _randomBytes;
|
|
10
|
-
//# sourceMappingURL=random.web.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"random.web.js","sourceRoot":"","sources":["../../../../src/utils/platform/random.web.ts"],"names":[],"mappings":";;;AAAA,SAAgB,YAAY,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAE3B,OAAO,GAAG,CAAA;AACd,CAAC;AALD,oCAKC","sourcesContent":["export function _randomBytes(size: number): Uint8Array {\n const ret = new Uint8Array(size)\n crypto.getRandomValues(ret)\n\n return ret\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { IEncryptionScheme } from './abstract.js';
|
|
2
|
-
/**
|
|
3
|
-
* AES mode of operation IGE implementation in JS
|
|
4
|
-
*/
|
|
5
|
-
export declare class AesModeOfOperationIge implements IEncryptionScheme {
|
|
6
|
-
private _key;
|
|
7
|
-
private _iv;
|
|
8
|
-
private _aes;
|
|
9
|
-
constructor(key: Uint8Array, iv: Uint8Array, ecb: IEncryptionScheme);
|
|
10
|
-
encrypt(data: Uint8Array): Promise<Uint8Array>;
|
|
11
|
-
decrypt(data: Uint8Array): Promise<Uint8Array>;
|
|
12
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { xorBufferInPlace } from './utils.js';
|
|
2
|
-
/**
|
|
3
|
-
* AES mode of operation IGE implementation in JS
|
|
4
|
-
*/
|
|
5
|
-
export class AesModeOfOperationIge {
|
|
6
|
-
constructor(key, iv, ecb) {
|
|
7
|
-
this._key = key;
|
|
8
|
-
this._iv = iv;
|
|
9
|
-
this._aes = ecb;
|
|
10
|
-
}
|
|
11
|
-
async encrypt(data) {
|
|
12
|
-
if (data.length % 16 !== 0) {
|
|
13
|
-
throw new Error('invalid plaintext size (must be multiple of 16 bytes)');
|
|
14
|
-
}
|
|
15
|
-
const ciphertext = new Uint8Array(data.length);
|
|
16
|
-
let block = new Uint8Array(16);
|
|
17
|
-
let iv1 = this._iv.subarray(0, 16);
|
|
18
|
-
let iv2 = this._iv.subarray(16, 32);
|
|
19
|
-
for (let i = 0; i < data.length; i += 16) {
|
|
20
|
-
block.set(data.subarray(i, i + 16));
|
|
21
|
-
xorBufferInPlace(block, iv1);
|
|
22
|
-
block = await this._aes.encrypt(block);
|
|
23
|
-
xorBufferInPlace(block, iv2);
|
|
24
|
-
ciphertext.set(block, i);
|
|
25
|
-
iv1 = ciphertext.subarray(i, i + 16);
|
|
26
|
-
iv2 = data.subarray(i, i + 16);
|
|
27
|
-
}
|
|
28
|
-
return ciphertext;
|
|
29
|
-
}
|
|
30
|
-
async decrypt(data) {
|
|
31
|
-
if (data.length % 16 !== 0) {
|
|
32
|
-
throw new Error('invalid ciphertext size (must be multiple of 16 bytes)');
|
|
33
|
-
}
|
|
34
|
-
const plaintext = new Uint8Array(data.length);
|
|
35
|
-
let block = new Uint8Array(16);
|
|
36
|
-
let iv1 = this._iv.subarray(16, 32);
|
|
37
|
-
let iv2 = this._iv.subarray(0, 16);
|
|
38
|
-
for (let i = 0; i < data.length; i += 16) {
|
|
39
|
-
block.set(data.subarray(i, i + 16));
|
|
40
|
-
xorBufferInPlace(block, iv1);
|
|
41
|
-
block = await this._aes.decrypt(block);
|
|
42
|
-
xorBufferInPlace(block, iv2);
|
|
43
|
-
plaintext.set(block, i);
|
|
44
|
-
iv1 = plaintext.subarray(i, i + 16);
|
|
45
|
-
iv2 = data.subarray(i, i + 16);
|
|
46
|
-
}
|
|
47
|
-
return plaintext;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=common.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/utils/crypto/common.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IEncryptionScheme } from './abstract.js'\nimport { xorBufferInPlace } from './utils.js'\n\n/**\n * AES mode of operation IGE implementation in JS\n */\nexport class AesModeOfOperationIge implements IEncryptionScheme {\n private _key: Uint8Array\n private _iv: Uint8Array\n private _aes: IEncryptionScheme\n\n constructor(key: Uint8Array, iv: Uint8Array, ecb: IEncryptionScheme) {\n this._key = key\n this._iv = iv\n this._aes = ecb\n }\n\n async encrypt(data: Uint8Array): Promise<Uint8Array> {\n if (data.length % 16 !== 0) {\n throw new Error('invalid plaintext size (must be multiple of 16 bytes)')\n }\n\n const ciphertext = new Uint8Array(data.length)\n let block = new Uint8Array(16)\n\n let iv1 = this._iv.subarray(0, 16)\n let iv2 = this._iv.subarray(16, 32)\n\n for (let i = 0; i < data.length; i += 16) {\n block.set(data.subarray(i, i + 16))\n xorBufferInPlace(block, iv1)\n block = await this._aes.encrypt(block)\n xorBufferInPlace(block, iv2)\n ciphertext.set(block, i)\n\n iv1 = ciphertext.subarray(i, i + 16)\n iv2 = data.subarray(i, i + 16)\n }\n\n return ciphertext\n }\n\n async decrypt(data: Uint8Array): Promise<Uint8Array> {\n if (data.length % 16 !== 0) {\n throw new Error('invalid ciphertext size (must be multiple of 16 bytes)')\n }\n\n const plaintext = new Uint8Array(data.length)\n let block = new Uint8Array(16)\n\n let iv1 = this._iv.subarray(16, 32)\n let iv2 = this._iv.subarray(0, 16)\n\n for (let i = 0; i < data.length; i += 16) {\n block.set(data.subarray(i, i + 16))\n xorBufferInPlace(block, iv1)\n block = await this._aes.decrypt(block)\n xorBufferInPlace(block, iv2)\n plaintext.set(block, i)\n\n iv1 = plaintext.subarray(i, i + 16)\n iv2 = data.subarray(i, i + 16)\n }\n\n return plaintext\n }\n}\n"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { MaybeAsync } from '../../types/index.js';
|
|
2
|
-
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
-
export declare class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
-
createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme;
|
|
5
|
-
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
6
|
-
pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number, algo?: string): MaybeAsync<Uint8Array>;
|
|
7
|
-
sha1(data: Uint8Array): Uint8Array;
|
|
8
|
-
sha256(data: Uint8Array): Uint8Array;
|
|
9
|
-
hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array>;
|
|
10
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line no-restricted-imports
|
|
2
|
-
import { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto';
|
|
3
|
-
import { concatBuffers } from '../buffer-utils.js';
|
|
4
|
-
import { BaseCryptoProvider } from './abstract.js';
|
|
5
|
-
export class NodeCryptoProvider extends BaseCryptoProvider {
|
|
6
|
-
createAesCtr(key, iv, encrypt) {
|
|
7
|
-
const cipher = (encrypt ? createCipheriv : createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv);
|
|
8
|
-
const update = (data) => cipher.update(data);
|
|
9
|
-
return {
|
|
10
|
-
encrypt: update,
|
|
11
|
-
decrypt: update,
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
createAesEcb(key) {
|
|
15
|
-
const methodName = `aes-${key.length * 8}-ecb`;
|
|
16
|
-
return {
|
|
17
|
-
encrypt(data) {
|
|
18
|
-
const cipher = createCipheriv(methodName, key, null);
|
|
19
|
-
cipher.setAutoPadding(false);
|
|
20
|
-
return concatBuffers([cipher.update(data), cipher.final()]);
|
|
21
|
-
},
|
|
22
|
-
decrypt(data) {
|
|
23
|
-
const cipher = createDecipheriv(methodName, key, null);
|
|
24
|
-
cipher.setAutoPadding(false);
|
|
25
|
-
return concatBuffers([cipher.update(data), cipher.final()]);
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
|
|
30
|
-
return new Promise((resolve, reject) => pbkdf2(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
|
|
31
|
-
}
|
|
32
|
-
sha1(data) {
|
|
33
|
-
return createHash('sha1').update(data).digest();
|
|
34
|
-
}
|
|
35
|
-
sha256(data) {
|
|
36
|
-
return createHash('sha256').update(data).digest();
|
|
37
|
-
}
|
|
38
|
-
hmacSha256(data, key) {
|
|
39
|
-
return createHmac('sha256', key).update(data).digest();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=node-crypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-crypto.js","sourceRoot":"","sources":["../../../../src/utils/crypto/node-crypto.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAsC,MAAM,eAAe,CAAA;AAEtF,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACtD,YAAY,CAAC,GAAe,EAAE,EAAc,EAAE,OAAgB;QAC1D,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAElG,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAExD,OAAO;YACH,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAClB,CAAA;IACL,CAAC;IAED,YAAY,CAAC,GAAe;QACxB,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAA;QAE9C,OAAO;YACH,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACpD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO,CAAC,IAAgB;gBACpB,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBACtD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;gBAE5B,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;YAC/D,CAAC;SACJ,CAAA;IACL,CAAC;IAED,MAAM,CACF,QAAoB,EACpB,IAAgB,EAChB,UAAkB,EAClB,MAAM,GAAG,EAAE,EACX,IAAI,GAAG,QAAQ;QAEf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACnC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAiB,EAAE,GAAe,EAAE,EAAE,CACpF,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAC5C,CACJ,CAAA;IACL,CAAC;IAED,IAAI,CAAC,IAAgB;QACjB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACnD,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IACrD,CAAC;IAED,UAAU,CAAC,IAAgB,EAAE,GAAe;QACxC,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA;IAC1D,CAAC;CACJ","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { createCipheriv, createDecipheriv, createHash, createHmac, pbkdf2 } from 'crypto'\n\nimport { MaybeAsync } from '../../types/index.js'\nimport { concatBuffers } from '../buffer-utils.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nexport class NodeCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IEncryptionScheme {\n const cipher = (encrypt ? createCipheriv : createDecipheriv)(`aes-${key.length * 8}-ctr`, key, iv)\n\n const update = (data: Uint8Array) => cipher.update(data)\n\n return {\n encrypt: update,\n decrypt: update,\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const methodName = `aes-${key.length * 8}-ecb`\n\n return {\n encrypt(data: Uint8Array) {\n const cipher = createCipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\n decrypt(data: Uint8Array) {\n const cipher = createDecipheriv(methodName, key, null)\n cipher.setAutoPadding(false)\n\n return concatBuffers([cipher.update(data), cipher.final()])\n },\n }\n }\n\n pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen = 64,\n algo = 'sha512',\n ): MaybeAsync<Uint8Array> {\n return new Promise((resolve, reject) =>\n pbkdf2(password, salt, iterations, keylen, algo, (err: Error | null, buf: Uint8Array) =>\n err !== null ? reject(err) : resolve(buf),\n ),\n )\n }\n\n sha1(data: Uint8Array): Uint8Array {\n return createHash('sha1').update(data).digest()\n }\n\n sha256(data: Uint8Array): Uint8Array {\n return createHash('sha256').update(data).digest()\n }\n\n hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array> {\n return createHmac('sha256', key).update(data).digest()\n }\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { MaybeAsync } from '../../index.js';
|
|
2
|
-
import { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js';
|
|
3
|
-
export declare class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {
|
|
4
|
-
readonly subtle: SubtleCrypto;
|
|
5
|
-
constructor(subtle: SubtleCrypto);
|
|
6
|
-
sha1(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
7
|
-
sha256(data: Uint8Array): MaybeAsync<Uint8Array>;
|
|
8
|
-
pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number | undefined, algo?: string | undefined): Promise<Uint8Array>;
|
|
9
|
-
hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array>;
|
|
10
|
-
createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
|
|
11
|
-
createAesEcb(key: Uint8Array): IEncryptionScheme;
|
|
12
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { BaseCryptoProvider } from './abstract.js';
|
|
2
|
-
import AES_, { CTR } from '@cryptography/aes';
|
|
3
|
-
const AES = 'default' in AES_ ? AES_.default : AES_;
|
|
4
|
-
const ALGO_TO_SUBTLE = {
|
|
5
|
-
sha256: 'SHA-256',
|
|
6
|
-
sha1: 'SHA-1',
|
|
7
|
-
sha512: 'SHA-512',
|
|
8
|
-
};
|
|
9
|
-
function wordsToBytes(words) {
|
|
10
|
-
const o = new Uint8Array(words.byteLength);
|
|
11
|
-
const len = words.length * 4;
|
|
12
|
-
for (let i = 0; i < len; ++i) {
|
|
13
|
-
o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);
|
|
14
|
-
}
|
|
15
|
-
return o;
|
|
16
|
-
}
|
|
17
|
-
export class SubtleCryptoProvider extends BaseCryptoProvider {
|
|
18
|
-
constructor(subtle) {
|
|
19
|
-
super();
|
|
20
|
-
this.subtle = subtle;
|
|
21
|
-
}
|
|
22
|
-
sha1(data) {
|
|
23
|
-
return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result));
|
|
24
|
-
}
|
|
25
|
-
sha256(data) {
|
|
26
|
-
return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result));
|
|
27
|
-
}
|
|
28
|
-
async pbkdf2(password, salt, iterations, keylen, algo) {
|
|
29
|
-
const keyMaterial = await this.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits']);
|
|
30
|
-
return this.subtle
|
|
31
|
-
.deriveBits({
|
|
32
|
-
name: 'PBKDF2',
|
|
33
|
-
salt,
|
|
34
|
-
iterations,
|
|
35
|
-
hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',
|
|
36
|
-
}, keyMaterial, (keylen || 64) * 8)
|
|
37
|
-
.then((result) => new Uint8Array(result));
|
|
38
|
-
}
|
|
39
|
-
async hmacSha256(data, key) {
|
|
40
|
-
const keyMaterial = await this.subtle.importKey('raw', key, { name: 'HMAC', hash: { name: 'SHA-256' } }, false, ['sign']);
|
|
41
|
-
const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data);
|
|
42
|
-
return new Uint8Array(res);
|
|
43
|
-
}
|
|
44
|
-
createAesCtr(key, iv) {
|
|
45
|
-
const aes = new CTR(key, iv);
|
|
46
|
-
return {
|
|
47
|
-
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
48
|
-
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
createAesEcb(key) {
|
|
52
|
-
const aes = new AES(key);
|
|
53
|
-
return {
|
|
54
|
-
encrypt: (data) => wordsToBytes(aes.encrypt(data)),
|
|
55
|
-
decrypt: (data) => wordsToBytes(aes.decrypt(data)),
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=subtle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subtle.js","sourceRoot":"","sources":["../../../../src/utils/crypto/subtle.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaybeAsync } from '../../index.js'\nimport { BaseCryptoProvider, ICryptoProvider, IEncryptionScheme } from './abstract.js'\n\nimport AES_, { CTR } from '@cryptography/aes'\n\n// fucking weird flex with es modules.\n// i hate default imports please for the love of god never use them\ntype AES_ = typeof AES_.default\nconst AES = 'default' in AES_ ? AES_.default : AES_ as AES_\n\nconst ALGO_TO_SUBTLE: Record<string, string> = {\n sha256: 'SHA-256',\n sha1: 'SHA-1',\n sha512: 'SHA-512',\n}\n\nfunction wordsToBytes(words: Uint32Array): Uint8Array {\n const o = new Uint8Array(words.byteLength)\n\n const len = words.length * 4\n\n for (let i = 0; i < len; ++i) {\n o[i] = ((words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)\n }\n\n return o\n}\n\nexport class SubtleCryptoProvider extends BaseCryptoProvider implements ICryptoProvider {\n constructor(\n readonly subtle: SubtleCrypto,\n ) {\n super()\n }\n\n sha1(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-1', data).then((result) => new Uint8Array(result))\n }\n\n sha256(data: Uint8Array): MaybeAsync<Uint8Array> {\n return this.subtle.digest('SHA-256', data).then((result) => new Uint8Array(result))\n }\n\n async pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen?: number | undefined,\n algo?: string | undefined,\n ): Promise<Uint8Array> {\n const keyMaterial = await this.subtle.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])\n\n return this.subtle\n .deriveBits(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: algo ? ALGO_TO_SUBTLE[algo] : 'SHA-512',\n },\n keyMaterial,\n (keylen || 64) * 8,\n )\n .then((result) => new Uint8Array(result))\n }\n\n async hmacSha256(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const keyMaterial = await this.subtle.importKey(\n 'raw',\n key,\n { name: 'HMAC', hash: { name: 'SHA-256' } },\n false,\n ['sign'],\n )\n\n const res = await this.subtle.sign({ name: 'HMAC' }, keyMaterial, data)\n\n return new Uint8Array(res)\n }\n\n createAesCtr(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n const aes = new CTR(key, iv)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n\n createAesEcb(key: Uint8Array): IEncryptionScheme {\n const aes = new AES(key)\n\n return {\n encrypt: (data) => wordsToBytes(aes.encrypt(data)),\n decrypt: (data) => wordsToBytes(aes.decrypt(data)),\n }\n }\n}\n"]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flood limiter, based on TDlib
|
|
3
|
-
*/
|
|
4
|
-
export declare class FloodControl {
|
|
5
|
-
private _wakeupAt;
|
|
6
|
-
private _withoutUpdate;
|
|
7
|
-
private _events;
|
|
8
|
-
private _limits;
|
|
9
|
-
addLimit(duration: number, count: number): void;
|
|
10
|
-
addEvent(now: number): void;
|
|
11
|
-
clear(): void;
|
|
12
|
-
get wakeupAt(): number;
|
|
13
|
-
private _update;
|
|
14
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// based on https://github.dev/tdlib/td/blob/master/tdutils/td/utils/FloodControlStrict.h
|
|
2
|
-
/**
|
|
3
|
-
* Flood limiter, based on TDlib
|
|
4
|
-
*/
|
|
5
|
-
export class FloodControl {
|
|
6
|
-
constructor() {
|
|
7
|
-
this._wakeupAt = 1;
|
|
8
|
-
this._withoutUpdate = 0;
|
|
9
|
-
this._events = [];
|
|
10
|
-
// pair: duration, count
|
|
11
|
-
this._limits = [];
|
|
12
|
-
}
|
|
13
|
-
// no more than count in each duration
|
|
14
|
-
addLimit(duration, count) {
|
|
15
|
-
this._limits.push({ duration, count, pos: 0 });
|
|
16
|
-
this._withoutUpdate = 0;
|
|
17
|
-
}
|
|
18
|
-
addEvent(now) {
|
|
19
|
-
this._events.push(now);
|
|
20
|
-
if (this._withoutUpdate > 0) {
|
|
21
|
-
this._withoutUpdate -= 1;
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
this._update(now);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
clear() {
|
|
28
|
-
this._events.length = 0;
|
|
29
|
-
this._withoutUpdate = 0;
|
|
30
|
-
this._wakeupAt = 1;
|
|
31
|
-
this._limits.forEach((limit) => (limit.pos = 0));
|
|
32
|
-
}
|
|
33
|
-
get wakeupAt() {
|
|
34
|
-
return this._wakeupAt;
|
|
35
|
-
}
|
|
36
|
-
_update(now) {
|
|
37
|
-
let minPos = this._events.length;
|
|
38
|
-
this._withoutUpdate = Infinity;
|
|
39
|
-
this._limits.forEach((limit) => {
|
|
40
|
-
if (limit.count < this._events.length - limit.pos) {
|
|
41
|
-
limit.pos = this._events.length - limit.count;
|
|
42
|
-
}
|
|
43
|
-
while (limit.pos < this._events.length && this._events[limit.pos] + limit.duration < now) {
|
|
44
|
-
limit.pos += 1;
|
|
45
|
-
}
|
|
46
|
-
if (limit.count + limit.pos < this._events.length) {
|
|
47
|
-
this._wakeupAt = Math.max(this._wakeupAt, this._events[limit.pos] + limit.duration);
|
|
48
|
-
this._withoutUpdate = 0;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
this._withoutUpdate = Math.min(this._withoutUpdate, limit.count + limit.pos - this._events.length - 1);
|
|
52
|
-
}
|
|
53
|
-
minPos = Math.min(minPos, limit.pos);
|
|
54
|
-
});
|
|
55
|
-
if (minPos * 2 > this._events.length) {
|
|
56
|
-
this._limits.forEach((limit) => (limit.pos -= minPos));
|
|
57
|
-
this._events.splice(0, minPos);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=flood-control.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flood-control.js","sourceRoot":"","sources":["../../../src/utils/flood-control.ts"],"names":[],"mappings":"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","sourcesContent":["// based on https://github.dev/tdlib/td/blob/master/tdutils/td/utils/FloodControlStrict.h\n\ninterface FloodControlLimit {\n duration: number\n count: number\n pos: number\n}\n\n/**\n * Flood limiter, based on TDlib\n */\nexport class FloodControl {\n private _wakeupAt = 1\n private _withoutUpdate = 0\n private _events: number[] = []\n // pair: duration, count\n private _limits: FloodControlLimit[] = []\n\n // no more than count in each duration\n addLimit(duration: number, count: number): void {\n this._limits.push({ duration, count, pos: 0 })\n this._withoutUpdate = 0\n }\n\n addEvent(now: number): void {\n this._events.push(now)\n\n if (this._withoutUpdate > 0) {\n this._withoutUpdate -= 1\n } else {\n this._update(now)\n }\n }\n\n clear(): void {\n this._events.length = 0\n this._withoutUpdate = 0\n this._wakeupAt = 1\n this._limits.forEach((limit) => (limit.pos = 0))\n }\n\n get wakeupAt(): number {\n return this._wakeupAt\n }\n\n private _update(now: number): void {\n let minPos = this._events.length\n this._withoutUpdate = Infinity\n\n this._limits.forEach((limit) => {\n if (limit.count < this._events.length - limit.pos) {\n limit.pos = this._events.length - limit.count\n }\n\n while (limit.pos < this._events.length && this._events[limit.pos] + limit.duration < now) {\n limit.pos += 1\n }\n\n if (limit.count + limit.pos < this._events.length) {\n this._wakeupAt = Math.max(this._wakeupAt, this._events[limit.pos] + limit.duration)\n this._withoutUpdate = 0\n } else {\n this._withoutUpdate = Math.min(this._withoutUpdate, limit.count + limit.pos - this._events.length - 1)\n }\n\n minPos = Math.min(minPos, limit.pos)\n })\n\n if (minPos * 2 > this._events.length) {\n this._limits.forEach((limit) => (limit.pos -= minPos))\n this._events.splice(0, minPos)\n }\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const _randomBytes: (size: number) => Uint8Array;
|