@melandlabs/integrations-telegram 0.1.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.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Telegram User Listener — Pure State Layer
3
+ *
4
+ * Extracted from TelegramUserListener to enable memory-only unit testing
5
+ * of state-machine transitions without external IO (MTProto client, timers).
6
+ */
7
+ /** Calculate exponential backoff delay and whether to give up. */
8
+ declare function calculateBackoffDelay(attempts: number, baseMs: number, maxAttempts: number): {
9
+ delayMs: number;
10
+ shouldGiveUp: boolean;
11
+ };
12
+ /** Determine whether a connection is stale based on last event time. */
13
+ declare function isConnectionStale(lastEventTime: number, now: number, staleThresholdMs: number): boolean;
14
+ /** Map UpdateConnectionState numeric codes to human-readable strings. */
15
+ declare function resolveConnectionState(stateCode: number | string): string;
16
+ /** Decide whether an incoming message should be processed (idempotent + dedup). */
17
+ declare function shouldProcessMessage(msgId: number, lastProcessedId: number, ownSentIds: Set<number>): boolean;
18
+ /** Evict oldest entries from own-sent message ID set when cap is exceeded. */
19
+ declare function pruneOwnSentIds(set: Set<number>, maxSize: number): void;
20
+
21
+ export { calculateBackoffDelay, isConnectionStale, pruneOwnSentIds, resolveConnectionState, shouldProcessMessage };
package/dist/state.js ADDED
@@ -0,0 +1,38 @@
1
+ // src/state.ts
2
+ function calculateBackoffDelay(attempts, baseMs, maxAttempts) {
3
+ const shouldGiveUp = attempts >= maxAttempts;
4
+ if (shouldGiveUp) {
5
+ return { delayMs: 0, shouldGiveUp: true };
6
+ }
7
+ const delayMs = baseMs * 2 ** attempts;
8
+ return { delayMs, shouldGiveUp: false };
9
+ }
10
+ function isConnectionStale(lastEventTime, now, staleThresholdMs) {
11
+ const elapsed = now - lastEventTime;
12
+ return elapsed > staleThresholdMs;
13
+ }
14
+ function resolveConnectionState(stateCode) {
15
+ const stateMap = {
16
+ 0: "connecting",
17
+ 1: "connected",
18
+ 2: "disconnected",
19
+ "-1": "connectionLost"
20
+ };
21
+ return stateMap[stateCode] || `unknown(${stateCode})`;
22
+ }
23
+ function shouldProcessMessage(msgId, lastProcessedId, ownSentIds) {
24
+ if (msgId <= lastProcessedId) return false;
25
+ if (ownSentIds.has(msgId)) return false;
26
+ return true;
27
+ }
28
+ function pruneOwnSentIds(set, maxSize) {
29
+ if (set.size <= maxSize) return;
30
+ const oldest = set.values().next().value;
31
+ if (oldest !== void 0) {
32
+ set.delete(oldest);
33
+ }
34
+ }
35
+
36
+ export { calculateBackoffDelay, isConnectionStale, pruneOwnSentIds, resolveConnectionState, shouldProcessMessage };
37
+ //# sourceMappingURL=state.js.map
38
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/state.ts"],"names":[],"mappings":";AAQO,SAAS,qBAAA,CACf,QAAA,EACA,MAAA,EACA,WAAA,EAC6C;AAC7C,EAAA,MAAM,eAAe,QAAA,IAAY,WAAA;AACjC,EAAA,IAAI,YAAA,EAAc;AACjB,IAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,YAAA,EAAc,IAAA,EAAK;AAAA,EACzC;AACA,EAAA,MAAM,OAAA,GAAU,SAAS,CAAA,IAAK,QAAA;AAC9B,EAAA,OAAO,EAAE,OAAA,EAAS,YAAA,EAAc,KAAA,EAAM;AACvC;AAGO,SAAS,iBAAA,CAAkB,aAAA,EAAuB,GAAA,EAAa,gBAAA,EAAmC;AACxG,EAAA,MAAM,UAAU,GAAA,GAAM,aAAA;AACtB,EAAA,OAAO,OAAA,GAAU,gBAAA;AAClB;AAGO,SAAS,uBAAuB,SAAA,EAAoC;AAC1E,EAAA,MAAM,QAAA,GAAmC;AAAA,IACxC,CAAA,EAAG,YAAA;AAAA,IACH,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,cAAA;AAAA,IACH,IAAA,EAAM;AAAA,GACP;AACA,EAAA,OAAO,QAAA,CAAS,SAAmB,CAAA,IAAK,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,CAAA;AAC7D;AAGO,SAAS,oBAAA,CACf,KAAA,EACA,eAAA,EACA,UAAA,EACU;AACV,EAAA,IAAI,KAAA,IAAS,iBAAiB,OAAO,KAAA;AACrC,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,OAAO,IAAA;AACR;AAGO,SAAS,eAAA,CAAgB,KAAkB,OAAA,EAAuB;AACxE,EAAA,IAAI,GAAA,CAAI,QAAQ,OAAA,EAAS;AACzB,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACnC,EAAA,IAAI,WAAW,MAAA,EAAW;AACzB,IAAA,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAClB;AACD","file":"state.js","sourcesContent":["/**\n * Telegram User Listener — Pure State Layer\n *\n * Extracted from TelegramUserListener to enable memory-only unit testing\n * of state-machine transitions without external IO (MTProto client, timers).\n */\n\n/** Calculate exponential backoff delay and whether to give up. */\nexport function calculateBackoffDelay(\n\tattempts: number,\n\tbaseMs: number,\n\tmaxAttempts: number,\n): { delayMs: number; shouldGiveUp: boolean } {\n\tconst shouldGiveUp = attempts >= maxAttempts;\n\tif (shouldGiveUp) {\n\t\treturn { delayMs: 0, shouldGiveUp: true };\n\t}\n\tconst delayMs = baseMs * 2 ** attempts;\n\treturn { delayMs, shouldGiveUp: false };\n}\n\n/** Determine whether a connection is stale based on last event time. */\nexport function isConnectionStale(lastEventTime: number, now: number, staleThresholdMs: number): boolean {\n\tconst elapsed = now - lastEventTime;\n\treturn elapsed > staleThresholdMs;\n}\n\n/** Map UpdateConnectionState numeric codes to human-readable strings. */\nexport function resolveConnectionState(stateCode: number | string): string {\n\tconst stateMap: Record<number, string> = {\n\t\t0: \"connecting\",\n\t\t1: \"connected\",\n\t\t2: \"disconnected\",\n\t\t\"-1\": \"connectionLost\",\n\t};\n\treturn stateMap[stateCode as number] || `unknown(${stateCode})`;\n}\n\n/** Decide whether an incoming message should be processed (idempotent + dedup). */\nexport function shouldProcessMessage(\n\tmsgId: number,\n\tlastProcessedId: number,\n\townSentIds: Set<number>,\n): boolean {\n\tif (msgId <= lastProcessedId) return false;\n\tif (ownSentIds.has(msgId)) return false;\n\treturn true;\n}\n\n/** Evict oldest entries from own-sent message ID set when cap is exceeded. */\nexport function pruneOwnSentIds(set: Set<number>, maxSize: number): void {\n\tif (set.size <= maxSize) return;\n\tconst oldest = set.values().next().value;\n\tif (oldest !== undefined) {\n\t\tset.delete(oldest);\n\t}\n}\n"]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Main conversion function: Convert tdata to StringSession
3
+ */
4
+ declare function convertTdataToStringSession(tdataPath: string): Promise<string>;
5
+ /**
6
+ * Validate if a directory contains valid Telegram Desktop tdata
7
+ */
8
+ declare function validateTdataDirectory(tdataPath: string): {
9
+ valid: boolean;
10
+ error?: string;
11
+ };
12
+ /**
13
+ * Extract basic account info from tdata
14
+ */
15
+ interface TdataAccountInfo {
16
+ userId: number;
17
+ dcId: number;
18
+ }
19
+ declare function extractAccountInfo(tdataPath: string): TdataAccountInfo | null;
20
+
21
+ export { type TdataAccountInfo, convertTdataToStringSession, extractAccountInfo, validateTdataDirectory };