@mtcute/core 0.30.0 → 0.30.2

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 (148) hide show
  1. package/client.cjs +8 -0
  2. package/client.js +8 -0
  3. package/highlevel/client.d.cts +63 -1
  4. package/highlevel/client.d.ts +63 -1
  5. package/highlevel/methods/files/download-iterable.cjs +80 -45
  6. package/highlevel/methods/files/download-iterable.js +80 -45
  7. package/highlevel/methods/files/normalize-input-media.cjs +9 -1
  8. package/highlevel/methods/files/normalize-input-media.js +10 -2
  9. package/highlevel/methods/files/upload-file.cjs +6 -1
  10. package/highlevel/methods/files/upload-file.js +6 -1
  11. package/highlevel/methods/messages/create-rich-streaming-draft.cjs +39 -0
  12. package/highlevel/methods/messages/create-rich-streaming-draft.d.cts +42 -0
  13. package/highlevel/methods/messages/create-rich-streaming-draft.d.ts +42 -0
  14. package/highlevel/methods/messages/create-rich-streaming-draft.js +34 -0
  15. package/highlevel/methods/messages/normalize-rich-message.cjs +168 -0
  16. package/highlevel/methods/messages/normalize-rich-message.d.cts +10 -0
  17. package/highlevel/methods/messages/normalize-rich-message.d.ts +10 -0
  18. package/highlevel/methods/messages/normalize-rich-message.js +163 -0
  19. package/highlevel/methods/messages/send-common.cjs +3 -2
  20. package/highlevel/methods/messages/send-common.d.cts +4 -1
  21. package/highlevel/methods/messages/send-common.d.ts +4 -1
  22. package/highlevel/methods/messages/send-common.js +3 -2
  23. package/highlevel/methods/messages/send-rich-message.cjs +49 -0
  24. package/highlevel/methods/messages/send-rich-message.d.cts +38 -0
  25. package/highlevel/methods/messages/send-rich-message.d.ts +38 -0
  26. package/highlevel/methods/messages/send-rich-message.js +44 -0
  27. package/highlevel/methods.d.cts +3 -0
  28. package/highlevel/methods.d.ts +3 -0
  29. package/highlevel/types/bots/inline-message/factories.cjs +14 -0
  30. package/highlevel/types/bots/inline-message/factories.d.cts +9 -1
  31. package/highlevel/types/bots/inline-message/factories.d.ts +9 -1
  32. package/highlevel/types/bots/inline-message/factories.js +14 -0
  33. package/highlevel/types/bots/inline-message/types.d.cts +17 -1
  34. package/highlevel/types/bots/inline-message/types.d.ts +17 -1
  35. package/highlevel/types/files/utils.d.cts +9 -0
  36. package/highlevel/types/files/utils.d.ts +9 -0
  37. package/highlevel/types/media/input-media/types.d.cts +1 -1
  38. package/highlevel/types/media/input-media/types.d.ts +1 -1
  39. package/highlevel/types/messages/index.d.cts +1 -1
  40. package/highlevel/types/messages/index.d.ts +1 -1
  41. package/highlevel/types/messages/message.cjs +1 -1
  42. package/highlevel/types/messages/message.d.cts +1 -1
  43. package/highlevel/types/messages/message.d.ts +1 -1
  44. package/highlevel/types/messages/message.js +1 -1
  45. package/highlevel/types/messages/rich/index.d.cts +4 -0
  46. package/highlevel/types/messages/rich/index.d.ts +4 -0
  47. package/highlevel/types/messages/rich/inner.cjs +219 -0
  48. package/highlevel/types/messages/rich/inner.d.cts +127 -0
  49. package/highlevel/types/messages/rich/inner.d.ts +127 -0
  50. package/highlevel/types/messages/rich/inner.js +214 -0
  51. package/highlevel/types/messages/{rich-message.cjs → rich/rich-message.cjs} +6 -6
  52. package/highlevel/types/messages/{rich-message.d.cts → rich/rich-message.d.cts} +5 -5
  53. package/highlevel/types/messages/{rich-message.d.ts → rich/rich-message.d.ts} +5 -5
  54. package/highlevel/types/messages/{rich-message.js → rich/rich-message.js} +6 -6
  55. package/highlevel/types/messages/rich/types.d.cts +76 -0
  56. package/highlevel/types/messages/rich/types.d.ts +76 -0
  57. package/highlevel/updates/manager.cjs +10 -169
  58. package/highlevel/updates/manager.js +10 -169
  59. package/highlevel/utils/entities.cjs +176 -0
  60. package/highlevel/utils/entities.d.cts +18 -0
  61. package/highlevel/utils/entities.d.ts +18 -0
  62. package/highlevel/utils/entities.js +177 -1
  63. package/highlevel/utils/index.d.cts +1 -0
  64. package/highlevel/utils/index.d.ts +1 -0
  65. package/highlevel/utils/walk-page-blocks.cjs +164 -0
  66. package/highlevel/utils/walk-page-blocks.d.cts +9 -0
  67. package/highlevel/utils/walk-page-blocks.d.ts +9 -0
  68. package/highlevel/utils/walk-page-blocks.js +159 -0
  69. package/index.cjs +3 -1
  70. package/index.js +3 -1
  71. package/methods.cjs +4 -0
  72. package/methods.js +4 -0
  73. package/network/authorization.cjs +1 -1
  74. package/network/authorization.js +1 -1
  75. package/network/delay-gate.cjs +29 -0
  76. package/network/delay-gate.d.cts +5 -0
  77. package/network/delay-gate.d.ts +5 -0
  78. package/network/delay-gate.js +24 -0
  79. package/network/delay-gate.test.d.cts +1 -0
  80. package/network/delay-gate.test.d.ts +1 -0
  81. package/network/message-id-store.cjs +30 -0
  82. package/network/message-id-store.d.cts +7 -0
  83. package/network/message-id-store.d.ts +7 -0
  84. package/network/message-id-store.js +25 -0
  85. package/network/message-id-store.test.d.cts +1 -0
  86. package/network/message-id-store.test.d.ts +1 -0
  87. package/network/middlewares/bundle.cjs +2 -0
  88. package/network/middlewares/bundle.d.cts +1 -0
  89. package/network/middlewares/bundle.d.ts +1 -0
  90. package/network/middlewares/bundle.js +2 -0
  91. package/network/middlewares/default.cjs +6 -1
  92. package/network/middlewares/default.js +6 -1
  93. package/network/middlewares/flood-waiter.test.d.cts +1 -0
  94. package/network/middlewares/flood-waiter.test.d.ts +1 -0
  95. package/network/middlewares/internal-errors.test.d.cts +1 -0
  96. package/network/middlewares/internal-errors.test.d.ts +1 -0
  97. package/network/middlewares/media-throttle.cjs +65 -0
  98. package/network/middlewares/media-throttle.d.cts +5 -0
  99. package/network/middlewares/media-throttle.d.ts +5 -0
  100. package/network/middlewares/media-throttle.js +60 -0
  101. package/network/middlewares/media-throttle.test.d.cts +1 -0
  102. package/network/middlewares/media-throttle.test.d.ts +1 -0
  103. package/network/middlewares/on-error.test.d.cts +1 -0
  104. package/network/middlewares/on-error.test.d.ts +1 -0
  105. package/network/middlewares/on-method.test.d.cts +1 -0
  106. package/network/middlewares/on-method.test.d.ts +1 -0
  107. package/network/mtproto-session.cjs +9 -2
  108. package/network/mtproto-session.d.cts +5 -2
  109. package/network/mtproto-session.d.ts +5 -2
  110. package/network/mtproto-session.js +9 -2
  111. package/network/mtproxy/_fake-tls.cjs +169 -107
  112. package/network/mtproxy/_fake-tls.js +169 -107
  113. package/network/mtproxy/_fake-tls.test.d.cts +1 -0
  114. package/network/mtproxy/_fake-tls.test.d.ts +1 -0
  115. package/network/multi-session-connection.cjs +7 -0
  116. package/network/multi-session-connection.d.cts +2 -0
  117. package/network/multi-session-connection.d.ts +2 -0
  118. package/network/multi-session-connection.js +7 -0
  119. package/network/network-manager.cjs +7 -1
  120. package/network/network-manager.js +7 -1
  121. package/network/resource-limiter.cjs +60 -0
  122. package/network/resource-limiter.d.cts +11 -0
  123. package/network/resource-limiter.d.ts +11 -0
  124. package/network/resource-limiter.js +55 -0
  125. package/network/resource-limiter.test.d.cts +1 -0
  126. package/network/resource-limiter.test.d.ts +1 -0
  127. package/network/server-salt.cjs +7 -3
  128. package/network/server-salt.d.cts +2 -0
  129. package/network/server-salt.d.ts +2 -0
  130. package/network/server-salt.js +7 -3
  131. package/network/session-connection.cjs +106 -20
  132. package/network/session-connection.d.cts +11 -0
  133. package/network/session-connection.d.ts +11 -0
  134. package/network/session-connection.js +106 -20
  135. package/package.json +1 -1
  136. package/tl/api-schema.json +1 -1
  137. package/tl/binary/reader.cjs +115 -109
  138. package/tl/binary/reader.js +115 -109
  139. package/tl/binary/writer.cjs +243 -245
  140. package/tl/binary/writer.js +243 -245
  141. package/tl/index.d.cts +227 -216
  142. package/tl/index.d.ts +227 -216
  143. package/tl/inner-tl.cjs +3 -1
  144. package/tl/inner-tl.js +3 -1
  145. package/types/utils.d.cts +4 -0
  146. package/types/utils.d.ts +4 -0
  147. package/utils.cjs +4 -0
  148. package/utils.js +5 -1
@@ -5,6 +5,8 @@ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WAR
5
5
  }
6
6
  "use strict";
7
7
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const Long = require("long");
9
+ const peerUtils = require("../../utils/peer-utils.cjs");
8
10
  function joinTextWithEntities(parts, delim = "") {
9
11
  const textParts = [];
10
12
  const newEntities = [];
@@ -36,4 +38,178 @@ function joinTextWithEntities(parts, delim = "") {
36
38
  entities: newEntities
37
39
  };
38
40
  }
41
+ function _entityToRichTextWrapper(entity, text) {
42
+ const covered = () => text.slice(entity.offset, entity.offset + entity.length);
43
+ switch (entity._) {
44
+ case "messageEntityBold":
45
+ return (inner) => ({ _: "textBold", text: inner });
46
+ case "messageEntityItalic":
47
+ return (inner) => ({ _: "textItalic", text: inner });
48
+ case "messageEntityUnderline":
49
+ return (inner) => ({ _: "textUnderline", text: inner });
50
+ case "messageEntityStrike":
51
+ return (inner) => ({ _: "textStrike", text: inner });
52
+ case "messageEntityCode":
53
+ case "messageEntityPre":
54
+ return (inner) => ({ _: "textFixed", text: inner });
55
+ case "messageEntitySpoiler":
56
+ return (inner) => ({ _: "textSpoiler", text: inner });
57
+ case "messageEntityMention":
58
+ return (inner) => ({ _: "textMention", text: inner });
59
+ case "messageEntityHashtag":
60
+ return (inner) => ({ _: "textHashtag", text: inner });
61
+ case "messageEntityCashtag":
62
+ return (inner) => ({ _: "textCashtag", text: inner });
63
+ case "messageEntityBotCommand":
64
+ return (inner) => ({ _: "textBotCommand", text: inner });
65
+ case "messageEntityBankCard":
66
+ return (inner) => ({ _: "textBankCard", text: inner });
67
+ case "messageEntityUrl":
68
+ return (inner) => ({ _: "textUrl", text: inner, url: covered(), webpageId: Long.ZERO });
69
+ case "messageEntityTextUrl":
70
+ return (inner) => ({ _: "textUrl", text: inner, url: entity.url, webpageId: Long.ZERO });
71
+ case "messageEntityEmail":
72
+ return (inner) => ({ _: "textEmail", text: inner, email: covered() });
73
+ case "messageEntityPhone":
74
+ return (inner) => ({ _: "textPhone", text: inner, phone: covered() });
75
+ case "messageEntityMentionName":
76
+ return (inner) => ({ _: "textMentionName", text: inner, userId: entity.userId });
77
+ case "inputMessageEntityMentionName":
78
+ return (inner) => ({ _: "textMentionName", text: inner, userId: peerUtils.getMarkedPeerId(entity.userId) });
79
+ case "messageEntityCustomEmoji":
80
+ return () => ({ _: "textCustomEmoji", documentId: entity.documentId, alt: covered() });
81
+ case "messageEntityFormattedDate":
82
+ return (inner) => ({
83
+ _: "textDate",
84
+ text: inner,
85
+ date: entity.date,
86
+ relative: entity.relative,
87
+ shortTime: entity.shortTime,
88
+ longTime: entity.longTime,
89
+ shortDate: entity.shortDate,
90
+ longDate: entity.longDate,
91
+ dayOfWeek: entity.dayOfWeek
92
+ });
93
+ default:
94
+ return null;
95
+ }
96
+ }
97
+ function textWithEntitiesToRichText(input) {
98
+ const { text, entities } = input;
99
+ if (!text) return { _: "textEmpty" };
100
+ if (!entities?.length) return { _: "textPlain", text };
101
+ const bounds = /* @__PURE__ */ new Set([0, text.length]);
102
+ for (const e of entities) {
103
+ bounds.add(e.offset);
104
+ bounds.add(e.offset + e.length);
105
+ }
106
+ const sorted = [...bounds].filter((b) => b >= 0 && b <= text.length).sort((a, b) => a - b);
107
+ const segments = [];
108
+ for (let i = 0; i < sorted.length - 1; i++) {
109
+ const start = sorted[i];
110
+ const end = sorted[i + 1];
111
+ if (start === end) continue;
112
+ let node = { _: "textPlain", text: text.slice(start, end) };
113
+ const active = entities.filter((e) => e.offset <= start && e.offset + e.length >= end).sort((a, b) => a.length - b.length);
114
+ for (const e of active) {
115
+ const wrap = _entityToRichTextWrapper(e, text);
116
+ if (wrap) node = wrap(node);
117
+ }
118
+ segments.push(node);
119
+ }
120
+ if (segments.length === 0) return { _: "textEmpty" };
121
+ if (segments.length === 1) return segments[0];
122
+ return { _: "textConcat", texts: segments };
123
+ }
124
+ function _richTextNodeToEntity(node, offset, length) {
125
+ switch (node._) {
126
+ case "textBold":
127
+ return { _: "messageEntityBold", offset, length };
128
+ case "textItalic":
129
+ return { _: "messageEntityItalic", offset, length };
130
+ case "textUnderline":
131
+ return { _: "messageEntityUnderline", offset, length };
132
+ case "textStrike":
133
+ return { _: "messageEntityStrike", offset, length };
134
+ case "textFixed":
135
+ return { _: "messageEntityCode", offset, length };
136
+ case "textSpoiler":
137
+ return { _: "messageEntitySpoiler", offset, length };
138
+ case "textMention":
139
+ return { _: "messageEntityMention", offset, length };
140
+ case "textHashtag":
141
+ return { _: "messageEntityHashtag", offset, length };
142
+ case "textCashtag":
143
+ return { _: "messageEntityCashtag", offset, length };
144
+ case "textBotCommand":
145
+ return { _: "messageEntityBotCommand", offset, length };
146
+ case "textBankCard":
147
+ return { _: "messageEntityBankCard", offset, length };
148
+ case "textUrl":
149
+ return { _: "messageEntityTextUrl", offset, length, url: node.url };
150
+ case "textEmail":
151
+ return { _: "messageEntityEmail", offset, length };
152
+ case "textPhone":
153
+ return { _: "messageEntityPhone", offset, length };
154
+ case "textMentionName":
155
+ return { _: "messageEntityMentionName", offset, length, userId: node.userId };
156
+ case "textDate":
157
+ return {
158
+ _: "messageEntityFormattedDate",
159
+ offset,
160
+ length,
161
+ date: node.date,
162
+ relative: node.relative,
163
+ shortTime: node.shortTime,
164
+ longTime: node.longTime,
165
+ shortDate: node.shortDate,
166
+ longDate: node.longDate,
167
+ dayOfWeek: node.dayOfWeek
168
+ };
169
+ default:
170
+ return null;
171
+ }
172
+ }
173
+ function richTextToTextWithEntities(rich) {
174
+ const entities = [];
175
+ let text = "";
176
+ const walk = (node) => {
177
+ switch (node._) {
178
+ case "textEmpty":
179
+ return;
180
+ case "textPlain":
181
+ text += node.text;
182
+ return;
183
+ case "textConcat":
184
+ for (const t of node.texts) walk(t);
185
+ return;
186
+ case "textImage":
187
+ return;
188
+ case "textMath":
189
+ text += node.source;
190
+ return;
191
+ case "textCustomEmoji": {
192
+ const start = text.length;
193
+ text += node.alt;
194
+ entities.push({
195
+ _: "messageEntityCustomEmoji",
196
+ offset: start,
197
+ length: text.length - start,
198
+ documentId: node.documentId
199
+ });
200
+ return;
201
+ }
202
+ default: {
203
+ const start = text.length;
204
+ walk(node.text);
205
+ const entity = _richTextNodeToEntity(node, start, text.length - start);
206
+ if (entity) entities.push(entity);
207
+ }
208
+ }
209
+ };
210
+ walk(rich);
211
+ return { text, entities };
212
+ }
39
213
  exports.joinTextWithEntities = joinTextWithEntities;
214
+ exports.richTextToTextWithEntities = richTextToTextWithEntities;
215
+ exports.textWithEntitiesToRichText = textWithEntitiesToRichText;
@@ -1,3 +1,4 @@
1
+ import { tl } from '../../tl/index.js';
1
2
  import { TextWithEntities } from '../types/misc/entities.js';
2
3
  /**
3
4
  * Join multiple text parts with entities into a single text with entities,
@@ -17,3 +18,20 @@ import { TextWithEntities } from '../types/misc/entities.js';
17
18
  * ```
18
19
  */
19
20
  export declare function joinTextWithEntities(parts: (string | TextWithEntities)[], delim?: string | TextWithEntities): TextWithEntities;
21
+ /**
22
+ * Convert a {@link TextWithEntities} into a {@link tl.TypeRichText} tree
23
+ * (as used in page blocks / instant view).
24
+ *
25
+ * Overlapping entities are handled by splitting the text at every entity
26
+ * boundary and nesting the wrappers per-segment, so the result may be more
27
+ * fragmented than the input, but always renders identically.
28
+ */
29
+ export declare function textWithEntitiesToRichText(input: TextWithEntities): tl.TypeRichText;
30
+ /**
31
+ * Convert a {@link tl.TypeRichText} tree back into a {@link TextWithEntities}.
32
+ *
33
+ * This conversion is **lossy**: rich text nodes that have no message entity
34
+ * equivalent (e.g. `textMarked`, `textSubscript`, anchors, images) are dropped,
35
+ * keeping only their textual content.
36
+ */
37
+ export declare function richTextToTextWithEntities(rich: tl.TypeRichText): TextWithEntities;
@@ -1,3 +1,4 @@
1
+ import { tl } from '../../tl/index.js';
1
2
  import { TextWithEntities } from '../types/misc/entities.js';
2
3
  /**
3
4
  * Join multiple text parts with entities into a single text with entities,
@@ -17,3 +18,20 @@ import { TextWithEntities } from '../types/misc/entities.js';
17
18
  * ```
18
19
  */
19
20
  export declare function joinTextWithEntities(parts: (string | TextWithEntities)[], delim?: string | TextWithEntities): TextWithEntities;
21
+ /**
22
+ * Convert a {@link TextWithEntities} into a {@link tl.TypeRichText} tree
23
+ * (as used in page blocks / instant view).
24
+ *
25
+ * Overlapping entities are handled by splitting the text at every entity
26
+ * boundary and nesting the wrappers per-segment, so the result may be more
27
+ * fragmented than the input, but always renders identically.
28
+ */
29
+ export declare function textWithEntitiesToRichText(input: TextWithEntities): tl.TypeRichText;
30
+ /**
31
+ * Convert a {@link tl.TypeRichText} tree back into a {@link TextWithEntities}.
32
+ *
33
+ * This conversion is **lossy**: rich text nodes that have no message entity
34
+ * equivalent (e.g. `textMarked`, `textSubscript`, anchors, images) are dropped,
35
+ * keeping only their textual content.
36
+ */
37
+ export declare function richTextToTextWithEntities(rich: tl.TypeRichText): TextWithEntities;
@@ -1,3 +1,5 @@
1
+ import Long from "long";
2
+ import { getMarkedPeerId } from "../../utils/peer-utils.js";
1
3
  function joinTextWithEntities(parts, delim = "") {
2
4
  const textParts = [];
3
5
  const newEntities = [];
@@ -29,6 +31,180 @@ function joinTextWithEntities(parts, delim = "") {
29
31
  entities: newEntities
30
32
  };
31
33
  }
34
+ function _entityToRichTextWrapper(entity, text) {
35
+ const covered = () => text.slice(entity.offset, entity.offset + entity.length);
36
+ switch (entity._) {
37
+ case "messageEntityBold":
38
+ return (inner) => ({ _: "textBold", text: inner });
39
+ case "messageEntityItalic":
40
+ return (inner) => ({ _: "textItalic", text: inner });
41
+ case "messageEntityUnderline":
42
+ return (inner) => ({ _: "textUnderline", text: inner });
43
+ case "messageEntityStrike":
44
+ return (inner) => ({ _: "textStrike", text: inner });
45
+ case "messageEntityCode":
46
+ case "messageEntityPre":
47
+ return (inner) => ({ _: "textFixed", text: inner });
48
+ case "messageEntitySpoiler":
49
+ return (inner) => ({ _: "textSpoiler", text: inner });
50
+ case "messageEntityMention":
51
+ return (inner) => ({ _: "textMention", text: inner });
52
+ case "messageEntityHashtag":
53
+ return (inner) => ({ _: "textHashtag", text: inner });
54
+ case "messageEntityCashtag":
55
+ return (inner) => ({ _: "textCashtag", text: inner });
56
+ case "messageEntityBotCommand":
57
+ return (inner) => ({ _: "textBotCommand", text: inner });
58
+ case "messageEntityBankCard":
59
+ return (inner) => ({ _: "textBankCard", text: inner });
60
+ case "messageEntityUrl":
61
+ return (inner) => ({ _: "textUrl", text: inner, url: covered(), webpageId: Long.ZERO });
62
+ case "messageEntityTextUrl":
63
+ return (inner) => ({ _: "textUrl", text: inner, url: entity.url, webpageId: Long.ZERO });
64
+ case "messageEntityEmail":
65
+ return (inner) => ({ _: "textEmail", text: inner, email: covered() });
66
+ case "messageEntityPhone":
67
+ return (inner) => ({ _: "textPhone", text: inner, phone: covered() });
68
+ case "messageEntityMentionName":
69
+ return (inner) => ({ _: "textMentionName", text: inner, userId: entity.userId });
70
+ case "inputMessageEntityMentionName":
71
+ return (inner) => ({ _: "textMentionName", text: inner, userId: getMarkedPeerId(entity.userId) });
72
+ case "messageEntityCustomEmoji":
73
+ return () => ({ _: "textCustomEmoji", documentId: entity.documentId, alt: covered() });
74
+ case "messageEntityFormattedDate":
75
+ return (inner) => ({
76
+ _: "textDate",
77
+ text: inner,
78
+ date: entity.date,
79
+ relative: entity.relative,
80
+ shortTime: entity.shortTime,
81
+ longTime: entity.longTime,
82
+ shortDate: entity.shortDate,
83
+ longDate: entity.longDate,
84
+ dayOfWeek: entity.dayOfWeek
85
+ });
86
+ default:
87
+ return null;
88
+ }
89
+ }
90
+ function textWithEntitiesToRichText(input) {
91
+ const { text, entities } = input;
92
+ if (!text) return { _: "textEmpty" };
93
+ if (!entities?.length) return { _: "textPlain", text };
94
+ const bounds = /* @__PURE__ */ new Set([0, text.length]);
95
+ for (const e of entities) {
96
+ bounds.add(e.offset);
97
+ bounds.add(e.offset + e.length);
98
+ }
99
+ const sorted = [...bounds].filter((b) => b >= 0 && b <= text.length).sort((a, b) => a - b);
100
+ const segments = [];
101
+ for (let i = 0; i < sorted.length - 1; i++) {
102
+ const start = sorted[i];
103
+ const end = sorted[i + 1];
104
+ if (start === end) continue;
105
+ let node = { _: "textPlain", text: text.slice(start, end) };
106
+ const active = entities.filter((e) => e.offset <= start && e.offset + e.length >= end).sort((a, b) => a.length - b.length);
107
+ for (const e of active) {
108
+ const wrap = _entityToRichTextWrapper(e, text);
109
+ if (wrap) node = wrap(node);
110
+ }
111
+ segments.push(node);
112
+ }
113
+ if (segments.length === 0) return { _: "textEmpty" };
114
+ if (segments.length === 1) return segments[0];
115
+ return { _: "textConcat", texts: segments };
116
+ }
117
+ function _richTextNodeToEntity(node, offset, length) {
118
+ switch (node._) {
119
+ case "textBold":
120
+ return { _: "messageEntityBold", offset, length };
121
+ case "textItalic":
122
+ return { _: "messageEntityItalic", offset, length };
123
+ case "textUnderline":
124
+ return { _: "messageEntityUnderline", offset, length };
125
+ case "textStrike":
126
+ return { _: "messageEntityStrike", offset, length };
127
+ case "textFixed":
128
+ return { _: "messageEntityCode", offset, length };
129
+ case "textSpoiler":
130
+ return { _: "messageEntitySpoiler", offset, length };
131
+ case "textMention":
132
+ return { _: "messageEntityMention", offset, length };
133
+ case "textHashtag":
134
+ return { _: "messageEntityHashtag", offset, length };
135
+ case "textCashtag":
136
+ return { _: "messageEntityCashtag", offset, length };
137
+ case "textBotCommand":
138
+ return { _: "messageEntityBotCommand", offset, length };
139
+ case "textBankCard":
140
+ return { _: "messageEntityBankCard", offset, length };
141
+ case "textUrl":
142
+ return { _: "messageEntityTextUrl", offset, length, url: node.url };
143
+ case "textEmail":
144
+ return { _: "messageEntityEmail", offset, length };
145
+ case "textPhone":
146
+ return { _: "messageEntityPhone", offset, length };
147
+ case "textMentionName":
148
+ return { _: "messageEntityMentionName", offset, length, userId: node.userId };
149
+ case "textDate":
150
+ return {
151
+ _: "messageEntityFormattedDate",
152
+ offset,
153
+ length,
154
+ date: node.date,
155
+ relative: node.relative,
156
+ shortTime: node.shortTime,
157
+ longTime: node.longTime,
158
+ shortDate: node.shortDate,
159
+ longDate: node.longDate,
160
+ dayOfWeek: node.dayOfWeek
161
+ };
162
+ default:
163
+ return null;
164
+ }
165
+ }
166
+ function richTextToTextWithEntities(rich) {
167
+ const entities = [];
168
+ let text = "";
169
+ const walk = (node) => {
170
+ switch (node._) {
171
+ case "textEmpty":
172
+ return;
173
+ case "textPlain":
174
+ text += node.text;
175
+ return;
176
+ case "textConcat":
177
+ for (const t of node.texts) walk(t);
178
+ return;
179
+ case "textImage":
180
+ return;
181
+ case "textMath":
182
+ text += node.source;
183
+ return;
184
+ case "textCustomEmoji": {
185
+ const start = text.length;
186
+ text += node.alt;
187
+ entities.push({
188
+ _: "messageEntityCustomEmoji",
189
+ offset: start,
190
+ length: text.length - start,
191
+ documentId: node.documentId
192
+ });
193
+ return;
194
+ }
195
+ default: {
196
+ const start = text.length;
197
+ walk(node.text);
198
+ const entity = _richTextNodeToEntity(node, start, text.length - start);
199
+ if (entity) entities.push(entity);
200
+ }
201
+ }
202
+ };
203
+ walk(rich);
204
+ return { text, entities };
205
+ }
32
206
  export {
33
- joinTextWithEntities
207
+ joinTextWithEntities,
208
+ richTextToTextWithEntities,
209
+ textWithEntitiesToRichText
34
210
  };
@@ -9,3 +9,4 @@ export * from './rps-meter.js';
9
9
  export * from './stream-utils.js';
10
10
  export * from './string-session.js';
11
11
  export * from './voice-utils.js';
12
+ export * from './walk-page-blocks.js';
@@ -9,3 +9,4 @@ export * from './rps-meter.js';
9
9
  export * from './stream-utils.js';
10
10
  export * from './string-session.js';
11
11
  export * from './voice-utils.js';
12
+ export * from './walk-page-blocks.js';
@@ -0,0 +1,164 @@
1
+ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
2
+ globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
3
+ console.warn("[@mtcute/core] CommonJS bundles are deprecated. They will be removed completely in one of the upcoming releases. No support is provided for CommonJS users. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
4
+ console.warn("[@mtcute/core] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
5
+ }
6
+ "use strict";
7
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const utils = require("../../types/utils.cjs");
9
+ function walkRichText(text, visitor) {
10
+ if (!text) return;
11
+ visitor.richText?.(text);
12
+ switch (text._) {
13
+ case "textEmpty":
14
+ case "textPlain":
15
+ case "textEmail":
16
+ case "textPhone":
17
+ case "textImage":
18
+ case "textMath":
19
+ case "textCustomEmoji":
20
+ break;
21
+ case "textBold":
22
+ case "textItalic":
23
+ case "textUnderline":
24
+ case "textStrike":
25
+ case "textFixed":
26
+ case "textUrl":
27
+ case "textSubscript":
28
+ case "textSuperscript":
29
+ case "textMarked":
30
+ case "textAnchor":
31
+ case "textSpoiler":
32
+ case "textMention":
33
+ case "textHashtag":
34
+ case "textBotCommand":
35
+ case "textCashtag":
36
+ case "textAutoUrl":
37
+ case "textAutoEmail":
38
+ case "textAutoPhone":
39
+ case "textBankCard":
40
+ case "textDate":
41
+ case "textMentionName":
42
+ walkRichText(text.text, visitor);
43
+ break;
44
+ case "textConcat":
45
+ for (const child of text.texts) walkRichText(child, visitor);
46
+ break;
47
+ default:
48
+ utils.assertNever();
49
+ }
50
+ }
51
+ function walkPageCaption(caption, visitor) {
52
+ if (!caption) return;
53
+ walkRichText(caption.text, visitor);
54
+ walkRichText(caption.credit, visitor);
55
+ }
56
+ function walkPageBlock(block, visitor) {
57
+ if (!block) return;
58
+ visitor.pageBlock?.(block);
59
+ switch (block._) {
60
+ case "pageBlockUnsupported":
61
+ case "pageBlockDivider":
62
+ case "pageBlockAnchor":
63
+ case "pageBlockMath":
64
+ break;
65
+ case "pageBlockTitle":
66
+ case "pageBlockSubtitle":
67
+ case "pageBlockHeader":
68
+ case "pageBlockSubheader":
69
+ case "pageBlockParagraph":
70
+ case "pageBlockPreformatted":
71
+ case "pageBlockFooter":
72
+ case "pageBlockKicker":
73
+ case "pageBlockThinking":
74
+ case "pageBlockHeading1":
75
+ case "pageBlockHeading2":
76
+ case "pageBlockHeading3":
77
+ case "pageBlockHeading4":
78
+ case "pageBlockHeading5":
79
+ case "pageBlockHeading6":
80
+ walkRichText(block.text, visitor);
81
+ break;
82
+ case "pageBlockAuthorDate":
83
+ walkRichText(block.author, visitor);
84
+ break;
85
+ case "pageBlockList":
86
+ for (const item of block.items) {
87
+ switch (item._) {
88
+ case "pageListItemText":
89
+ walkRichText(item.text, visitor);
90
+ break;
91
+ case "pageListItemBlocks":
92
+ for (const block2 of item.blocks) walkPageBlock(block2, visitor);
93
+ break;
94
+ default:
95
+ utils.assertNever();
96
+ }
97
+ }
98
+ break;
99
+ case "pageBlockOrderedList":
100
+ for (const item of block.items) {
101
+ switch (item._) {
102
+ case "pageListOrderedItemText":
103
+ walkRichText(item.text, visitor);
104
+ break;
105
+ case "pageListOrderedItemBlocks":
106
+ for (const block2 of item.blocks) walkPageBlock(block2, visitor);
107
+ break;
108
+ default:
109
+ utils.assertNever();
110
+ }
111
+ }
112
+ break;
113
+ case "pageBlockBlockquote":
114
+ case "pageBlockPullquote":
115
+ walkRichText(block.text, visitor);
116
+ walkRichText(block.caption, visitor);
117
+ break;
118
+ case "pageBlockPhoto":
119
+ case "pageBlockVideo":
120
+ case "pageBlockEmbed":
121
+ case "pageBlockAudio":
122
+ case "pageBlockMap":
123
+ case "inputPageBlockMap":
124
+ walkPageCaption(block.caption, visitor);
125
+ break;
126
+ case "pageBlockCover":
127
+ walkPageBlock(block.cover, visitor);
128
+ break;
129
+ case "pageBlockEmbedPost":
130
+ for (const child of block.blocks) walkPageBlock(child, visitor);
131
+ walkPageCaption(block.caption, visitor);
132
+ break;
133
+ case "pageBlockCollage":
134
+ case "pageBlockSlideshow":
135
+ for (const child of block.items) walkPageBlock(child, visitor);
136
+ walkPageCaption(block.caption, visitor);
137
+ break;
138
+ case "pageBlockChannel":
139
+ break;
140
+ case "pageBlockTable":
141
+ walkRichText(block.title, visitor);
142
+ for (const row of block.rows) {
143
+ for (const cell of row.cells) walkRichText(cell.text, visitor);
144
+ }
145
+ break;
146
+ case "pageBlockDetails":
147
+ for (const child of block.blocks) walkPageBlock(child, visitor);
148
+ walkRichText(block.title, visitor);
149
+ break;
150
+ case "pageBlockRelatedArticles":
151
+ walkRichText(block.title, visitor);
152
+ break;
153
+ case "pageBlockBlockquoteBlocks":
154
+ for (const child of block.blocks) walkPageBlock(child, visitor);
155
+ walkRichText(block.caption, visitor);
156
+ break;
157
+ default:
158
+ utils.assertNever();
159
+ }
160
+ }
161
+ function walkPageBlocks(blocks, visitor) {
162
+ for (const block of blocks) walkPageBlock(block, visitor);
163
+ }
164
+ exports.walkPageBlocks = walkPageBlocks;
@@ -0,0 +1,9 @@
1
+ import { tl } from '../../tl/index.js';
2
+ export interface PageBlockVisitor {
3
+ /** Called for every rich text node in the tree */
4
+ richText?: (text: tl.TypeRichText) => void;
5
+ /** Called for every page block in the tree */
6
+ pageBlock?: (block: tl.TypePageBlock) => void;
7
+ }
8
+ /** Recursively walk a list of page blocks, invoking the given visitor callbacks */
9
+ export declare function walkPageBlocks(blocks: tl.TypePageBlock[], visitor: PageBlockVisitor): void;
@@ -0,0 +1,9 @@
1
+ import { tl } from '../../tl/index.js';
2
+ export interface PageBlockVisitor {
3
+ /** Called for every rich text node in the tree */
4
+ richText?: (text: tl.TypeRichText) => void;
5
+ /** Called for every page block in the tree */
6
+ pageBlock?: (block: tl.TypePageBlock) => void;
7
+ }
8
+ /** Recursively walk a list of page blocks, invoking the given visitor callbacks */
9
+ export declare function walkPageBlocks(blocks: tl.TypePageBlock[], visitor: PageBlockVisitor): void;