@mtcute/node 0.7.0 → 0.9.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/LICENSE +1 -1
- package/README.md +9 -5
- package/cjs/client.d.ts +47 -0
- package/cjs/client.js +107 -0
- package/cjs/client.js.map +1 -0
- package/cjs/common-internals-node/exit-hook.d.ts +1 -0
- package/cjs/common-internals-node/exit-hook.js +45 -0
- package/cjs/common-internals-node/exit-hook.js.map +1 -0
- package/cjs/common-internals-node/logging.d.ts +1 -0
- package/cjs/common-internals-node/logging.js +34 -0
- package/cjs/common-internals-node/logging.js.map +1 -0
- package/cjs/common-internals-node/platform.d.ts +18 -0
- package/cjs/common-internals-node/platform.js +85 -0
- package/cjs/common-internals-node/platform.js.map +1 -0
- package/cjs/index.d.ts +6 -27
- package/cjs/index.js +6 -86
- package/cjs/index.js.map +1 -1
- package/cjs/methods/download-file.d.ts +9 -0
- package/cjs/methods/download-file.js +34 -0
- package/cjs/methods/download-file.js.map +1 -0
- package/cjs/methods/download-node-stream.d.ts +9 -0
- package/cjs/methods/download-node-stream.js +15 -0
- package/cjs/methods/download-node-stream.js.map +1 -0
- package/cjs/methods.d.ts +3 -0
- package/cjs/methods.js +23 -0
- package/cjs/methods.js.map +1 -0
- package/cjs/sqlite/driver.d.ts +25 -0
- package/cjs/sqlite/driver.js +27 -0
- package/cjs/sqlite/driver.js.map +1 -0
- package/cjs/sqlite/index.d.ts +8 -0
- package/cjs/sqlite/index.js +16 -0
- package/cjs/sqlite/index.js.map +1 -0
- package/cjs/utils/crypto.d.ts +16 -0
- package/cjs/utils/crypto.js +73 -0
- package/cjs/utils/crypto.js.map +1 -0
- package/cjs/utils/normalize-file.d.ts +10 -0
- package/cjs/utils/normalize-file.js +31 -0
- package/cjs/utils/normalize-file.js.map +1 -0
- package/cjs/utils/stream-utils.d.ts +4 -0
- package/cjs/utils/stream-utils.js +77 -0
- package/cjs/utils/stream-utils.js.map +1 -0
- package/cjs/utils/tcp.d.ts +31 -0
- package/cjs/utils/tcp.js +128 -0
- package/cjs/utils/tcp.js.map +1 -0
- package/cjs/utils/version.d.ts +3 -0
- package/cjs/utils/version.js +21 -0
- package/cjs/utils/version.js.map +1 -0
- package/cjs/utils.d.ts +1 -0
- package/cjs/utils.js +1 -0
- package/cjs/utils.js.map +1 -1
- package/cjs/worker.d.ts +10 -0
- package/cjs/worker.js +47 -0
- package/cjs/worker.js.map +1 -0
- package/esm/client.d.ts +47 -0
- package/esm/client.js +105 -0
- package/esm/client.js.map +1 -0
- package/esm/common-internals-node/exit-hook.d.ts +1 -0
- package/esm/common-internals-node/exit-hook.js +41 -0
- package/esm/common-internals-node/exit-hook.js.map +1 -0
- package/esm/common-internals-node/logging.d.ts +1 -0
- package/esm/common-internals-node/logging.js +31 -0
- package/esm/common-internals-node/logging.js.map +1 -0
- package/esm/common-internals-node/platform.d.ts +18 -0
- package/esm/common-internals-node/platform.js +58 -0
- package/esm/common-internals-node/platform.js.map +1 -0
- package/esm/index.d.ts +6 -27
- package/esm/index.js +6 -87
- package/esm/index.js.map +1 -1
- package/esm/methods/download-file.d.ts +9 -0
- package/esm/methods/download-file.js +30 -0
- package/esm/methods/download-file.js.map +1 -0
- package/esm/methods/download-node-stream.d.ts +9 -0
- package/esm/methods/download-node-stream.js +11 -0
- package/esm/methods/download-node-stream.js.map +1 -0
- package/esm/methods.d.ts +3 -0
- package/esm/methods.js +4 -0
- package/esm/methods.js.map +1 -0
- package/esm/sqlite/driver.d.ts +25 -0
- package/esm/sqlite/driver.js +20 -0
- package/esm/sqlite/driver.js.map +1 -0
- package/esm/sqlite/index.d.ts +8 -0
- package/esm/sqlite/index.js +11 -0
- package/esm/sqlite/index.js.map +1 -0
- package/esm/utils/crypto.d.ts +16 -0
- package/esm/utils/crypto.js +71 -0
- package/esm/utils/crypto.js.map +1 -0
- package/esm/utils/normalize-file.d.ts +10 -0
- package/esm/utils/normalize-file.js +27 -0
- package/esm/utils/normalize-file.js.map +1 -0
- package/esm/utils/stream-utils.d.ts +4 -0
- package/esm/utils/stream-utils.js +72 -0
- package/esm/utils/stream-utils.js.map +1 -0
- package/esm/utils/tcp.d.ts +31 -0
- package/esm/utils/tcp.js +120 -0
- package/esm/utils/tcp.js.map +1 -0
- package/esm/utils/version.d.ts +3 -0
- package/esm/utils/version.js +17 -0
- package/esm/utils/version.js.map +1 -0
- package/esm/utils.d.ts +1 -0
- package/esm/utils.js +1 -0
- package/esm/utils.js.map +1 -1
- package/esm/worker.d.ts +10 -0
- package/esm/worker.js +42 -0
- package/esm/worker.js.map +1 -0
- package/package.json +13 -11
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { Readable } from 'stream';
|
|
3
|
+
import { FileDownloadLocation, FileDownloadParameters, ITelegramClient } from '@mtcute/core';
|
|
4
|
+
/**
|
|
5
|
+
* Download a remote file as a Node.js Readable stream.
|
|
6
|
+
*
|
|
7
|
+
* @param params File download parameters
|
|
8
|
+
*/
|
|
9
|
+
export declare function downloadAsNodeStream(client: ITelegramClient, location: FileDownloadLocation, params?: FileDownloadParameters): Readable;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.downloadAsNodeStream = void 0;
|
|
4
|
+
const methods_js_1 = require("@mtcute/core/methods.js");
|
|
5
|
+
const stream_utils_js_1 = require("../utils/stream-utils.js");
|
|
6
|
+
/**
|
|
7
|
+
* Download a remote file as a Node.js Readable stream.
|
|
8
|
+
*
|
|
9
|
+
* @param params File download parameters
|
|
10
|
+
*/
|
|
11
|
+
function downloadAsNodeStream(client, location, params) {
|
|
12
|
+
return (0, stream_utils_js_1.webStreamToNode)((0, methods_js_1.downloadAsStream)(client, location, params));
|
|
13
|
+
}
|
|
14
|
+
exports.downloadAsNodeStream = downloadAsNodeStream;
|
|
15
|
+
//# sourceMappingURL=download-node-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download-node-stream.js","sourceRoot":"","sources":["../../../src/methods/download-node-stream.ts"],"names":[],"mappings":";;;AAGA,wDAA0D;AAE1D,8DAA0D;AAE1D;;;;GAIG;AACH,SAAgB,oBAAoB,CAChC,MAAuB,EACvB,QAA8B,EAC9B,MAA+B;IAE/B,OAAO,IAAA,iCAAe,EAAC,IAAA,6BAAgB,EAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;AACtE,CAAC;AAND,oDAMC","sourcesContent":["import { Readable } from 'stream'\n\nimport { FileDownloadLocation, FileDownloadParameters, ITelegramClient } from '@mtcute/core'\nimport { downloadAsStream } from '@mtcute/core/methods.js'\n\nimport { webStreamToNode } from '../utils/stream-utils.js'\n\n/**\n * Download a remote file as a Node.js Readable stream.\n *\n * @param params File download parameters\n */\nexport function downloadAsNodeStream(\n client: ITelegramClient,\n location: FileDownloadLocation,\n params?: FileDownloadParameters,\n): Readable {\n return webStreamToNode(downloadAsStream(client, location, params))\n}\n"]}
|
package/cjs/methods.d.ts
ADDED
package/cjs/methods.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.downloadAsNodeStream = exports.downloadToFile = void 0;
|
|
18
|
+
var download_file_js_1 = require("./methods/download-file.js");
|
|
19
|
+
Object.defineProperty(exports, "downloadToFile", { enumerable: true, get: function () { return download_file_js_1.downloadToFile; } });
|
|
20
|
+
var download_node_stream_js_1 = require("./methods/download-node-stream.js");
|
|
21
|
+
Object.defineProperty(exports, "downloadAsNodeStream", { enumerable: true, get: function () { return download_node_stream_js_1.downloadAsNodeStream; } });
|
|
22
|
+
__exportStar(require("@mtcute/core/methods.js"), exports);
|
|
23
|
+
//# sourceMappingURL=methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/methods.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+DAA2D;AAAlD,kHAAA,cAAc,OAAA;AACvB,6EAAwE;AAA/D,+HAAA,oBAAoB,OAAA;AAC7B,0DAAuC","sourcesContent":["export { downloadToFile } from './methods/download-file.js'\nexport { downloadAsNodeStream } from './methods/download-node-stream.js'\nexport * from '@mtcute/core/methods.js'\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Options } from 'better-sqlite3';
|
|
2
|
+
import { BaseSqliteStorageDriver, ISqliteDatabase } from '@mtcute/core';
|
|
3
|
+
export interface SqliteStorageDriverOptions {
|
|
4
|
+
/**
|
|
5
|
+
* By default, WAL mode is enabled, which
|
|
6
|
+
* significantly improves performance.
|
|
7
|
+
* [Learn more](https://github.com/JoshuaWise/better-sqlite3/blob/master/docs/performance.md)
|
|
8
|
+
*
|
|
9
|
+
* However, you might encounter some issues,
|
|
10
|
+
* and if you do, you can disable WAL by passing `true`
|
|
11
|
+
*
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
disableWal?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Additional options to pass to `better-sqlite3`
|
|
17
|
+
*/
|
|
18
|
+
options?: Options;
|
|
19
|
+
}
|
|
20
|
+
export declare class SqliteStorageDriver extends BaseSqliteStorageDriver {
|
|
21
|
+
readonly filename: string;
|
|
22
|
+
readonly params?: SqliteStorageDriverOptions | undefined;
|
|
23
|
+
constructor(filename?: string, params?: SqliteStorageDriverOptions | undefined);
|
|
24
|
+
_createDatabase(): ISqliteDatabase;
|
|
25
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SqliteStorageDriver = void 0;
|
|
7
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
8
|
+
const core_1 = require("@mtcute/core");
|
|
9
|
+
class SqliteStorageDriver extends core_1.BaseSqliteStorageDriver {
|
|
10
|
+
constructor(filename = ':memory:', params) {
|
|
11
|
+
super();
|
|
12
|
+
this.filename = filename;
|
|
13
|
+
this.params = params;
|
|
14
|
+
}
|
|
15
|
+
_createDatabase() {
|
|
16
|
+
const db = (0, better_sqlite3_1.default)(this.filename, {
|
|
17
|
+
...this.params?.options,
|
|
18
|
+
verbose: this._log.mgr.level >= 5 ? this._log.verbose : undefined,
|
|
19
|
+
});
|
|
20
|
+
if (!this.params?.disableWal) {
|
|
21
|
+
db.pragma('journal_mode = WAL');
|
|
22
|
+
}
|
|
23
|
+
return db;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.SqliteStorageDriver = SqliteStorageDriver;
|
|
27
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../../src/sqlite/driver.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAiD;AAEjD,uCAAuE;AAqBvE,MAAa,mBAAoB,SAAQ,8BAAuB;IAC5D,YACa,WAAW,UAAU,EACrB,MAAmC;QAE5C,KAAK,EAAE,CAAA;QAHE,aAAQ,GAAR,QAAQ,CAAa;QACrB,WAAM,GAAN,MAAM,CAA6B;IAGhD,CAAC;IAED,eAAe;QACX,MAAM,EAAE,GAAG,IAAA,wBAAO,EAAC,IAAI,CAAC,QAAQ,EAAE;YAC9B,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO;YACvB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,OAA8B,CAAC,CAAC,CAAC,SAAS;SAC5F,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;YAC1B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;SAClC;QAED,OAAO,EAAqB,CAAA;IAChC,CAAC;CACJ;AApBD,kDAoBC","sourcesContent":["import sqlite3, { Options } from 'better-sqlite3'\n\nimport { BaseSqliteStorageDriver, ISqliteDatabase } from '@mtcute/core'\n\nexport interface SqliteStorageDriverOptions {\n /**\n * By default, WAL mode is enabled, which\n * significantly improves performance.\n * [Learn more](https://github.com/JoshuaWise/better-sqlite3/blob/master/docs/performance.md)\n *\n * However, you might encounter some issues,\n * and if you do, you can disable WAL by passing `true`\n *\n * @default false\n */\n disableWal?: boolean\n\n /**\n * Additional options to pass to `better-sqlite3`\n */\n options?: Options\n}\n\nexport class SqliteStorageDriver extends BaseSqliteStorageDriver {\n constructor(\n readonly filename = ':memory:',\n readonly params?: SqliteStorageDriverOptions,\n ) {\n super()\n }\n\n _createDatabase(): ISqliteDatabase {\n const db = sqlite3(this.filename, {\n ...this.params?.options,\n verbose: this._log.mgr.level >= 5 ? (this._log.verbose as Options['verbose']) : undefined,\n })\n\n if (!this.params?.disableWal) {\n db.pragma('journal_mode = WAL')\n }\n\n return db as ISqliteDatabase\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseSqliteStorage } from '@mtcute/core';
|
|
2
|
+
import { SqliteStorageDriverOptions } from './driver.js';
|
|
3
|
+
export { SqliteStorageDriver } from './driver.js';
|
|
4
|
+
export declare class SqliteStorage extends BaseSqliteStorage {
|
|
5
|
+
readonly filename: string;
|
|
6
|
+
readonly params?: SqliteStorageDriverOptions | undefined;
|
|
7
|
+
constructor(filename?: string, params?: SqliteStorageDriverOptions | undefined);
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteStorage = exports.SqliteStorageDriver = void 0;
|
|
4
|
+
const core_1 = require("@mtcute/core");
|
|
5
|
+
const driver_js_1 = require("./driver.js");
|
|
6
|
+
var driver_js_2 = require("./driver.js");
|
|
7
|
+
Object.defineProperty(exports, "SqliteStorageDriver", { enumerable: true, get: function () { return driver_js_2.SqliteStorageDriver; } });
|
|
8
|
+
class SqliteStorage extends core_1.BaseSqliteStorage {
|
|
9
|
+
constructor(filename = ':memory:', params) {
|
|
10
|
+
super(new driver_js_1.SqliteStorageDriver(filename, params));
|
|
11
|
+
this.filename = filename;
|
|
12
|
+
this.params = params;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.SqliteStorage = SqliteStorage;
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sqlite/index.ts"],"names":[],"mappings":";;;AAAA,uCAAgD;AAEhD,2CAA6E;AAE7E,yCAAiD;AAAxC,gHAAA,mBAAmB,OAAA;AAE5B,MAAa,aAAc,SAAQ,wBAAiB;IAChD,YACa,WAAW,UAAU,EACrB,MAAmC;QAE5C,KAAK,CAAC,IAAI,+BAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;QAHvC,aAAQ,GAAR,QAAQ,CAAa;QACrB,WAAM,GAAN,MAAM,CAA6B;IAGhD,CAAC;CACJ;AAPD,sCAOC","sourcesContent":["import { BaseSqliteStorage } from '@mtcute/core'\n\nimport { SqliteStorageDriver, SqliteStorageDriverOptions } from './driver.js'\n\nexport { SqliteStorageDriver } from './driver.js'\n\nexport class SqliteStorage extends BaseSqliteStorage {\n constructor(\n readonly filename = ':memory:',\n readonly params?: SqliteStorageDriverOptions,\n ) {\n super(new SqliteStorageDriver(filename, params))\n }\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MaybePromise } from '@mtcute/core';
|
|
2
|
+
import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from '@mtcute/core/utils.js';
|
|
3
|
+
export declare abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {
|
|
4
|
+
createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr;
|
|
5
|
+
pbkdf2(password: Uint8Array, salt: Uint8Array, iterations: number, keylen?: number, algo?: string): MaybePromise<Uint8Array>;
|
|
6
|
+
sha1(data: Uint8Array): Uint8Array;
|
|
7
|
+
sha256(data: Uint8Array): Uint8Array;
|
|
8
|
+
hmacSha256(data: Uint8Array, key: Uint8Array): Uint8Array;
|
|
9
|
+
gzip(data: Uint8Array, maxSize: number): Uint8Array | null;
|
|
10
|
+
gunzip(data: Uint8Array): Uint8Array;
|
|
11
|
+
randomFill(buf: Uint8Array): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class NodeCryptoProvider extends BaseNodeCryptoProvider implements ICryptoProvider {
|
|
14
|
+
initialize(): Promise<void>;
|
|
15
|
+
createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme;
|
|
16
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeCryptoProvider = exports.BaseNodeCryptoProvider = void 0;
|
|
4
|
+
// eslint-disable-next-line no-restricted-imports
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const zlib_1 = require("zlib");
|
|
8
|
+
const utils_js_1 = require("@mtcute/core/utils.js");
|
|
9
|
+
const wasm_1 = require("@mtcute/wasm");
|
|
10
|
+
class BaseNodeCryptoProvider extends utils_js_1.BaseCryptoProvider {
|
|
11
|
+
createAesCtr(key, iv) {
|
|
12
|
+
const cipher = (0, crypto_1.createCipheriv)(`aes-${key.length * 8}-ctr`, key, iv);
|
|
13
|
+
const update = (data) => cipher.update(data);
|
|
14
|
+
return {
|
|
15
|
+
process: update,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
pbkdf2(password, salt, iterations, keylen = 64, algo = 'sha512') {
|
|
19
|
+
return new Promise((resolve, reject) => (0, crypto_1.pbkdf2)(password, salt, iterations, keylen, algo, (err, buf) => err !== null ? reject(err) : resolve(buf)));
|
|
20
|
+
}
|
|
21
|
+
sha1(data) {
|
|
22
|
+
return (0, crypto_1.createHash)('sha1').update(data).digest();
|
|
23
|
+
}
|
|
24
|
+
sha256(data) {
|
|
25
|
+
return (0, crypto_1.createHash)('sha256').update(data).digest();
|
|
26
|
+
}
|
|
27
|
+
hmacSha256(data, key) {
|
|
28
|
+
return (0, crypto_1.createHmac)('sha256', key).update(data).digest();
|
|
29
|
+
}
|
|
30
|
+
gzip(data, maxSize) {
|
|
31
|
+
try {
|
|
32
|
+
// telegram accepts both zlib and gzip, but zlib is faster and has less overhead, so we use it here
|
|
33
|
+
return (0, zlib_1.deflateSync)(data, {
|
|
34
|
+
maxOutputLength: maxSize,
|
|
35
|
+
});
|
|
36
|
+
// hot path, avoid additional runtime checks
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e.code === 'ERR_BUFFER_TOO_LARGE') {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
throw e;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
gunzip(data) {
|
|
47
|
+
return (0, zlib_1.gunzipSync)(data);
|
|
48
|
+
}
|
|
49
|
+
randomFill(buf) {
|
|
50
|
+
(0, crypto_1.randomFillSync)(buf);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.BaseNodeCryptoProvider = BaseNodeCryptoProvider;
|
|
54
|
+
class NodeCryptoProvider extends BaseNodeCryptoProvider {
|
|
55
|
+
async initialize() {
|
|
56
|
+
//
|
|
57
|
+
const wasmFile = require.resolve('@mtcute/wasm/mtcute.wasm');
|
|
58
|
+
const wasm = await (0, promises_1.readFile)(wasmFile);
|
|
59
|
+
(0, wasm_1.initSync)(wasm);
|
|
60
|
+
}
|
|
61
|
+
createAesIge(key, iv) {
|
|
62
|
+
return {
|
|
63
|
+
encrypt(data) {
|
|
64
|
+
return (0, wasm_1.ige256Encrypt)(data, key, iv);
|
|
65
|
+
},
|
|
66
|
+
decrypt(data) {
|
|
67
|
+
return (0, wasm_1.ige256Decrypt)(data, key, iv);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.NodeCryptoProvider = NodeCryptoProvider;
|
|
73
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/utils/crypto.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,mCAAuF;AACvF,0CAAsC;AAEtC,+BAA8C;AAG9C,oDAAuG;AACvG,uCAAqE;AAErE,MAAsB,sBAAuB,SAAQ,6BAAkB;IACnE,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAEnE,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAExD,OAAO;YACH,OAAO,EAAE,MAAM;SAClB,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;IAED,IAAI,CAAC,IAAgB,EAAE,OAAe;QAClC,IAAI;YACA,mGAAmG;YACnG,OAAO,IAAA,kBAAW,EAAC,IAAI,EAAE;gBACrB,eAAe,EAAE,OAAO;aAC3B,CAAC,CAAA;YACF,4CAA4C;YAC5C,8DAA8D;SACjE;QAAC,OAAO,CAAM,EAAE;YACb,IAAI,CAAC,CAAC,IAAI,KAAK,sBAAsB,EAAE;gBACnC,OAAO,IAAI,CAAA;aACd;YAED,MAAM,CAAC,CAAA;SACV;IACL,CAAC;IAED,MAAM,CAAC,IAAgB;QACnB,OAAO,IAAA,iBAAU,EAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAED,UAAU,CAAC,GAAe;QACtB,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAA;IACvB,CAAC;CACJ;AA7DD,wDA6DC;AAED,MAAa,kBAAmB,SAAQ,sBAAsB;IAC1D,KAAK,CAAC,UAAU;QACZ,GAAG;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAA;QACrC,IAAA,eAAQ,EAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,YAAY,CAAC,GAAe,EAAE,EAAc;QACxC,OAAO;YACH,OAAO,CAAC,IAAgB;gBACpB,OAAO,IAAA,oBAAa,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;YACvC,CAAC;YACD,OAAO,CAAC,IAAgB;gBACpB,OAAO,IAAA,oBAAa,EAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;YACvC,CAAC;SACJ,CAAA;IACL,CAAC;CACJ;AAlBD,gDAkBC","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { createCipheriv, createHash, createHmac, pbkdf2, randomFillSync } from 'crypto'\nimport { readFile } from 'fs/promises'\nimport { createRequire } from 'module'\nimport { deflateSync, gunzipSync } from 'zlib'\n\nimport { MaybePromise } from '@mtcute/core'\nimport { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from '@mtcute/core/utils.js'\nimport { ige256Decrypt, ige256Encrypt, initSync } from '@mtcute/wasm'\n\nexport abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {\n createAesCtr(key: Uint8Array, iv: Uint8Array): IAesCtr {\n const cipher = createCipheriv(`aes-${key.length * 8}-ctr`, key, iv)\n\n const update = (data: Uint8Array) => cipher.update(data)\n\n return {\n process: update,\n }\n }\n\n pbkdf2(\n password: Uint8Array,\n salt: Uint8Array,\n iterations: number,\n keylen = 64,\n algo = 'sha512',\n ): MaybePromise<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): Uint8Array {\n return createHmac('sha256', key).update(data).digest()\n }\n\n gzip(data: Uint8Array, maxSize: number): Uint8Array | null {\n try {\n // telegram accepts both zlib and gzip, but zlib is faster and has less overhead, so we use it here\n return deflateSync(data, {\n maxOutputLength: maxSize,\n })\n // hot path, avoid additional runtime checks\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (e.code === 'ERR_BUFFER_TOO_LARGE') {\n return null\n }\n\n throw e\n }\n }\n\n gunzip(data: Uint8Array): Uint8Array {\n return gunzipSync(data)\n }\n\n randomFill(buf: Uint8Array) {\n randomFillSync(buf)\n }\n}\n\nexport class NodeCryptoProvider extends BaseNodeCryptoProvider implements ICryptoProvider {\n async initialize(): Promise<void> {\n // \n const wasmFile = require.resolve('@mtcute/wasm/mtcute.wasm')\n const wasm = await readFile(wasmFile)\n initSync(wasm)\n }\n\n createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme {\n return {\n encrypt(data: Uint8Array): Uint8Array {\n return ige256Encrypt(data, key, iv)\n },\n decrypt(data: Uint8Array): Uint8Array {\n return ige256Decrypt(data, key, iv)\n },\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { UploadFileLike } from '@mtcute/core';
|
|
2
|
+
export declare function normalizeFile(file: UploadFileLike): Promise<{
|
|
3
|
+
file: ReadableStream<Uint8Array>;
|
|
4
|
+
fileName: string;
|
|
5
|
+
fileSize: number;
|
|
6
|
+
} | {
|
|
7
|
+
file: ReadableStream<Uint8Array>;
|
|
8
|
+
fileName?: undefined;
|
|
9
|
+
fileSize?: undefined;
|
|
10
|
+
} | null>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeFile = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const promises_1 = require("fs/promises");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const stream_1 = require("stream");
|
|
8
|
+
const stream_utils_js_1 = require("./stream-utils.js");
|
|
9
|
+
async function normalizeFile(file) {
|
|
10
|
+
if (typeof file === 'string') {
|
|
11
|
+
file = (0, fs_1.createReadStream)(file);
|
|
12
|
+
}
|
|
13
|
+
if (file instanceof fs_1.ReadStream) {
|
|
14
|
+
const fileName = (0, path_1.basename)(file.path.toString());
|
|
15
|
+
const fileSize = await (0, promises_1.stat)(file.path.toString()).then((stat) => stat.size);
|
|
16
|
+
return {
|
|
17
|
+
file: (0, stream_utils_js_1.nodeStreamToWeb)(file),
|
|
18
|
+
fileName,
|
|
19
|
+
fileSize,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (file instanceof stream_1.Readable) {
|
|
23
|
+
return {
|
|
24
|
+
file: (0, stream_utils_js_1.nodeStreamToWeb)(file),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// string -> ReadStream, thus already handled
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
exports.normalizeFile = normalizeFile;
|
|
31
|
+
//# sourceMappingURL=normalize-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-file.js","sourceRoot":"","sources":["../../../src/utils/normalize-file.ts"],"names":[],"mappings":";;;AAAA,2BAAiD;AACjD,0CAAkC;AAClC,+BAA+B;AAC/B,mCAAiC;AAIjC,uDAAmD;AAE5C,KAAK,UAAU,aAAa,CAAC,IAAoB;IACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC1B,IAAI,GAAG,IAAA,qBAAgB,EAAC,IAAI,CAAC,CAAA;KAChC;IAED,IAAI,IAAI,YAAY,eAAU,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAA,eAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE3E,OAAO;YACH,IAAI,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC;YAC3B,QAAQ;YACR,QAAQ;SACX,CAAA;KACJ;IAED,IAAI,IAAI,YAAY,iBAAQ,EAAE;QAC1B,OAAO;YACH,IAAI,EAAE,IAAA,iCAAe,EAAC,IAAI,CAAC;SAC9B,CAAA;KACJ;IAED,6CAA6C;IAC7C,OAAO,IAAI,CAAA;AACf,CAAC;AAxBD,sCAwBC","sourcesContent":["import { createReadStream, ReadStream } from 'fs'\nimport { stat } from 'fs/promises'\nimport { basename } from 'path'\nimport { Readable } from 'stream'\n\nimport { UploadFileLike } from '@mtcute/core'\n\nimport { nodeStreamToWeb } from './stream-utils.js'\n\nexport async function normalizeFile(file: UploadFileLike) {\n if (typeof file === 'string') {\n file = createReadStream(file)\n }\n\n if (file instanceof ReadStream) {\n const fileName = basename(file.path.toString())\n const fileSize = await stat(file.path.toString()).then((stat) => stat.size)\n\n return {\n file: nodeStreamToWeb(file),\n fileName,\n fileSize,\n }\n }\n\n if (file instanceof Readable) {\n return {\n file: nodeStreamToWeb(file),\n }\n }\n\n // string -> ReadStream, thus already handled\n return null\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.webStreamToNode = exports.nodeStreamToWeb = void 0;
|
|
4
|
+
const stream_1 = require("stream");
|
|
5
|
+
const version_js_1 = require("./version.js");
|
|
6
|
+
function nodeStreamToWeb(stream) {
|
|
7
|
+
if (typeof stream_1.Readable.toWeb === 'function') {
|
|
8
|
+
return stream_1.Readable.toWeb(stream);
|
|
9
|
+
}
|
|
10
|
+
// otherwise, use a silly little adapter
|
|
11
|
+
stream.pause();
|
|
12
|
+
return new ReadableStream({
|
|
13
|
+
start(c) {
|
|
14
|
+
stream.on('data', (chunk) => {
|
|
15
|
+
c.enqueue(chunk);
|
|
16
|
+
});
|
|
17
|
+
stream.on('end', () => {
|
|
18
|
+
c.close();
|
|
19
|
+
});
|
|
20
|
+
stream.on('error', (err) => {
|
|
21
|
+
c.error(err);
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
pull() {
|
|
25
|
+
stream.resume();
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
exports.nodeStreamToWeb = nodeStreamToWeb;
|
|
30
|
+
function webStreamToNode(stream) {
|
|
31
|
+
if (typeof stream_1.Readable.fromWeb === 'function' &&
|
|
32
|
+
(0, version_js_1.isNodeVersionAfter)(18, 13, 0) // https://github.com/nodejs/node/issues/42694
|
|
33
|
+
) {
|
|
34
|
+
// @ts-expect-error node typings are wrong lmao
|
|
35
|
+
return stream_1.Readable.fromWeb(stream);
|
|
36
|
+
}
|
|
37
|
+
const reader = stream.getReader();
|
|
38
|
+
let ended = false;
|
|
39
|
+
const readable = new stream_1.Readable({
|
|
40
|
+
async read() {
|
|
41
|
+
try {
|
|
42
|
+
const { done, value } = await reader.read();
|
|
43
|
+
if (done) {
|
|
44
|
+
this.push(null);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.push(Buffer.from(value.buffer, value.byteOffset, value.byteLength));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
this.destroy(err);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
destroy(error, cb) {
|
|
55
|
+
if (!ended) {
|
|
56
|
+
void reader
|
|
57
|
+
.cancel(error)
|
|
58
|
+
.catch(() => { })
|
|
59
|
+
.then(() => {
|
|
60
|
+
cb(error);
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
cb(error);
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
reader.closed
|
|
68
|
+
.then(() => {
|
|
69
|
+
ended = true;
|
|
70
|
+
})
|
|
71
|
+
.catch((err) => {
|
|
72
|
+
readable.destroy(err);
|
|
73
|
+
});
|
|
74
|
+
return readable;
|
|
75
|
+
}
|
|
76
|
+
exports.webStreamToNode = webStreamToNode;
|
|
77
|
+
//# sourceMappingURL=stream-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../../src/utils/stream-utils.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAEjC,6CAAiD;AAEjD,SAAgB,eAAe,CAAC,MAAgB;IAC5C,IAAI,OAAO,iBAAQ,CAAC,KAAK,KAAK,UAAU,EAAE;QACtC,OAAO,iBAAQ,CAAC,KAAK,CAAC,MAAM,CAA0C,CAAA;KACzE;IAED,wCAAwC;IAExC,MAAM,CAAC,KAAK,EAAE,CAAA;IAEd,OAAO,IAAI,cAAc,CAAC;QACtB,KAAK,CAAC,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBACxB,CAAC,CAAC,OAAO,CAAC,KAAmB,CAAC,CAAA;YAClC,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBAClB,CAAC,CAAC,KAAK,EAAE,CAAA;YACb,CAAC,CAAC,CAAA;YACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACvB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;QACN,CAAC;QACD,IAAI;YACA,MAAM,CAAC,MAAM,EAAE,CAAA;QACnB,CAAC;KACJ,CAAC,CAAA;AACN,CAAC;AAzBD,0CAyBC;AAED,SAAgB,eAAe,CAAC,MAAkC;IAC9D,IACI,OAAO,iBAAQ,CAAC,OAAO,KAAK,UAAU;QACtC,IAAA,+BAAkB,EAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,8CAA8C;MAC9E;QACE,+CAA+C;QAC/C,OAAO,iBAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;KAClC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;IACjC,IAAI,KAAK,GAAG,KAAK,CAAA;IAEjB,MAAM,QAAQ,GAAG,IAAI,iBAAQ,CAAC;QAC1B,KAAK,CAAC,IAAI;YACN,IAAI;gBACA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAE3C,IAAI,IAAI,EAAE;oBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;iBAClB;qBAAM;oBACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAA;iBAC3E;aACJ;YAAC,OAAO,GAAG,EAAE;gBACV,IAAI,CAAC,OAAO,CAAC,GAAY,CAAC,CAAA;aAC7B;QACL,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,EAAE;YACb,IAAI,CAAC,KAAK,EAAE;gBACR,KAAK,MAAM;qBACN,MAAM,CAAC,KAAK,CAAC;qBACb,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;qBACf,IAAI,CAAC,GAAG,EAAE;oBACP,EAAE,CAAC,KAAK,CAAC,CAAA;gBACb,CAAC,CAAC,CAAA;gBAEN,OAAM;aACT;YAED,EAAE,CAAC,KAAK,CAAC,CAAA;QACb,CAAC;KACJ,CAAC,CAAA;IAEF,MAAM,CAAC,MAAM;SACR,IAAI,CAAC,GAAG,EAAE;QACP,KAAK,GAAG,IAAI,CAAA;IAChB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,QAAQ,CAAC,OAAO,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEN,OAAO,QAAQ,CAAA;AACnB,CAAC;AAnDD,0CAmDC","sourcesContent":["import { Readable } from 'stream'\n\nimport { isNodeVersionAfter } from './version.js'\n\nexport function nodeStreamToWeb(stream: Readable): ReadableStream<Uint8Array> {\n if (typeof Readable.toWeb === 'function') {\n return Readable.toWeb(stream) as unknown as ReadableStream<Uint8Array>\n }\n\n // otherwise, use a silly little adapter\n\n stream.pause()\n\n return new ReadableStream({\n start(c) {\n stream.on('data', (chunk) => {\n c.enqueue(chunk as Uint8Array)\n })\n stream.on('end', () => {\n c.close()\n })\n stream.on('error', (err) => {\n c.error(err)\n })\n },\n pull() {\n stream.resume()\n },\n })\n}\n\nexport function webStreamToNode(stream: ReadableStream<Uint8Array>): Readable {\n if (\n typeof Readable.fromWeb === 'function' &&\n isNodeVersionAfter(18, 13, 0) // https://github.com/nodejs/node/issues/42694\n ) {\n // @ts-expect-error node typings are wrong lmao\n return Readable.fromWeb(stream)\n }\n\n const reader = stream.getReader()\n let ended = false\n\n const readable = new Readable({\n async read() {\n try {\n const { done, value } = await reader.read()\n\n if (done) {\n this.push(null)\n } else {\n this.push(Buffer.from(value.buffer, value.byteOffset, value.byteLength))\n }\n } catch (err) {\n this.destroy(err as Error)\n }\n },\n destroy(error, cb) {\n if (!ended) {\n void reader\n .cancel(error)\n .catch(() => {})\n .then(() => {\n cb(error)\n })\n\n return\n }\n\n cb(error)\n },\n })\n\n reader.closed\n .then(() => {\n ended = true\n })\n .catch((err) => {\n readable.destroy(err as Error)\n })\n\n return readable\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import EventEmitter from 'events';
|
|
4
|
+
import { Socket } from 'net';
|
|
5
|
+
import { IntermediatePacketCodec, IPacketCodec, ITelegramTransport, TransportState } from '@mtcute/core';
|
|
6
|
+
import { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Base for TCP transports.
|
|
9
|
+
* Subclasses must provide packet codec in `_packetCodec` property
|
|
10
|
+
*/
|
|
11
|
+
export declare abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {
|
|
12
|
+
protected _currentDc: BasicDcOption | null;
|
|
13
|
+
protected _state: TransportState;
|
|
14
|
+
protected _socket: Socket | null;
|
|
15
|
+
abstract _packetCodec: IPacketCodec;
|
|
16
|
+
protected _crypto: ICryptoProvider;
|
|
17
|
+
protected log: Logger;
|
|
18
|
+
packetCodecInitialized: boolean;
|
|
19
|
+
private _updateLogPrefix;
|
|
20
|
+
setup(crypto: ICryptoProvider, log: Logger): void;
|
|
21
|
+
state(): TransportState;
|
|
22
|
+
currentDc(): BasicDcOption | null;
|
|
23
|
+
connect(dc: BasicDcOption, testMode: boolean): void;
|
|
24
|
+
close(): void;
|
|
25
|
+
handleError(error: Error): void;
|
|
26
|
+
handleConnect(): void;
|
|
27
|
+
send(bytes: Uint8Array): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export declare class TcpTransport extends BaseTcpTransport {
|
|
30
|
+
_packetCodec: IntermediatePacketCodec;
|
|
31
|
+
}
|
package/cjs/utils/tcp.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TcpTransport = exports.BaseTcpTransport = void 0;
|
|
7
|
+
const events_1 = __importDefault(require("events"));
|
|
8
|
+
const net_1 = require("net");
|
|
9
|
+
const core_1 = require("@mtcute/core");
|
|
10
|
+
/**
|
|
11
|
+
* Base for TCP transports.
|
|
12
|
+
* Subclasses must provide packet codec in `_packetCodec` property
|
|
13
|
+
*/
|
|
14
|
+
class BaseTcpTransport extends events_1.default {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this._currentDc = null;
|
|
18
|
+
this._state = core_1.TransportState.Idle;
|
|
19
|
+
this._socket = null;
|
|
20
|
+
this.packetCodecInitialized = false;
|
|
21
|
+
}
|
|
22
|
+
_updateLogPrefix() {
|
|
23
|
+
if (this._currentDc) {
|
|
24
|
+
this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.log.prefix = '[TCP:disconnected] ';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
setup(crypto, log) {
|
|
31
|
+
this._crypto = crypto;
|
|
32
|
+
this.log = log.create('tcp');
|
|
33
|
+
this._updateLogPrefix();
|
|
34
|
+
}
|
|
35
|
+
state() {
|
|
36
|
+
return this._state;
|
|
37
|
+
}
|
|
38
|
+
currentDc() {
|
|
39
|
+
return this._currentDc;
|
|
40
|
+
}
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
42
|
+
connect(dc, testMode) {
|
|
43
|
+
if (this._state !== core_1.TransportState.Idle) {
|
|
44
|
+
throw new core_1.MtcuteError('Transport is not IDLE');
|
|
45
|
+
}
|
|
46
|
+
if (!this.packetCodecInitialized) {
|
|
47
|
+
this._packetCodec.setup?.(this._crypto, this.log);
|
|
48
|
+
this._packetCodec.on('error', (err) => this.emit('error', err));
|
|
49
|
+
this._packetCodec.on('packet', (buf) => this.emit('message', buf));
|
|
50
|
+
this.packetCodecInitialized = true;
|
|
51
|
+
}
|
|
52
|
+
this._state = core_1.TransportState.Connecting;
|
|
53
|
+
this._currentDc = dc;
|
|
54
|
+
this._updateLogPrefix();
|
|
55
|
+
this.log.debug('connecting to %j', dc);
|
|
56
|
+
this._socket = (0, net_1.connect)(dc.port, dc.ipAddress, this.handleConnect.bind(this));
|
|
57
|
+
this._socket.on('data', (data) => {
|
|
58
|
+
this._packetCodec.feed(data);
|
|
59
|
+
});
|
|
60
|
+
this._socket.on('error', this.handleError.bind(this));
|
|
61
|
+
this._socket.on('close', this.close.bind(this));
|
|
62
|
+
}
|
|
63
|
+
close() {
|
|
64
|
+
if (this._state === core_1.TransportState.Idle)
|
|
65
|
+
return;
|
|
66
|
+
this.log.info('connection closed');
|
|
67
|
+
this.emit('close');
|
|
68
|
+
this._state = core_1.TransportState.Idle;
|
|
69
|
+
this._socket.removeAllListeners();
|
|
70
|
+
this._socket.destroy();
|
|
71
|
+
this._socket = null;
|
|
72
|
+
this._currentDc = null;
|
|
73
|
+
this._packetCodec.reset();
|
|
74
|
+
}
|
|
75
|
+
handleError(error) {
|
|
76
|
+
this.log.error('error: %s', error.stack);
|
|
77
|
+
this.emit('error', error);
|
|
78
|
+
}
|
|
79
|
+
handleConnect() {
|
|
80
|
+
this.log.info('connected');
|
|
81
|
+
Promise.resolve(this._packetCodec.tag())
|
|
82
|
+
.then((initialMessage) => {
|
|
83
|
+
if (initialMessage.length) {
|
|
84
|
+
this._socket.write(initialMessage, (err) => {
|
|
85
|
+
if (err) {
|
|
86
|
+
this.log.error('failed to write initial message: %s', err.stack);
|
|
87
|
+
this.emit('error');
|
|
88
|
+
this.close();
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this._state = core_1.TransportState.Ready;
|
|
92
|
+
this.emit('ready');
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this._state = core_1.TransportState.Ready;
|
|
98
|
+
this.emit('ready');
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
.catch((err) => this.emit('error', err));
|
|
102
|
+
}
|
|
103
|
+
async send(bytes) {
|
|
104
|
+
const framed = await this._packetCodec.encode(bytes);
|
|
105
|
+
if (this._state !== core_1.TransportState.Ready) {
|
|
106
|
+
throw new core_1.MtcuteError('Transport is not READY');
|
|
107
|
+
}
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
this._socket.write(framed, (error) => {
|
|
110
|
+
if (error) {
|
|
111
|
+
reject(error);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
resolve();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.BaseTcpTransport = BaseTcpTransport;
|
|
121
|
+
class TcpTransport extends BaseTcpTransport {
|
|
122
|
+
constructor() {
|
|
123
|
+
super(...arguments);
|
|
124
|
+
this._packetCodec = new core_1.IntermediatePacketCodec();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.TcpTransport = TcpTransport;
|
|
128
|
+
//# sourceMappingURL=tcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../../src/utils/tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\nimport { connect, Socket } from 'net'\n\nimport { IntermediatePacketCodec, IPacketCodec, ITelegramTransport, MtcuteError, TransportState } from '@mtcute/core'\nimport { BasicDcOption, ICryptoProvider, Logger } from '@mtcute/core/utils.js'\n\n/**\n * Base for TCP transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {\n protected _currentDc: BasicDcOption | null = null\n protected _state: TransportState = TransportState.Idle\n protected _socket: Socket | null = null\n\n abstract _packetCodec: IPacketCodec\n protected _crypto!: ICryptoProvider\n protected log!: Logger\n\n packetCodecInitialized = false\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `\n } else {\n this.log.prefix = '[TCP:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('tcp')\n this._updateLogPrefix()\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): BasicDcOption | null {\n return this._currentDc\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connect(dc: BasicDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._updateLogPrefix()\n\n this.log.debug('connecting to %j', dc)\n\n this._socket = connect(dc.port, dc.ipAddress, this.handleConnect.bind(this))\n\n this._socket.on('data', (data) => {\n this._packetCodec.feed(data)\n })\n this._socket.on('error', this.handleError.bind(this))\n this._socket.on('close', this.close.bind(this))\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this.emit('close')\n this._state = TransportState.Idle\n this._socket!.removeAllListeners()\n this._socket!.destroy()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n }\n\n handleError(error: Error): void {\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n if (initialMessage.length) {\n this._socket!.write(initialMessage, (err) => {\n if (err) {\n this.log.error('failed to write initial message: %s', err.stack)\n this.emit('error')\n this.close()\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n const framed = await this._packetCodec.encode(bytes)\n\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n return new Promise((resolve, reject) => {\n this._socket!.write(framed, (error) => {\n if (error) {\n reject(error)\n } else {\n resolve()\n }\n })\n })\n }\n}\n\nexport class TcpTransport extends BaseTcpTransport {\n _packetCodec = new IntermediatePacketCodec()\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isNodeVersionAfter = exports.NODE_VERSION_TUPLE = exports.NODE_VERSION = void 0;
|
|
4
|
+
exports.NODE_VERSION = typeof process !== 'undefined' && 'node' in process.versions ? process.versions.node : null;
|
|
5
|
+
exports.NODE_VERSION_TUPLE = exports.NODE_VERSION ? /*#__PURE__*/ exports.NODE_VERSION.split('.').map(Number) : null;
|
|
6
|
+
function isNodeVersionAfter(major, minor, patch) {
|
|
7
|
+
if (!exports.NODE_VERSION_TUPLE)
|
|
8
|
+
return true; // assume non-node environment is always "after"
|
|
9
|
+
const [a, b, c] = exports.NODE_VERSION_TUPLE;
|
|
10
|
+
if (a > major)
|
|
11
|
+
return true;
|
|
12
|
+
if (a < major)
|
|
13
|
+
return false;
|
|
14
|
+
if (b > minor)
|
|
15
|
+
return true;
|
|
16
|
+
if (b < minor)
|
|
17
|
+
return false;
|
|
18
|
+
return c >= patch;
|
|
19
|
+
}
|
|
20
|
+
exports.isNodeVersionAfter = isNodeVersionAfter;
|
|
21
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/utils/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAG,OAAO,OAAO,KAAK,WAAW,IAAI,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1G,QAAA,kBAAkB,GAAG,oBAAY,CAAC,CAAC,CAAC,aAAa,CAAC,oBAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAEzG,SAAgB,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa;IAC1E,IAAI,CAAC,0BAAkB;QAAE,OAAO,IAAI,CAAA,CAAC,gDAAgD;IAErF,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,0BAAkB,CAAA;IACpC,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,IAAI,CAAA;IAC1B,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,KAAK,CAAA;IAC3B,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,IAAI,CAAA;IAC1B,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,KAAK,CAAA;IAE3B,OAAO,CAAC,IAAI,KAAK,CAAA;AACrB,CAAC;AAVD,gDAUC","sourcesContent":["export const NODE_VERSION = typeof process !== 'undefined' && 'node' in process.versions ? process.versions.node : null\nexport const NODE_VERSION_TUPLE = NODE_VERSION ? /*#__PURE__*/ NODE_VERSION.split('.').map(Number) : null\n\nexport function isNodeVersionAfter(major: number, minor: number, patch: number): boolean {\n if (!NODE_VERSION_TUPLE) return true // assume non-node environment is always \"after\"\n\n const [a, b, c] = NODE_VERSION_TUPLE\n if (a > major) return true\n if (a < major) return false\n if (b > minor) return true\n if (b < minor) return false\n\n return c >= patch\n}\n"]}
|
package/cjs/utils.d.ts
CHANGED
package/cjs/utils.js
CHANGED
|
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./utils/stream-utils.js"), exports);
|
|
17
18
|
__exportStar(require("@mtcute/core/utils.js"), exports);
|
|
18
19
|
//# sourceMappingURL=utils.js.map
|
package/cjs/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAqC","sourcesContent":["export * from '@mtcute/core/utils.js'\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAuC;AACvC,wDAAqC","sourcesContent":["export * from './utils/stream-utils.js'\nexport * from '@mtcute/core/utils.js'\n"]}
|