@mtcute/node 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +9 -5
  2. package/cjs/client.d.ts +47 -0
  3. package/cjs/client.js +107 -0
  4. package/cjs/client.js.map +1 -0
  5. package/cjs/index.d.ts +7 -28
  6. package/cjs/index.js +7 -83
  7. package/cjs/index.js.map +1 -1
  8. package/cjs/methods/download-file.d.ts +9 -0
  9. package/cjs/methods/download-file.js +34 -0
  10. package/cjs/methods/download-file.js.map +1 -0
  11. package/cjs/methods/download-node-stream.d.ts +9 -0
  12. package/cjs/methods/download-node-stream.js +15 -0
  13. package/cjs/methods/download-node-stream.js.map +1 -0
  14. package/cjs/methods.d.ts +3 -0
  15. package/cjs/methods.js +24 -0
  16. package/cjs/methods.js.map +1 -0
  17. package/cjs/platform.d.ts +18 -0
  18. package/cjs/platform.js +85 -0
  19. package/cjs/platform.js.map +1 -0
  20. package/cjs/utils/crypto.d.ts +16 -0
  21. package/cjs/utils/crypto.js +73 -0
  22. package/cjs/utils/crypto.js.map +1 -0
  23. package/cjs/utils/exit-hook.d.ts +1 -0
  24. package/cjs/utils/exit-hook.js +45 -0
  25. package/cjs/utils/exit-hook.js.map +1 -0
  26. package/cjs/utils/logging.d.ts +1 -0
  27. package/cjs/utils/logging.js +34 -0
  28. package/cjs/utils/logging.js.map +1 -0
  29. package/cjs/utils/normalize-file.d.ts +10 -0
  30. package/cjs/utils/normalize-file.js +31 -0
  31. package/cjs/utils/normalize-file.js.map +1 -0
  32. package/cjs/utils/stream-utils.d.ts +4 -0
  33. package/cjs/utils/stream-utils.js +72 -0
  34. package/cjs/utils/stream-utils.js.map +1 -0
  35. package/cjs/utils/tcp.d.ts +31 -0
  36. package/cjs/utils/tcp.js +128 -0
  37. package/cjs/utils/tcp.js.map +1 -0
  38. package/cjs/utils/version.d.ts +3 -0
  39. package/cjs/utils/version.js +21 -0
  40. package/cjs/utils/version.js.map +1 -0
  41. package/cjs/utils.d.ts +2 -1
  42. package/cjs/utils.js +2 -1
  43. package/cjs/utils.js.map +1 -1
  44. package/cjs/worker.d.ts +10 -0
  45. package/cjs/worker.js +47 -0
  46. package/cjs/worker.js.map +1 -0
  47. package/esm/client.d.ts +47 -0
  48. package/esm/client.js +105 -0
  49. package/esm/client.js.map +1 -0
  50. package/esm/index.d.ts +7 -28
  51. package/esm/index.js +7 -84
  52. package/esm/index.js.map +1 -1
  53. package/esm/methods/download-file.d.ts +9 -0
  54. package/esm/methods/download-file.js +30 -0
  55. package/esm/methods/download-file.js.map +1 -0
  56. package/esm/methods/download-node-stream.d.ts +9 -0
  57. package/esm/methods/download-node-stream.js +11 -0
  58. package/esm/methods/download-node-stream.js.map +1 -0
  59. package/esm/methods.d.ts +3 -0
  60. package/esm/methods.js +5 -0
  61. package/esm/methods.js.map +1 -0
  62. package/esm/platform.d.ts +18 -0
  63. package/esm/platform.js +58 -0
  64. package/esm/platform.js.map +1 -0
  65. package/esm/utils/crypto.d.ts +16 -0
  66. package/esm/utils/crypto.js +71 -0
  67. package/esm/utils/crypto.js.map +1 -0
  68. package/esm/utils/exit-hook.d.ts +1 -0
  69. package/esm/utils/exit-hook.js +41 -0
  70. package/esm/utils/exit-hook.js.map +1 -0
  71. package/esm/utils/logging.d.ts +1 -0
  72. package/esm/utils/logging.js +31 -0
  73. package/esm/utils/logging.js.map +1 -0
  74. package/esm/utils/normalize-file.d.ts +10 -0
  75. package/esm/utils/normalize-file.js +27 -0
  76. package/esm/utils/normalize-file.js.map +1 -0
  77. package/esm/utils/stream-utils.d.ts +4 -0
  78. package/esm/utils/stream-utils.js +67 -0
  79. package/esm/utils/stream-utils.js.map +1 -0
  80. package/esm/utils/tcp.d.ts +31 -0
  81. package/esm/utils/tcp.js +120 -0
  82. package/esm/utils/tcp.js.map +1 -0
  83. package/esm/utils/version.d.ts +3 -0
  84. package/esm/utils/version.js +17 -0
  85. package/esm/utils/version.js.map +1 -0
  86. package/esm/utils.d.ts +2 -1
  87. package/esm/utils.js +2 -1
  88. package/esm/utils.js.map +1 -1
  89. package/esm/worker.d.ts +10 -0
  90. package/esm/worker.js +42 -0
  91. package/esm/worker.js.map +1 -0
  92. package/package.json +11 -9
@@ -0,0 +1,41 @@
1
+ // roughly based on https://github.com/sindresorhus/exit-hook/blob/main/index.js, MIT license
2
+ let installed = false;
3
+ let handled = false;
4
+ const callbacks = new Set();
5
+ function exit(shouldManuallyExit, signal, event) {
6
+ return function eventHandler() {
7
+ if (handled) {
8
+ return;
9
+ }
10
+ handled = true;
11
+ const exitCode = 128 + signal;
12
+ for (const callback of callbacks) {
13
+ callback();
14
+ }
15
+ if (shouldManuallyExit) {
16
+ // if the user has some custom handlers after us, we don't want to exit the process
17
+ const listeners = process.rawListeners(event);
18
+ const idx = listeners.indexOf(eventHandler);
19
+ if (idx === listeners.length - 1) {
20
+ process.exit(exitCode);
21
+ }
22
+ }
23
+ };
24
+ }
25
+ export function beforeExit(fn) {
26
+ // unsupported platform
27
+ if (typeof process === 'undefined')
28
+ return () => { };
29
+ if (!installed) {
30
+ installed = true;
31
+ process.on('beforeExit', exit(true, -128, 'beforeExit'));
32
+ process.on('SIGINT', exit(true, 2, 'SIGINT'));
33
+ process.on('SIGTERM', exit(true, 15, 'SIGINT'));
34
+ process.on('exit', exit(false, 15, 'exit'));
35
+ }
36
+ callbacks.add(fn);
37
+ return () => {
38
+ callbacks.delete(fn);
39
+ };
40
+ }
41
+ //# sourceMappingURL=exit-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-hook.js","sourceRoot":"","sources":["../../../src/utils/exit-hook.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,IAAI,SAAS,GAAG,KAAK,CAAA;AACrB,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAA;AAEvC,SAAS,IAAI,CAAC,kBAA2B,EAAE,MAAc,EAAE,KAAa;IACpE,OAAO,SAAS,YAAY;QACxB,IAAI,OAAO,EAAE;YACT,OAAM;SACT;QAED,OAAO,GAAG,IAAI,CAAA;QAEd,MAAM,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAA;QAE7B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAC9B,QAAQ,EAAE,CAAA;SACb;QAED,IAAI,kBAAkB,EAAE;YACpB,mFAAmF;YAEnF,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;YAE3C,IAAI,GAAG,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;aACzB;SACJ;IACL,CAAC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAc;IACrC,uBAAuB;IACvB,IAAI,OAAO,OAAO,KAAK,WAAW;QAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;IAEnD,IAAI,CAAC,SAAS,EAAE;QACZ,SAAS,GAAG,IAAI,CAAA;QAEhB,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAA;QACxD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC7C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC/C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;KAC9C;IAED,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEjB,OAAO,GAAG,EAAE;QACR,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACxB,CAAC,CAAA;AACL,CAAC","sourcesContent":["// roughly based on https://github.com/sindresorhus/exit-hook/blob/main/index.js, MIT license\n\nlet installed = false\nlet handled = false\n\nconst callbacks = new Set<() => void>()\n\nfunction exit(shouldManuallyExit: boolean, signal: number, event: string) {\n return function eventHandler() {\n if (handled) {\n return\n }\n\n handled = true\n\n const exitCode = 128 + signal\n\n for (const callback of callbacks) {\n callback()\n }\n\n if (shouldManuallyExit) {\n // if the user has some custom handlers after us, we don't want to exit the process\n\n const listeners = process.rawListeners(event)\n const idx = listeners.indexOf(eventHandler)\n\n if (idx === listeners.length - 1) {\n process.exit(exitCode)\n }\n }\n }\n}\n\nexport function beforeExit(fn: () => void): () => void {\n // unsupported platform\n if (typeof process === 'undefined') return () => {}\n\n if (!installed) {\n installed = true\n\n process.on('beforeExit', exit(true, -128, 'beforeExit'))\n process.on('SIGINT', exit(true, 2, 'SIGINT'))\n process.on('SIGTERM', exit(true, 15, 'SIGINT'))\n process.on('exit', exit(false, 15, 'exit'))\n }\n\n callbacks.add(fn)\n\n return () => {\n callbacks.delete(fn)\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,31 @@
1
+ const isTty = typeof process === 'object' && Boolean(process.stdout?.isTTY);
2
+ const BASE_FORMAT = isTty ? '%s [%s] [%s%s\x1b[0m] ' : '%s [%s] [%s] ';
3
+ const LEVEL_NAMES = isTty ?
4
+ [
5
+ '',
6
+ '\x1b[31mERR\x1b[0m',
7
+ '\x1b[33mWRN\x1b[0m',
8
+ '\x1b[34mINF\x1b[0m',
9
+ '\x1b[36mDBG\x1b[0m',
10
+ '\x1b[35mVRB\x1b[0m',
11
+ ] :
12
+ [
13
+ '',
14
+ 'ERR',
15
+ 'WRN',
16
+ 'INF',
17
+ 'DBG',
18
+ 'VRB',
19
+ ];
20
+ const TAG_COLORS = [6, 2, 3, 4, 5, 1].map((i) => `\x1b[3${i};1m`);
21
+ /** @internal */
22
+ export const defaultLoggingHandler = isTty ?
23
+ (color, level, tag, fmt, args) => {
24
+ // eslint-disable-next-line no-console
25
+ console.log(BASE_FORMAT + fmt, new Date().toISOString(), LEVEL_NAMES[level], TAG_COLORS[color], tag, ...args);
26
+ } :
27
+ (color, level, tag, fmt, args) => {
28
+ // eslint-disable-next-line no-console
29
+ console.log(BASE_FORMAT + fmt, new Date().toISOString(), LEVEL_NAMES[level], tag, ...args);
30
+ };
31
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../src/utils/logging.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAE3E,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,eAAe,CAAA;AACtE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC;IACvB;QACI,EAAE;QACF,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;KACvB,CAAC,CAAC;IACH;QACI,EAAE;QACF,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;KACR,CAAA;AACL,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAEjE,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,CAAC;IACxC,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,IAAe,EAAQ,EAAE;QAC9E,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACjH,CAAC,CAAC,CAAC;IACH,CAAC,KAAa,EAAE,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,IAAe,EAAQ,EAAE;QAC9E,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IAC9F,CAAC,CAAA","sourcesContent":["const isTty = typeof process === 'object' && Boolean(process.stdout?.isTTY)\n\nconst BASE_FORMAT = isTty ? '%s [%s] [%s%s\\x1b[0m] ' : '%s [%s] [%s] '\nconst LEVEL_NAMES = isTty ?\n [\n '', // OFF\n '\\x1b[31mERR\\x1b[0m',\n '\\x1b[33mWRN\\x1b[0m',\n '\\x1b[34mINF\\x1b[0m',\n '\\x1b[36mDBG\\x1b[0m',\n '\\x1b[35mVRB\\x1b[0m',\n ] :\n [\n '', // OFF\n 'ERR',\n 'WRN',\n 'INF',\n 'DBG',\n 'VRB',\n ]\nconst TAG_COLORS = [6, 2, 3, 4, 5, 1].map((i) => `\\x1b[3${i};1m`)\n\n/** @internal */\nexport const defaultLoggingHandler = isTty ?\n (color: number, level: number, tag: string, fmt: string, args: unknown[]): void => {\n // eslint-disable-next-line no-console\n console.log(BASE_FORMAT + fmt, new Date().toISOString(), LEVEL_NAMES[level], TAG_COLORS[color], tag, ...args)\n } :\n (color: number, level: number, tag: string, fmt: string, args: unknown[]): void => {\n // eslint-disable-next-line no-console\n console.log(BASE_FORMAT + fmt, new Date().toISOString(), LEVEL_NAMES[level], tag, ...args)\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,27 @@
1
+ import { createReadStream, ReadStream } from 'fs';
2
+ import { stat } from 'fs/promises';
3
+ import { basename } from 'path';
4
+ import { Readable } from 'stream';
5
+ import { nodeStreamToWeb } from '../utils/stream-utils.js';
6
+ export async function normalizeFile(file) {
7
+ if (typeof file === 'string') {
8
+ file = createReadStream(file);
9
+ }
10
+ if (file instanceof ReadStream) {
11
+ const fileName = basename(file.path.toString());
12
+ const fileSize = await stat(file.path.toString()).then((stat) => stat.size);
13
+ return {
14
+ file: nodeStreamToWeb(file),
15
+ fileName,
16
+ fileSize,
17
+ };
18
+ }
19
+ if (file instanceof Readable) {
20
+ return {
21
+ file: nodeStreamToWeb(file),
22
+ };
23
+ }
24
+ // string -> ReadStream, thus already handled
25
+ return null;
26
+ }
27
+ //# 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,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAIjC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE1D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAoB;IACpD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC1B,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;KAChC;IAED,IAAI,IAAI,YAAY,UAAU,EAAE;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,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,eAAe,CAAC,IAAI,CAAC;YAC3B,QAAQ;YACR,QAAQ;SACX,CAAA;KACJ;IAED,IAAI,IAAI,YAAY,QAAQ,EAAE;QAC1B,OAAO;YACH,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC;SAC9B,CAAA;KACJ;IAED,6CAA6C;IAC7C,OAAO,IAAI,CAAA;AACf,CAAC","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 '../utils/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,4 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { Readable } from 'stream';
3
+ export declare function nodeStreamToWeb(stream: Readable): ReadableStream<Uint8Array>;
4
+ export declare function webStreamToNode(stream: ReadableStream<Uint8Array>): Readable;
@@ -0,0 +1,67 @@
1
+ import { Readable } from 'stream';
2
+ import { isNodeVersionAfter } from './version.js';
3
+ export function nodeStreamToWeb(stream) {
4
+ if (typeof Readable.toWeb === 'function') {
5
+ return Readable.toWeb(stream);
6
+ }
7
+ // otherwise, use a silly little adapter
8
+ stream.pause();
9
+ return new ReadableStream({
10
+ start(c) {
11
+ stream.on('data', (chunk) => {
12
+ c.enqueue(chunk);
13
+ });
14
+ stream.on('end', () => {
15
+ c.close();
16
+ });
17
+ stream.on('error', (err) => {
18
+ c.error(err);
19
+ });
20
+ },
21
+ pull() {
22
+ stream.resume();
23
+ },
24
+ });
25
+ }
26
+ export function webStreamToNode(stream) {
27
+ if (typeof Readable.fromWeb === 'function' &&
28
+ isNodeVersionAfter(18, 13, 0) // https://github.com/nodejs/node/issues/42694
29
+ ) {
30
+ // @ts-expect-error node typings are wrong lmao
31
+ return Readable.fromWeb(stream);
32
+ }
33
+ const reader = stream.getReader();
34
+ let ended = false;
35
+ const readable = new Readable({
36
+ async read() {
37
+ try {
38
+ const { done, value } = await reader.read();
39
+ if (done) {
40
+ this.push(null);
41
+ }
42
+ else {
43
+ this.push(Buffer.from(value.buffer, value.byteOffset, value.byteLength));
44
+ }
45
+ }
46
+ catch (err) {
47
+ this.destroy(err);
48
+ }
49
+ },
50
+ destroy(error, cb) {
51
+ if (!ended) {
52
+ void reader.cancel(error).catch(() => { }).then(() => {
53
+ cb(error);
54
+ });
55
+ return;
56
+ }
57
+ cb(error);
58
+ },
59
+ });
60
+ reader.closed.then(() => {
61
+ ended = true;
62
+ }).catch((err) => {
63
+ readable.destroy(err);
64
+ });
65
+ return readable;
66
+ }
67
+ //# 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,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,UAAU,eAAe,CAAC,MAAgB;IAC5C,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE;QACtC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;KAChC;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;AAED,MAAM,UAAU,eAAe,CAAC,MAAkC;IAC9D,IACI,OAAO,QAAQ,CAAC,OAAO,KAAK,UAAU;QACtC,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,8CAA8C;MAC9E;QACE,+CAA+C;QAC/C,OAAO,QAAQ,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,QAAQ,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,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBAChD,EAAE,CAAC,KAAK,CAAC,CAAA;gBACb,CAAC,CAAC,CAAA;gBAEF,OAAM;aACT;YAED,EAAE,CAAC,KAAK,CAAC,CAAA;QACb,CAAC;KACJ,CAAC,CAAA;IAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACpB,KAAK,GAAG,IAAI,CAAA;IAChB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,QAAQ,CAAC,OAAO,CAAC,GAAY,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACnB,CAAC","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)\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.cancel(error).catch(() => {}).then(() => {\n cb(error)\n })\n\n return\n }\n\n cb(error)\n },\n })\n\n reader.closed.then(() => {\n ended = true\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
+ }
@@ -0,0 +1,120 @@
1
+ import EventEmitter from 'events';
2
+ import { connect } from 'net';
3
+ import { IntermediatePacketCodec, MtcuteError, TransportState } from '@mtcute/core';
4
+ /**
5
+ * Base for TCP transports.
6
+ * Subclasses must provide packet codec in `_packetCodec` property
7
+ */
8
+ export class BaseTcpTransport extends EventEmitter {
9
+ constructor() {
10
+ super(...arguments);
11
+ this._currentDc = null;
12
+ this._state = TransportState.Idle;
13
+ this._socket = null;
14
+ this.packetCodecInitialized = false;
15
+ }
16
+ _updateLogPrefix() {
17
+ if (this._currentDc) {
18
+ this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `;
19
+ }
20
+ else {
21
+ this.log.prefix = '[TCP:disconnected] ';
22
+ }
23
+ }
24
+ setup(crypto, log) {
25
+ this._crypto = crypto;
26
+ this.log = log.create('tcp');
27
+ this._updateLogPrefix();
28
+ }
29
+ state() {
30
+ return this._state;
31
+ }
32
+ currentDc() {
33
+ return this._currentDc;
34
+ }
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
36
+ connect(dc, testMode) {
37
+ if (this._state !== TransportState.Idle) {
38
+ throw new MtcuteError('Transport is not IDLE');
39
+ }
40
+ if (!this.packetCodecInitialized) {
41
+ this._packetCodec.setup?.(this._crypto, this.log);
42
+ this._packetCodec.on('error', (err) => this.emit('error', err));
43
+ this._packetCodec.on('packet', (buf) => this.emit('message', buf));
44
+ this.packetCodecInitialized = true;
45
+ }
46
+ this._state = TransportState.Connecting;
47
+ this._currentDc = dc;
48
+ this._updateLogPrefix();
49
+ this.log.debug('connecting to %j', dc);
50
+ this._socket = connect(dc.port, dc.ipAddress, this.handleConnect.bind(this));
51
+ this._socket.on('data', (data) => {
52
+ this._packetCodec.feed(data);
53
+ });
54
+ this._socket.on('error', this.handleError.bind(this));
55
+ this._socket.on('close', this.close.bind(this));
56
+ }
57
+ close() {
58
+ if (this._state === TransportState.Idle)
59
+ return;
60
+ this.log.info('connection closed');
61
+ this.emit('close');
62
+ this._state = TransportState.Idle;
63
+ this._socket.removeAllListeners();
64
+ this._socket.destroy();
65
+ this._socket = null;
66
+ this._currentDc = null;
67
+ this._packetCodec.reset();
68
+ }
69
+ handleError(error) {
70
+ this.log.error('error: %s', error.stack);
71
+ this.emit('error', error);
72
+ }
73
+ handleConnect() {
74
+ this.log.info('connected');
75
+ Promise.resolve(this._packetCodec.tag())
76
+ .then((initialMessage) => {
77
+ if (initialMessage.length) {
78
+ this._socket.write(initialMessage, (err) => {
79
+ if (err) {
80
+ this.log.error('failed to write initial message: %s', err.stack);
81
+ this.emit('error');
82
+ this.close();
83
+ }
84
+ else {
85
+ this._state = TransportState.Ready;
86
+ this.emit('ready');
87
+ }
88
+ });
89
+ }
90
+ else {
91
+ this._state = TransportState.Ready;
92
+ this.emit('ready');
93
+ }
94
+ })
95
+ .catch((err) => this.emit('error', err));
96
+ }
97
+ async send(bytes) {
98
+ const framed = await this._packetCodec.encode(bytes);
99
+ if (this._state !== TransportState.Ready) {
100
+ throw new MtcuteError('Transport is not READY');
101
+ }
102
+ return new Promise((resolve, reject) => {
103
+ this._socket.write(framed, (error) => {
104
+ if (error) {
105
+ reject(error);
106
+ }
107
+ else {
108
+ resolve();
109
+ }
110
+ });
111
+ });
112
+ }
113
+ }
114
+ export class TcpTransport extends BaseTcpTransport {
115
+ constructor() {
116
+ super(...arguments);
117
+ this._packetCodec = new IntermediatePacketCodec();
118
+ }
119
+ }
120
+ //# 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,3 @@
1
+ export declare const NODE_VERSION: string | null;
2
+ export declare const NODE_VERSION_TUPLE: number[] | null;
3
+ export declare function isNodeVersionAfter(major: number, minor: number, patch: number): boolean;
@@ -0,0 +1,17 @@
1
+ export const NODE_VERSION = typeof process !== 'undefined' && 'node' in process.versions ? process.versions.node : null;
2
+ export const NODE_VERSION_TUPLE = NODE_VERSION ? NODE_VERSION.split('.').map(Number) : null;
3
+ export function isNodeVersionAfter(major, minor, patch) {
4
+ if (!NODE_VERSION_TUPLE)
5
+ return true; // assume non-node environment is always "after"
6
+ const [a, b, c] = NODE_VERSION_TUPLE;
7
+ if (a > major)
8
+ return true;
9
+ if (a < major)
10
+ return false;
11
+ if (b > minor)
12
+ return true;
13
+ if (b < minor)
14
+ return false;
15
+ return c >= patch;
16
+ }
17
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/utils/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,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;AACvH,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAE3F,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa;IAC1E,IAAI,CAAC,kBAAkB;QAAE,OAAO,IAAI,CAAA,CAAC,gDAAgD;IAErF,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,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","sourcesContent":["export const NODE_VERSION = typeof process !== 'undefined' && 'node' in process.versions ? process.versions.node : null\nexport const NODE_VERSION_TUPLE = NODE_VERSION ? 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/esm/utils.d.ts CHANGED
@@ -1 +1,2 @@
1
- export * from '@mtcute/client/utils.js';
1
+ export * from './utils/stream-utils.js';
2
+ export * from '@mtcute/core/utils.js';
package/esm/utils.js CHANGED
@@ -1,2 +1,3 @@
1
- export * from '@mtcute/client/utils.js';
1
+ export * from './utils/stream-utils.js';
2
+ export * from '@mtcute/core/utils.js';
2
3
  //# sourceMappingURL=utils.js.map
package/esm/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../utils.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA","sourcesContent":["export * from '@mtcute/client/utils.js'\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA","sourcesContent":["export * from './utils/stream-utils.js'\nexport * from '@mtcute/core/utils.js'\n"]}
@@ -0,0 +1,10 @@
1
+ import { ClientMessageHandler, RespondFn, SendFn, SomeWorker, TelegramWorker as TelegramWorkerBase, TelegramWorkerOptions, TelegramWorkerPort as TelegramWorkerPortBase, TelegramWorkerPortOptions, WorkerCustomMethods, WorkerMessageHandler } from '@mtcute/core/worker.js';
2
+ export type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods };
3
+ export declare class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {
4
+ registerWorker(handler: WorkerMessageHandler): RespondFn;
5
+ }
6
+ export declare class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {
7
+ readonly options: TelegramWorkerPortOptions;
8
+ constructor(options: TelegramWorkerPortOptions);
9
+ connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void];
10
+ }
package/esm/worker.js ADDED
@@ -0,0 +1,42 @@
1
+ import { parentPort, Worker } from 'worker_threads';
2
+ import { setPlatform } from '@mtcute/core/platform.js';
3
+ import { TelegramWorker as TelegramWorkerBase, TelegramWorkerPort as TelegramWorkerPortBase, } from '@mtcute/core/worker.js';
4
+ import { NodePlatform } from './platform.js';
5
+ let _registered = false;
6
+ export class TelegramWorker extends TelegramWorkerBase {
7
+ registerWorker(handler) {
8
+ if (!parentPort) {
9
+ throw new Error('TelegramWorker must be created from a worker thread');
10
+ }
11
+ if (_registered) {
12
+ throw new Error('TelegramWorker must be created only once');
13
+ }
14
+ _registered = true;
15
+ const port = parentPort;
16
+ const respond = port.postMessage.bind(port);
17
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
18
+ parentPort.on('message', (message) => handler(message, respond));
19
+ return respond;
20
+ }
21
+ }
22
+ export class TelegramWorkerPort extends TelegramWorkerPortBase {
23
+ constructor(options) {
24
+ setPlatform(new NodePlatform());
25
+ super(options);
26
+ this.options = options;
27
+ }
28
+ connectToWorker(worker, handler) {
29
+ if (!(worker instanceof Worker)) {
30
+ throw new Error('Only worker_threads are supported');
31
+ }
32
+ const send = worker.postMessage.bind(worker);
33
+ worker.on('message', handler);
34
+ return [
35
+ send,
36
+ () => {
37
+ worker.off('message', handler);
38
+ },
39
+ ];
40
+ }
41
+ }
42
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAKH,cAAc,IAAI,kBAAkB,EAEpC,kBAAkB,IAAI,sBAAsB,GAI/C,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAI5C,IAAI,WAAW,GAAG,KAAK,CAAA;AAEvB,MAAM,OAAO,cAA8C,SAAQ,kBAAqB;IACpF,cAAc,CAAC,OAA6B;QACxC,IAAI,CAAC,UAAU,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;SACzE;QACD,IAAI,WAAW,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;SAC9D;QAED,WAAW,GAAG,IAAI,CAAA;QAElB,MAAM,IAAI,GAAG,UAAU,CAAA;QAEvB,MAAM,OAAO,GAAc,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEtD,iEAAiE;QACjE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QAEhE,OAAO,OAAO,CAAA;IAClB,CAAC;CACJ;AAED,MAAM,OAAO,kBAAkD,SAAQ,sBAAyB;IAC5F,YAAqB,OAAkC;QACnD,WAAW,CAAC,IAAI,YAAY,EAAE,CAAC,CAAA;QAC/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFG,YAAO,GAAP,OAAO,CAA2B;IAGvD,CAAC;IAED,eAAe,CAAC,MAAkB,EAAE,OAA6B;QAC7D,IAAI,CAAC,CAAC,MAAM,YAAY,MAAM,CAAC,EAAE;YAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;SACvD;QAED,MAAM,IAAI,GAAW,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEpD,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAE7B,OAAO;YACH,IAAI;YACJ,GAAG,EAAE;gBACD,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAClC,CAAC;SACJ,CAAA;IACL,CAAC;CACJ","sourcesContent":["import { parentPort, Worker } from 'worker_threads'\n\nimport { setPlatform } from '@mtcute/core/platform.js'\nimport {\n ClientMessageHandler,\n RespondFn,\n SendFn,\n SomeWorker,\n TelegramWorker as TelegramWorkerBase,\n TelegramWorkerOptions,\n TelegramWorkerPort as TelegramWorkerPortBase,\n TelegramWorkerPortOptions,\n WorkerCustomMethods,\n WorkerMessageHandler,\n} from '@mtcute/core/worker.js'\n\nimport { NodePlatform } from './platform.js'\n\nexport type { TelegramWorkerOptions, TelegramWorkerPortOptions, WorkerCustomMethods }\n\nlet _registered = false\n\nexport class TelegramWorker<T extends WorkerCustomMethods> extends TelegramWorkerBase<T> {\n registerWorker(handler: WorkerMessageHandler): RespondFn {\n if (!parentPort) {\n throw new Error('TelegramWorker must be created from a worker thread')\n }\n if (_registered) {\n throw new Error('TelegramWorker must be created only once')\n }\n\n _registered = true\n\n const port = parentPort\n\n const respond: RespondFn = port.postMessage.bind(port)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n parentPort.on('message', (message) => handler(message, respond))\n\n return respond\n }\n}\n\nexport class TelegramWorkerPort<T extends WorkerCustomMethods> extends TelegramWorkerPortBase<T> {\n constructor(readonly options: TelegramWorkerPortOptions) {\n setPlatform(new NodePlatform())\n super(options)\n }\n\n connectToWorker(worker: SomeWorker, handler: ClientMessageHandler): [SendFn, () => void] {\n if (!(worker instanceof Worker)) {\n throw new Error('Only worker_threads are supported')\n }\n\n const send: SendFn = worker.postMessage.bind(worker)\n\n worker.on('message', handler)\n\n return [\n send,\n () => {\n worker.off('message', handler)\n },\n ]\n }\n}\n"]}
package/package.json CHANGED
@@ -1,19 +1,13 @@
1
1
  {
2
2
  "name": "@mtcute/node",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Meta-package for Node JS",
5
5
  "author": "Alina Sireneva <alina@tei.su>",
6
6
  "license": "MIT",
7
7
  "main": "cjs/index.js",
8
8
  "type": "module",
9
+ "sideEffects": false,
9
10
  "scripts": {},
10
- "dependencies": {
11
- "@mtcute/client": "^0.6.0",
12
- "@mtcute/sqlite": "^0.6.0",
13
- "@mtcute/markdown-parser": "^0.6.0",
14
- "@mtcute/html-parser": "^0.6.0"
15
- },
16
- "module": "esm/index.js",
17
11
  "exports": {
18
12
  ".": {
19
13
  "import": "./esm/index.js",
@@ -23,5 +17,13 @@
23
17
  "import": "./esm/utils.js",
24
18
  "require": "./cjs/utils.js"
25
19
  }
26
- }
20
+ },
21
+ "dependencies": {
22
+ "@mtcute/core": "^0.8.0",
23
+ "@mtcute/wasm": "^0.8.0",
24
+ "@mtcute/sqlite": "^0.8.0",
25
+ "@mtcute/markdown-parser": "^0.8.0",
26
+ "@mtcute/html-parser": "^0.8.0"
27
+ },
28
+ "module": "esm/index.js"
27
29
  }