@mtcute/core 0.22.2 → 0.23.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 (105) hide show
  1. package/client.cjs +1 -1
  2. package/client.js +1 -1
  3. package/highlevel/base.cjs +1 -0
  4. package/highlevel/base.js +1 -0
  5. package/highlevel/client.d.cts +7 -3
  6. package/highlevel/client.d.ts +7 -3
  7. package/highlevel/methods/auth/send-code.cjs +8 -2
  8. package/highlevel/methods/auth/send-code.d.cts +4 -2
  9. package/highlevel/methods/auth/send-code.d.ts +4 -2
  10. package/highlevel/methods/auth/send-code.js +8 -2
  11. package/highlevel/methods/auth/start.cjs +6 -1
  12. package/highlevel/methods/auth/start.d.cts +1 -1
  13. package/highlevel/methods/auth/start.d.ts +1 -1
  14. package/highlevel/methods/auth/start.js +6 -1
  15. package/highlevel/methods/chats/open-chat.cjs +1 -1
  16. package/highlevel/methods/chats/open-chat.js +1 -1
  17. package/highlevel/methods/dialogs/find-dialogs.cjs +3 -1
  18. package/highlevel/methods/dialogs/find-dialogs.js +3 -1
  19. package/highlevel/methods/dialogs/get-peer-dialogs.cjs +49 -11
  20. package/highlevel/methods/dialogs/get-peer-dialogs.d.cts +1 -1
  21. package/highlevel/methods/dialogs/get-peer-dialogs.d.ts +1 -1
  22. package/highlevel/methods/dialogs/get-peer-dialogs.js +49 -11
  23. package/highlevel/methods/files/normalize-input-file.d.cts +1 -0
  24. package/highlevel/methods/files/normalize-input-file.d.ts +1 -0
  25. package/highlevel/methods/files/normalize-input-media.cjs +13 -6
  26. package/highlevel/methods/files/normalize-input-media.d.cts +1 -0
  27. package/highlevel/methods/files/normalize-input-media.d.ts +1 -0
  28. package/highlevel/methods/files/normalize-input-media.js +13 -6
  29. package/highlevel/methods/files/upload-file.cjs +6 -3
  30. package/highlevel/methods/files/upload-file.d.cts +1 -0
  31. package/highlevel/methods/files/upload-file.d.ts +1 -0
  32. package/highlevel/methods/files/upload-file.js +6 -3
  33. package/highlevel/methods/messages/send-common.d.cts +1 -0
  34. package/highlevel/methods/messages/send-common.d.ts +1 -0
  35. package/highlevel/methods/messages/send-media-group.cjs +3 -2
  36. package/highlevel/methods/messages/send-media-group.js +3 -2
  37. package/highlevel/methods/messages/send-media.cjs +3 -2
  38. package/highlevel/methods/messages/send-media.js +3 -2
  39. package/highlevel/methods/messages/send-text.cjs +1 -1
  40. package/highlevel/methods/messages/send-text.js +1 -1
  41. package/highlevel/methods/users/resolve-peer-many.cjs +8 -43
  42. package/highlevel/methods/users/resolve-peer-many.js +9 -44
  43. package/highlevel/storage/service/peers.cjs +37 -9
  44. package/highlevel/storage/service/peers.d.cts +4 -0
  45. package/highlevel/storage/service/peers.d.ts +4 -0
  46. package/highlevel/storage/service/peers.js +38 -10
  47. package/highlevel/storage/storage.cjs +3 -0
  48. package/highlevel/storage/storage.d.cts +1 -0
  49. package/highlevel/storage/storage.d.ts +1 -0
  50. package/highlevel/storage/storage.js +3 -0
  51. package/highlevel/types/conversation.cjs +3 -4
  52. package/highlevel/types/conversation.js +3 -4
  53. package/highlevel/types/messages/message-action.cjs +11 -0
  54. package/highlevel/types/messages/message-action.d.cts +15 -1
  55. package/highlevel/types/messages/message-action.d.ts +15 -1
  56. package/highlevel/types/messages/message-action.js +11 -0
  57. package/highlevel/types/peers/full-user.cjs +8 -0
  58. package/highlevel/types/peers/full-user.d.cts +4 -0
  59. package/highlevel/types/peers/full-user.d.ts +4 -0
  60. package/highlevel/types/peers/full-user.js +8 -0
  61. package/highlevel/types/peers/peers-index.cjs +10 -0
  62. package/highlevel/types/peers/peers-index.d.cts +1 -0
  63. package/highlevel/types/peers/peers-index.d.ts +1 -0
  64. package/highlevel/types/peers/peers-index.js +10 -0
  65. package/highlevel/types/premium/business-connection.cjs +3 -3
  66. package/highlevel/types/premium/business-connection.d.cts +2 -2
  67. package/highlevel/types/premium/business-connection.d.ts +2 -2
  68. package/highlevel/types/premium/business-connection.js +3 -3
  69. package/highlevel/types/premium/saved-star-gift.cjs +2 -2
  70. package/highlevel/types/premium/saved-star-gift.d.cts +2 -2
  71. package/highlevel/types/premium/saved-star-gift.d.ts +2 -2
  72. package/highlevel/types/premium/saved-star-gift.js +2 -2
  73. package/highlevel/types/premium/stars-gift-unique.cjs +11 -1
  74. package/highlevel/types/premium/stars-gift-unique.d.cts +7 -1
  75. package/highlevel/types/premium/stars-gift-unique.d.ts +7 -1
  76. package/highlevel/types/premium/stars-gift-unique.js +11 -1
  77. package/highlevel/types/premium/stars-transaction.cjs +4 -0
  78. package/highlevel/types/premium/stars-transaction.d.cts +2 -0
  79. package/highlevel/types/premium/stars-transaction.d.ts +2 -0
  80. package/highlevel/types/premium/stars-transaction.js +4 -0
  81. package/highlevel/worker/storage.cjs +4 -0
  82. package/highlevel/worker/storage.d.cts +2 -0
  83. package/highlevel/worker/storage.d.ts +2 -0
  84. package/highlevel/worker/storage.js +4 -0
  85. package/index.cjs +8 -0
  86. package/index.js +8 -0
  87. package/network/middlewares/flood-waiter.cjs +18 -2
  88. package/network/middlewares/flood-waiter.d.cts +9 -2
  89. package/network/middlewares/flood-waiter.d.ts +9 -2
  90. package/network/middlewares/flood-waiter.js +18 -2
  91. package/network/network-manager.cjs +1 -1
  92. package/network/network-manager.d.cts +1 -1
  93. package/network/network-manager.d.ts +1 -1
  94. package/network/network-manager.js +1 -1
  95. package/network/session-connection.cjs +3 -1
  96. package/network/session-connection.js +3 -1
  97. package/package.json +7 -7
  98. package/storage/memory/index.cjs +4 -0
  99. package/storage/memory/index.d.cts +4 -0
  100. package/storage/memory/index.d.ts +4 -0
  101. package/storage/memory/index.js +4 -0
  102. package/utils/binary/compat.cjs +2 -0
  103. package/utils/binary/compat.js +2 -0
  104. package/utils/early-timer.cjs +7 -2
  105. package/utils/early-timer.js +7 -2
@@ -8,8 +8,22 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
8
  const abortSignal = require("../../utils/abort-signal.cjs");
9
9
  const miscUtils = require("../../utils/misc-utils.cjs");
10
10
  const typeAssertions = require("../../utils/type-assertions.cjs");
11
+ const SILENTLY_SLEEP_METHODS = /* @__PURE__ */ new Set([
12
+ "upload.getFile",
13
+ "upload.saveFilePart",
14
+ "upload.saveBigFilePart",
15
+ "updates.getDifference",
16
+ "updates.getChannelDifference"
17
+ ]);
18
+ const SILENTLY_SLEEP_THRESHOLD = 5;
11
19
  function floodWaiter(options) {
12
- const { maxWait = 1e4, maxRetries = 5, store = true, minStoredWait = 3e3 } = options;
20
+ const {
21
+ maxWait = 1e4,
22
+ maxRetries = 5,
23
+ store = true,
24
+ minStoredWait = 2e3,
25
+ onBeforeWait
26
+ } = options;
13
27
  const storage = /* @__PURE__ */ new Map();
14
28
  return async (ctx, next) => {
15
29
  const method = ctx.request._;
@@ -52,7 +66,9 @@ function floodWaiter(options) {
52
66
  }
53
67
  const ms = seconds * 1e3;
54
68
  if (ms <= floodSleepThreshold) {
55
- if (ctx.request._ !== "upload.getFile") {
69
+ if (onBeforeWait) {
70
+ onBeforeWait(ctx, seconds);
71
+ } else if (!(seconds < SILENTLY_SLEEP_THRESHOLD && SILENTLY_SLEEP_METHODS.has(method))) {
56
72
  ctx.manager._log.warn("%s resulted in a flood wait, will retry in %d seconds", method, seconds);
57
73
  }
58
74
  await miscUtils.sleepWithAbort(
@@ -1,4 +1,4 @@
1
- import { RpcCallMiddleware } from '../network-manager.js';
1
+ import { RpcCallMiddleware, RpcCallMiddlewareContext } from '../network-manager.js';
2
2
  export interface FloodWaiterOptions {
3
3
  /**
4
4
  * Maximum number of ms to wait when a FLOOD_WAIT_X
@@ -30,8 +30,15 @@ export interface FloodWaiterOptions {
30
30
  * If the stored wait time is less than this value,
31
31
  * the request will not be delayed
32
32
  *
33
- * @default 3_000
33
+ * @default 2_000
34
34
  */
35
35
  minStoredWait?: number;
36
+ /**
37
+ * Function that will be called before we are about to wait for `seconds`
38
+ * seconds before retrying the request.
39
+ *
40
+ * @default print a warning to the console, except some methods that often result in flood waits
41
+ */
42
+ onBeforeWait?: (ctx: RpcCallMiddlewareContext, seconds: number) => void;
36
43
  }
37
44
  export declare function floodWaiter(options: FloodWaiterOptions): RpcCallMiddleware;
@@ -1,4 +1,4 @@
1
- import { RpcCallMiddleware } from '../network-manager.js';
1
+ import { RpcCallMiddleware, RpcCallMiddlewareContext } from '../network-manager.js';
2
2
  export interface FloodWaiterOptions {
3
3
  /**
4
4
  * Maximum number of ms to wait when a FLOOD_WAIT_X
@@ -30,8 +30,15 @@ export interface FloodWaiterOptions {
30
30
  * If the stored wait time is less than this value,
31
31
  * the request will not be delayed
32
32
  *
33
- * @default 3_000
33
+ * @default 2_000
34
34
  */
35
35
  minStoredWait?: number;
36
+ /**
37
+ * Function that will be called before we are about to wait for `seconds`
38
+ * seconds before retrying the request.
39
+ *
40
+ * @default print a warning to the console, except some methods that often result in flood waits
41
+ */
42
+ onBeforeWait?: (ctx: RpcCallMiddlewareContext, seconds: number) => void;
36
43
  }
37
44
  export declare function floodWaiter(options: FloodWaiterOptions): RpcCallMiddleware;
@@ -1,8 +1,22 @@
1
1
  import { combineAbortSignals } from "../../utils/abort-signal.js";
2
2
  import { sleepWithAbort } from "../../utils/misc-utils.js";
3
3
  import { isTlRpcError } from "../../utils/type-assertions.js";
4
+ const SILENTLY_SLEEP_METHODS = /* @__PURE__ */ new Set([
5
+ "upload.getFile",
6
+ "upload.saveFilePart",
7
+ "upload.saveBigFilePart",
8
+ "updates.getDifference",
9
+ "updates.getChannelDifference"
10
+ ]);
11
+ const SILENTLY_SLEEP_THRESHOLD = 5;
4
12
  function floodWaiter(options) {
5
- const { maxWait = 1e4, maxRetries = 5, store = true, minStoredWait = 3e3 } = options;
13
+ const {
14
+ maxWait = 1e4,
15
+ maxRetries = 5,
16
+ store = true,
17
+ minStoredWait = 2e3,
18
+ onBeforeWait
19
+ } = options;
6
20
  const storage = /* @__PURE__ */ new Map();
7
21
  return async (ctx, next) => {
8
22
  const method = ctx.request._;
@@ -45,7 +59,9 @@ function floodWaiter(options) {
45
59
  }
46
60
  const ms = seconds * 1e3;
47
61
  if (ms <= floodSleepThreshold) {
48
- if (ctx.request._ !== "upload.getFile") {
62
+ if (onBeforeWait) {
63
+ onBeforeWait(ctx, seconds);
64
+ } else if (!(seconds < SILENTLY_SLEEP_THRESHOLD && SILENTLY_SLEEP_METHODS.has(method))) {
49
65
  ctx.manager._log.warn("%s resulted in a flood wait, will retry in %d seconds", method, seconds);
50
66
  }
51
67
  await sleepWithAbort(
@@ -220,7 +220,7 @@ class NetworkManager {
220
220
  _: "initConnection",
221
221
  deviceModel,
222
222
  systemVersion: "1.0",
223
- appVersion: "0.22.2",
223
+ appVersion: "0.23.0",
224
224
  systemLangCode: "en",
225
225
  langPack: "",
226
226
  // "langPacks are for official apps only"
@@ -32,7 +32,7 @@ export interface NetworkManagerParams {
32
32
  writerMap: TlWriterMap;
33
33
  isPremium: boolean;
34
34
  emitError: (err: Error) => void;
35
- onUpdate: (upd: tl.TypeUpdates) => void;
35
+ onUpdate: (upd: tl.TypeUpdates, fromClient: boolean) => void;
36
36
  onUsable: () => void;
37
37
  onConnecting: () => void;
38
38
  onNetworkChanged: (connected: boolean) => void;
@@ -32,7 +32,7 @@ export interface NetworkManagerParams {
32
32
  writerMap: TlWriterMap;
33
33
  isPremium: boolean;
34
34
  emitError: (err: Error) => void;
35
- onUpdate: (upd: tl.TypeUpdates) => void;
35
+ onUpdate: (upd: tl.TypeUpdates, fromClient: boolean) => void;
36
36
  onUsable: () => void;
37
37
  onConnecting: () => void;
38
38
  onNetworkChanged: (connected: boolean) => void;
@@ -213,7 +213,7 @@ class NetworkManager {
213
213
  _: "initConnection",
214
214
  deviceModel,
215
215
  systemVersion: "1.0",
216
- appVersion: "0.22.2",
216
+ appVersion: "0.23.0",
217
217
  systemLangCode: "en",
218
218
  langPack: "",
219
219
  // "langPacks are for official apps only"
@@ -1151,7 +1151,9 @@ class SessionConnection extends persistentConnection.PersistentConnection {
1151
1151
  if (now - this._session.lastPingTime > this._pingInterval) {
1152
1152
  if (!this._session.lastPingMsgId.isZero()) {
1153
1153
  this.log.warn("didn't receive pong for previous ping (msg_id = %l). are we offline?", this._session.lastPingMsgId);
1154
- this._resetSession("ping timeout");
1154
+ if (!this._disconnectedManually) {
1155
+ this._resetSession("ping timeout");
1156
+ }
1155
1157
  return;
1156
1158
  }
1157
1159
  pingId = longUtils.randomLong();
@@ -1144,7 +1144,9 @@ class SessionConnection extends PersistentConnection {
1144
1144
  if (now - this._session.lastPingTime > this._pingInterval) {
1145
1145
  if (!this._session.lastPingMsgId.isZero()) {
1146
1146
  this.log.warn("didn't receive pong for previous ping (msg_id = %l). are we offline?", this._session.lastPingMsgId);
1147
- this._resetSession("ping timeout");
1147
+ if (!this._disconnectedManually) {
1148
+ this._resetSession("ping timeout");
1149
+ }
1148
1150
  return;
1149
1151
  }
1150
1152
  pingId = randomLong();
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@mtcute/core",
3
3
  "type": "module",
4
- "version": "0.22.2",
4
+ "version": "0.23.0",
5
5
  "description": "Type-safe library for MTProto (Telegram API)",
6
6
  "license": "MIT",
7
7
  "scripts": {},
8
8
  "dependencies": {
9
- "@fuman/io": "0.0.8",
10
- "@fuman/net": "0.0.9",
11
- "@fuman/utils": "0.0.4",
12
- "@mtcute/file-id": "^0.22.0",
13
- "@mtcute/tl": "^200.0.0",
14
- "@mtcute/tl-runtime": "^0.22.0",
9
+ "@fuman/io": "0.0.14",
10
+ "@fuman/net": "0.0.14",
11
+ "@fuman/utils": "0.0.14",
12
+ "@mtcute/file-id": "^0.23.0",
13
+ "@mtcute/tl": "^201.0.0",
14
+ "@mtcute/tl-runtime": "^0.23.0",
15
15
  "@types/events": "3.0.0",
16
16
  "long": "5.2.3"
17
17
  },
@@ -18,4 +18,8 @@ class MemoryStorage {
18
18
  refMessages = new refMessages.MemoryRefMessagesRepository(this.driver);
19
19
  }
20
20
  exports.MemoryStorageDriver = driver.MemoryStorageDriver;
21
+ exports.MemoryAuthKeysRepository = authKeys.MemoryAuthKeysRepository;
22
+ exports.MemoryKeyValueRepository = kv.MemoryKeyValueRepository;
23
+ exports.MemoryPeersRepository = peers.MemoryPeersRepository;
24
+ exports.MemoryRefMessagesRepository = refMessages.MemoryRefMessagesRepository;
21
25
  exports.MemoryStorage = MemoryStorage;
@@ -6,6 +6,10 @@ import { MemoryKeyValueRepository } from './repository/kv.js';
6
6
  import { MemoryPeersRepository } from './repository/peers.js';
7
7
  import { MemoryRefMessagesRepository } from './repository/ref-messages.js';
8
8
  export { MemoryStorageDriver } from './driver.js';
9
+ export { MemoryAuthKeysRepository } from './repository/auth-keys.js';
10
+ export { MemoryKeyValueRepository } from './repository/kv.js';
11
+ export { MemoryPeersRepository } from './repository/peers.js';
12
+ export { MemoryRefMessagesRepository } from './repository/ref-messages.js';
9
13
  /**
10
14
  * In-memory storage driver implementation for mtcute.
11
15
  *
@@ -6,6 +6,10 @@ import { MemoryKeyValueRepository } from './repository/kv.js';
6
6
  import { MemoryPeersRepository } from './repository/peers.js';
7
7
  import { MemoryRefMessagesRepository } from './repository/ref-messages.js';
8
8
  export { MemoryStorageDriver } from './driver.js';
9
+ export { MemoryAuthKeysRepository } from './repository/auth-keys.js';
10
+ export { MemoryKeyValueRepository } from './repository/kv.js';
11
+ export { MemoryPeersRepository } from './repository/peers.js';
12
+ export { MemoryRefMessagesRepository } from './repository/ref-messages.js';
9
13
  /**
10
14
  * In-memory storage driver implementation for mtcute.
11
15
  *
@@ -11,6 +11,10 @@ class MemoryStorage {
11
11
  refMessages = new MemoryRefMessagesRepository(this.driver);
12
12
  }
13
13
  export {
14
+ MemoryAuthKeysRepository,
15
+ MemoryKeyValueRepository,
16
+ MemoryPeersRepository,
17
+ MemoryRefMessagesRepository,
14
18
  MemoryStorage,
15
19
  MemoryStorageDriver
16
20
  };
@@ -89,6 +89,8 @@ function mapCompatObject(obj) {
89
89
  return mapCompatMessageAction(obj);
90
90
  case "userFull_layer199":
91
91
  return replaceType(dropFields(obj, ["premiumGifts"]), "userFull");
92
+ case "userFull_layer200":
93
+ return replaceType(obj, "userFull");
92
94
  case "user_layer199":
93
95
  return {
94
96
  ...obj,
@@ -82,6 +82,8 @@ function mapCompatObject(obj) {
82
82
  return mapCompatMessageAction(obj);
83
83
  case "userFull_layer199":
84
84
  return replaceType(dropFields(obj, ["premiumGifts"]), "userFull");
85
+ case "userFull_layer200":
86
+ return replaceType(obj, "userFull");
85
87
  case "user_layer199":
86
88
  return {
87
89
  ...obj,
@@ -45,8 +45,13 @@ class EarlyTimer {
45
45
  emitBefore(ts) {
46
46
  if (!this._timeoutTs || ts < this._timeoutTs) {
47
47
  this.reset();
48
- this._timeout = utils.timers.setTimeout(this.emitNow, ts - Date.now());
49
- this._timeoutTs = ts;
48
+ const diff = ts - Date.now();
49
+ if (diff > 0) {
50
+ this._timeout = utils.timers.setTimeout(this.emitNow, diff);
51
+ this._timeoutTs = ts;
52
+ } else {
53
+ this._handler();
54
+ }
50
55
  }
51
56
  }
52
57
  /**
@@ -38,8 +38,13 @@ class EarlyTimer {
38
38
  emitBefore(ts) {
39
39
  if (!this._timeoutTs || ts < this._timeoutTs) {
40
40
  this.reset();
41
- this._timeout = timers.setTimeout(this.emitNow, ts - Date.now());
42
- this._timeoutTs = ts;
41
+ const diff = ts - Date.now();
42
+ if (diff > 0) {
43
+ this._timeout = timers.setTimeout(this.emitNow, diff);
44
+ this._timeoutTs = ts;
45
+ } else {
46
+ this._handler();
47
+ }
43
48
  }
44
49
  }
45
50
  /**