@adriangalilea/utils 2.25.1 → 2.27.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 (46) hide show
  1. package/README.md +17 -12
  2. package/dist/bot/text.d.ts +23 -0
  3. package/dist/bot/text.d.ts.map +1 -0
  4. package/dist/bot/text.js +40 -0
  5. package/dist/bot/text.js.map +1 -0
  6. package/dist/bot/update-identity.d.ts +19 -0
  7. package/dist/bot/update-identity.d.ts.map +1 -0
  8. package/dist/bot/update-identity.js +92 -0
  9. package/dist/bot/update-identity.js.map +1 -0
  10. package/dist/bot/worker.d.ts +62 -0
  11. package/dist/bot/worker.d.ts.map +1 -1
  12. package/dist/bot/worker.js +181 -0
  13. package/dist/bot/worker.js.map +1 -1
  14. package/dist/universal/currency/classify.d.ts +7 -0
  15. package/dist/universal/currency/classify.d.ts.map +1 -0
  16. package/dist/universal/currency/classify.js +147 -0
  17. package/dist/universal/currency/classify.js.map +1 -0
  18. package/dist/universal/currency/decimals.d.ts +2 -0
  19. package/dist/universal/currency/decimals.d.ts.map +1 -0
  20. package/dist/universal/currency/decimals.js +93 -0
  21. package/dist/universal/currency/decimals.js.map +1 -0
  22. package/dist/universal/currency/index.d.ts +12 -57
  23. package/dist/universal/currency/index.d.ts.map +1 -1
  24. package/dist/universal/currency/index.js +27 -317
  25. package/dist/universal/currency/index.js.map +1 -1
  26. package/dist/universal/currency/money.d.ts +12 -0
  27. package/dist/universal/currency/money.d.ts.map +1 -0
  28. package/dist/universal/currency/money.js +40 -0
  29. package/dist/universal/currency/money.js.map +1 -0
  30. package/dist/universal/currency/percent.d.ts +7 -0
  31. package/dist/universal/currency/percent.d.ts.map +1 -0
  32. package/dist/universal/currency/percent.js +32 -0
  33. package/dist/universal/currency/percent.js.map +1 -0
  34. package/dist/universal/currency/symbols.d.ts +32 -0
  35. package/dist/universal/currency/symbols.d.ts.map +1 -0
  36. package/dist/universal/currency/symbols.js +36 -0
  37. package/dist/universal/currency/symbols.js.map +1 -0
  38. package/dist/universal/currency/usd.d.ts +23 -0
  39. package/dist/universal/currency/usd.d.ts.map +1 -0
  40. package/dist/universal/currency/usd.js +54 -0
  41. package/dist/universal/currency/usd.js.map +1 -0
  42. package/dist/universal/format.d.ts +17 -29
  43. package/dist/universal/format.d.ts.map +1 -1
  44. package/dist/universal/format.js +28 -54
  45. package/dist/universal/format.js.map +1 -1
  46. package/package.json +11 -1
package/README.md CHANGED
@@ -82,12 +82,13 @@ Pure number formatting — named exports, tree-shakeable, zero currency baggage
82
82
  knowledge and its crypto-symbol dataset):
83
83
 
84
84
  Every Intl call pins `en` — SSR apps hydrate identically on server and client
85
- (no React #418 from a runtime-default locale).
85
+ (no React #418 from a runtime-default locale). Every formatter accepts
86
+ `null | undefined` and renders `"—"`, so DB fields pass straight through.
86
87
 
87
88
  ```typescript
88
- import { compact, percentage, withCommas, bytes, bitsPerSec } from '@adriangalilea/utils/format'
89
+ import { compact, percentage, fixed, withCommas, bytes, bitsPerSec } from '@adriangalilea/utils/format'
89
90
 
90
- withCommas(1234567) // "1,234,567"
91
+ withCommas(1234567) // "1,234,567" (bigint-safe)
91
92
  withCommas(1234.567, 2) // "1,234.57"
92
93
  compact(1234567) // "1.2M"
93
94
  compact(1234) // "1.2K"
@@ -96,21 +97,25 @@ percentage(0.05) // "0.05%"
96
97
  percentage(123.456) // "123%"
97
98
  percentage(2.41, { sign: true }) // "+2.4%" (deltas: 24h change, diffs)
98
99
  percentage(2.4126, { decimals: 2 }) // "2.41%" (fixed decimals)
100
+ fixed(1.234) // "1.23" (plain toFixed, no grouping)
99
101
  bytes(12.7e12) // "12.7 TB" (decimal SI, like drive specs / df -h)
100
102
  bitsPerSec(2.5e9) // "2.5 Gbps"
103
+ percentage(null) // "—" (every formatter)
104
+ ```
105
+
106
+ Money lives in `currency`, which is split by dependency weight so the barrel
107
+ tree-shakes at file granularity: the 133KB crypto-symbol dataset is imported
108
+ only by its classify module, so `import { usd } from '…/currency'` ships
109
+ dollars, not 13k tickers.
101
110
 
102
- // USD — lives in format (dataset-free): printing dollars must not drag the
103
- // 133KB crypto-symbol dataset into a client bundle. Also re-exported from
104
- // currency for the namespace.
105
- import { usd, usdIntlOptions } from '@adriangalilea/utils/format'
106
- usd(1234.56) // "$1,234.56" (grouped)
111
+ ```typescript
112
+ import { usd, usdIntlOptions, btc, money } from '@adriangalilea/utils/currency'
113
+
114
+ usd(1234.56) // "$1,234.56" (grouped; dataset-free import)
107
115
  usd(4.3387e-7) // "$0.00000043" (sub-cent keeps 2 significant digits)
108
116
  usd(0.43387, { decimals: 4 }) // "$0.4339" (policy override)
109
117
  usd(60892283, { compact: true }) // "$60.9M" (market-cap scale)
110
-
111
- // Symbol-aware money — from currency (owns the symbol/decimals knowledge):
112
- import { btc, money } from '@adriangalilea/utils/currency'
113
- btc(0.00001234) // "0.00001234 ₿"
118
+ btc(0.00001234) // "0.000012340 ₿" (dataset via optimal decimals)
114
119
  money(100, 'EUR') // "€100.00"
115
120
 
116
121
  // The decimals policy as Intl.NumberFormatOptions — for consumers that format
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Telegram outbound-text mechanics: the message size limit, deterministic
3
+ * fitting under it, and the "message is not modified" edit no-op classifier.
4
+ * Dependency-free and Worker-safe.
5
+ */
6
+ /** Telegram's post-entity character limit for one message. */
7
+ export declare const TELEGRAM_MAX_CHARS = 4096;
8
+ export interface FitTelegramTextOptions {
9
+ maxChars?: number;
10
+ /** Retain a short final paragraph, useful for a summary's source/footer block. */
11
+ preserveFinalBlock?: boolean;
12
+ }
13
+ /** Deterministically fit plain text to Telegram's post-entity character limit. */
14
+ export declare function fitTelegramText(text: string, opts?: FitTelegramTextOptions): string;
15
+ /**
16
+ * Telegram rejects an edit whose result equals the current message with
17
+ * "message is not modified". That is a no-op, not an error — the desired state
18
+ * is already live. Callers treat it as delivered instead of falling back to a
19
+ * degraded (e.g. plain-text) retry that WOULD differ and silently strip
20
+ * formatting, or wrongly sending a duplicate.
21
+ */
22
+ export declare function isNotModified(err: unknown): boolean;
23
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/bot/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,sBAA2B,GAC/B,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGnD"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Telegram outbound-text mechanics: the message size limit, deterministic
3
+ * fitting under it, and the "message is not modified" edit no-op classifier.
4
+ * Dependency-free and Worker-safe.
5
+ */
6
+ /** Telegram's post-entity character limit for one message. */
7
+ export const TELEGRAM_MAX_CHARS = 4096;
8
+ /** Deterministically fit plain text to Telegram's post-entity character limit. */
9
+ export function fitTelegramText(text, opts = {}) {
10
+ const maxChars = Math.max(1, Math.floor(opts.maxChars ?? TELEGRAM_MAX_CHARS));
11
+ if (text.length <= maxChars)
12
+ return text;
13
+ const ellipsis = maxChars >= 4 ? "\n\n…" : "…".slice(0, maxChars);
14
+ const divider = opts.preserveFinalBlock ? text.lastIndexOf("\n\n") : -1;
15
+ const possibleTail = divider > maxChars / 2 ? text.slice(divider) : "";
16
+ const tail = possibleTail.length <= Math.min(640, Math.floor(maxChars / 3))
17
+ ? possibleTail
18
+ : "";
19
+ const budget = maxChars - ellipsis.length - tail.length;
20
+ let prefix = text.slice(0, Math.max(0, budget)).trimEnd();
21
+ // Never strand half of a UTF-16 surrogate pair at the truncation boundary.
22
+ if (/[\uD800-\uDBFF]$/.test(prefix))
23
+ prefix = prefix.slice(0, -1);
24
+ const boundary = Math.max(prefix.lastIndexOf("\n"), prefix.lastIndexOf(" "));
25
+ if (boundary >= Math.floor(prefix.length * 0.9))
26
+ prefix = prefix.slice(0, boundary).trimEnd();
27
+ return `${prefix}${ellipsis}${tail}`.slice(0, maxChars);
28
+ }
29
+ /**
30
+ * Telegram rejects an edit whose result equals the current message with
31
+ * "message is not modified". That is a no-op, not an error — the desired state
32
+ * is already live. Callers treat it as delivered instead of falling back to a
33
+ * degraded (e.g. plain-text) retry that WOULD differ and silently strip
34
+ * formatting, or wrongly sending a duplicate.
35
+ */
36
+ export function isNotModified(err) {
37
+ const message = err instanceof Error ? err.message : String(err);
38
+ return /not modified/i.test(message);
39
+ }
40
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/bot/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAQvC,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAC9B,IAAY,EACZ,OAA+B,EAAE;IAEjC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,kBAAkB,CAAC,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,IAAI,GACT,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1D,2EAA2E;IAC3E,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;QAC9C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Pure Telegram-update identity: who an update is from, which conversation it
3
+ * belongs to, and what (if anything) it carries as callback data. Dependency-free
4
+ * and Worker-safe, so the webhook ingress, durable runners, and tests all share
5
+ * one directly-testable routing/deduplication contract.
6
+ */
7
+ /** Telegram's globally unique integer update id, used for durable de-duplication. */
8
+ export declare function telegramUpdateId(update: unknown): number | null;
9
+ /** The raw callback_data payload, when this is a callback-query update. */
10
+ export declare function telegramCallbackData(update: unknown): string | null;
11
+ /** The tapper's Telegram user id, when this is a callback-query update. */
12
+ export declare function telegramCallbackUserId(update: unknown): number | null;
13
+ /**
14
+ * Route one conversation to one Durable Object so its updates remain ordered while unrelated chats
15
+ * can run concurrently. Every current Telegram update shape either carries a chat or an actor; the
16
+ * update id is the safe final partition when it carries neither (for example a poll update).
17
+ */
18
+ export declare function telegramUpdatePartition(update: unknown): string | null;
19
+ //# sourceMappingURL=update-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-identity.d.ts","sourceRoot":"","sources":["../../src/bot/update-identity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE/D;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAErE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAmDtE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Pure Telegram-update identity: who an update is from, which conversation it
3
+ * belongs to, and what (if anything) it carries as callback data. Dependency-free
4
+ * and Worker-safe, so the webhook ingress, durable runners, and tests all share
5
+ * one directly-testable routing/deduplication contract.
6
+ */
7
+ function record(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value)
9
+ ? value
10
+ : null;
11
+ }
12
+ function integer(value) {
13
+ return typeof value === "number" && Number.isSafeInteger(value)
14
+ ? value
15
+ : null;
16
+ }
17
+ function nestedId(value, parent) {
18
+ return integer(record(record(value)?.[parent])?.id);
19
+ }
20
+ /** Telegram's globally unique integer update id, used for durable de-duplication. */
21
+ export function telegramUpdateId(update) {
22
+ return integer(record(update)?.update_id);
23
+ }
24
+ /** The raw callback_data payload, when this is a callback-query update. */
25
+ export function telegramCallbackData(update) {
26
+ const data = record(record(update)?.callback_query)?.data;
27
+ return typeof data === "string" ? data : null;
28
+ }
29
+ /** The tapper's Telegram user id, when this is a callback-query update. */
30
+ export function telegramCallbackUserId(update) {
31
+ return nestedId(record(update)?.callback_query, "from");
32
+ }
33
+ /**
34
+ * Route one conversation to one Durable Object so its updates remain ordered while unrelated chats
35
+ * can run concurrently. Every current Telegram update shape either carries a chat or an actor; the
36
+ * update id is the safe final partition when it carries neither (for example a poll update).
37
+ */
38
+ export function telegramUpdatePartition(update) {
39
+ const root = record(update);
40
+ const updateId = telegramUpdateId(update);
41
+ if (!root || updateId === null)
42
+ return null;
43
+ const chatCarriers = [
44
+ "message",
45
+ "edited_message",
46
+ "channel_post",
47
+ "edited_channel_post",
48
+ "business_message",
49
+ "edited_business_message",
50
+ "deleted_business_messages",
51
+ "message_reaction",
52
+ "message_reaction_count",
53
+ "my_chat_member",
54
+ "chat_member",
55
+ "chat_join_request",
56
+ "chat_boost",
57
+ "removed_chat_boost",
58
+ ];
59
+ for (const key of chatCarriers) {
60
+ const chatId = nestedId(root[key], "chat");
61
+ if (chatId !== null)
62
+ return `chat:${chatId}`;
63
+ }
64
+ const callback = record(root.callback_query);
65
+ const callbackChatId = nestedId(callback?.message, "chat");
66
+ if (callbackChatId !== null)
67
+ return `chat:${callbackChatId}`;
68
+ const actorCarriers = [
69
+ "inline_query",
70
+ "chosen_inline_result",
71
+ "callback_query",
72
+ "shipping_query",
73
+ "pre_checkout_query",
74
+ "purchased_paid_media",
75
+ "poll_answer",
76
+ "business_connection",
77
+ ];
78
+ for (const key of actorCarriers) {
79
+ const carrier = root[key];
80
+ const fromId = nestedId(carrier, "from");
81
+ if (fromId !== null)
82
+ return `user:${fromId}`;
83
+ const userId = nestedId(carrier, "user");
84
+ if (userId !== null)
85
+ return `user:${userId}`;
86
+ const voterChatId = nestedId(carrier, "voter_chat");
87
+ if (voterChatId !== null)
88
+ return `chat:${voterChatId}`;
89
+ }
90
+ return `update:${updateId}`;
91
+ }
92
+ //# sourceMappingURL=update-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-identity.js","sourceRoot":"","sources":["../../src/bot/update-identity.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,24 @@ type WaitUntilCtx = {
34
34
  * echoes — they're the conversation.
35
35
  */
36
36
  export declare function isSelfEcho(update: unknown, selfId: number): boolean;
37
+ /** The slice of a Durable Object namespace binding the durable ingress touches. */
38
+ export type UpdateRunnerNamespace = {
39
+ idFromName(name: string): unknown;
40
+ get(id: unknown): {
41
+ fetch(input: string, init?: RequestInit): Promise<Response>;
42
+ };
43
+ };
44
+ export type DurableUpdates = {
45
+ /** The namespace bound to the class built by {@link telegramUpdateRunner}. */
46
+ namespace: UpdateRunnerNamespace;
47
+ /**
48
+ * Route SELECTED updates outside their conversation queue — for a time-critical
49
+ * callback that must not wait behind slow work already running for its chat.
50
+ * Return a partition name, or null/undefined for the default
51
+ * `telegramUpdatePartition` (one Durable Object per conversation).
52
+ */
53
+ partition?: (update: unknown) => string | null | undefined;
54
+ };
37
55
  export type BotWorkerRuntime = {
38
56
  bot: WorkerBot;
39
57
  /** Telegram webhook secret; unset → webhook/setup respond 500 (a misconfigured prod must scream). */
@@ -59,6 +77,8 @@ export type BotWorkerRuntime = {
59
77
  routes?: (request: Request, url: URL, ctx: WaitUntilCtx) => Promise<Response | null> | Response | null;
60
78
  /** Error-alert throttle (share one to share its budget). Default: own 60s window. */
61
79
  errorThrottle?: AlertThrottle;
80
+ /** Durable webhook ingress: persist-before-ack into per-conversation runner DOs. */
81
+ durableUpdates?: DurableUpdates;
62
82
  };
63
83
  /**
64
84
  * Build the Worker `fetch` handler. `resolve` runs per request — memoize your
@@ -66,5 +86,47 @@ export type BotWorkerRuntime = {
66
86
  * isolate builds once.
67
87
  */
68
88
  export declare function botWorkerFetch<Env>(resolve: (env: Env) => Promise<BotWorkerRuntime> | BotWorkerRuntime): (request: Request, env: Env, ctx: WaitUntilCtx) => Promise<Response>;
89
+ /** The slice of a Durable Object storage transaction the runner touches. */
90
+ type RunnerTxn = {
91
+ get<T>(key: string): Promise<T | undefined>;
92
+ put(key: string, value: unknown): Promise<void>;
93
+ delete(key: string | string[]): Promise<unknown>;
94
+ };
95
+ /** The slice of DurableObjectState the runner touches — satisfied by the real binding. */
96
+ export type UpdateRunnerState = {
97
+ storage: RunnerTxn & {
98
+ getAlarm(): Promise<number | null>;
99
+ setAlarm(time: number): Promise<void>;
100
+ transaction<T>(fn: (txn: RunnerTxn) => Promise<T>): Promise<T>;
101
+ };
102
+ };
103
+ export interface UpdateRunnerOptions {
104
+ /** Application retries per update before it is dropped as completed. Default 3. */
105
+ maxAttempts?: number;
106
+ /** Backoff (ms) before retry N+1; one entry per non-final attempt. Default [5s, 30s]. */
107
+ retryMs?: readonly number[];
108
+ /** Completed update ids retained for webhook de-duplication. Default 512. */
109
+ dedupeLimit?: number;
110
+ }
111
+ /** The Durable Object surface the factory-built runner class exposes. */
112
+ export type TelegramUpdateRunnerClass<Env> = new (state: UpdateRunnerState, env: Env) => {
113
+ fetch(request: Request): Promise<Response>;
114
+ alarm(): Promise<void>;
115
+ };
116
+ /**
117
+ * Build the durable, per-conversation Telegram update runner class — bind it in
118
+ * wrangler and hand its namespace to the runtime's `durableUpdates`. The webhook
119
+ * ingress only persists a job and sets an alarm; each alarm handles ONE update
120
+ * and checkpoints before scheduling the next. Unlike an HTTP waitUntil tail, an
121
+ * alarm handler owns its full invocation, so slow transcript/LLM work is not
122
+ * cancelled ~30 seconds after Telegram receives its acknowledgement.
123
+ *
124
+ * `resolve` is the same (memoized) runtime loader given to `botWorkerFetch`:
125
+ *
126
+ * const loadRuntime = async (env: Env) => ({ bot: await getBot(env), ... })
127
+ * export class TelegramUpdateRunner extends telegramUpdateRunner(loadRuntime) {}
128
+ * export default { fetch: botWorkerFetch(loadRuntime) }
129
+ */
130
+ export declare function telegramUpdateRunner<Env>(resolve: (env: Env) => Promise<BotWorkerRuntime> | BotWorkerRuntime, options?: UpdateRunnerOptions): TelegramUpdateRunnerClass<Env>;
69
131
  export {};
70
132
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"AA2CA,OAAO,EACN,KAAK,aAAa,EAIlB,MAAM,aAAa,CAAC;AAIrB,6FAA6F;AAC7F,MAAM,MAAM,SAAS,GAAG;IACvB,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,OAAO,EAAE;QAAE,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAC7D,GAAG,EAAE;QACJ,UAAU,CAAC,MAAM,EAAE;YAClB,GAAG,EAAE,MAAM,CAAC;YACZ,YAAY,EAAE,MAAM,CAAC;YACrB,eAAe,EAAE,MAAM,EAAE,CAAC;SAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACrB,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,cAAc,IAAI,OAAO,CAAC;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC,CAAC;QAClE,+DAA+D;QAC/D,WAAW,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACzE,CAAC;CACF,CAAC;AAEF,KAAK,YAAY,GAAG;IAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC;AAgBnE;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CASnE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yFAAyF;IACzF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC5C,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,mFAAmF;IACnF,MAAM,CAAC,EAAE,CACR,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,YAAY,KACb,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC;IAChD,qFAAqF;IACrF,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EACjC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GACjE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAsLtE"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,12 @@
9
9
  * POST / webhook — `X-Telegram-Bot-Api-Secret-Token` checked,
10
10
  * acked immediately; the update (+ storage flush) rides
11
11
  * `ctx.waitUntil`, errors DM the admins (throttled).
12
+ * With `durableUpdates` set, the update is instead
13
+ * PERSISTED into a per-conversation TelegramUpdateRunner
14
+ * Durable Object BEFORE the ack, and a DO alarm owns the
15
+ * full update: slow transcript/LLM work is not cancelled
16
+ * ~30s after Telegram receives its acknowledgement, and
17
+ * a non-2xx (nothing persisted) makes Telegram retry.
12
18
  * POST /setup registers the webhook with `allowed_updates` DERIVED
13
19
  * from the bot's handlers (a new handler type never
14
20
  * fires until /setup reruns — deploys should end here).
@@ -42,6 +48,7 @@
42
48
  import { buildAllowedUpdates } from "gramio";
43
49
  import { createLogger } from "../universal/log.js";
44
50
  import { alertAdminError, alertThrottle, notifyAdmins, } from "./notify.js";
51
+ import { telegramUpdateId, telegramUpdatePartition, } from "./update-identity.js";
45
52
  const log = createLogger("bot/worker");
46
53
  const MESSAGE_KEYS = [
47
54
  "message",
@@ -112,6 +119,36 @@ export function botWorkerFetch(resolve) {
112
119
  if (rt.selfId !== undefined && isSelfEcho(update, rt.selfId)) {
113
120
  return new Response("OK");
114
121
  }
122
+ // Durable ingress: persist into the partition's runner DO, THEN ack.
123
+ // A non-2xx tells Telegram to retry; never acknowledge an update
124
+ // that was not persisted.
125
+ if (rt.durableUpdates) {
126
+ const partition = rt.durableUpdates.partition?.(update) ??
127
+ telegramUpdatePartition(update);
128
+ if (!partition)
129
+ return new Response("Bad Request", { status: 400 });
130
+ const { namespace } = rt.durableUpdates;
131
+ try {
132
+ const queued = await namespace
133
+ .get(namespace.idFromName(partition))
134
+ .fetch("https://telegram-update-runner/enqueue", {
135
+ method: "POST",
136
+ headers: { "content-type": "application/json" },
137
+ body: JSON.stringify(update),
138
+ });
139
+ if (!queued.ok) {
140
+ log.error(`update enqueue failed · ${queued.status}`);
141
+ return new Response("update queue unavailable", {
142
+ status: 503,
143
+ });
144
+ }
145
+ return new Response("OK");
146
+ }
147
+ catch (error) {
148
+ log.error("update enqueue failed:", error instanceof Error ? error.message : error);
149
+ return new Response("update queue unavailable", { status: 503 });
150
+ }
151
+ }
115
152
  // Ack Telegram immediately, then keep the Worker alive for the slow
116
153
  // work (avoids GramIO's 30s webhook timeout).
117
154
  ctx.waitUntil((async () => {
@@ -262,4 +299,148 @@ function etaSeconds(meta) {
262
299
  function escapeHtml(s) {
263
300
  return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
264
301
  }
302
+ const runnerLog = createLogger("bot/update-runner");
303
+ const HEAD_KEY = "head";
304
+ const TAIL_KEY = "tail";
305
+ const DONE_KEY = "done";
306
+ const jobKey = (sequence) => `job:${sequence.toString().padStart(16, "0")}`;
307
+ const dedupeKey = (updateId) => `update:${updateId}`;
308
+ /**
309
+ * Build the durable, per-conversation Telegram update runner class — bind it in
310
+ * wrangler and hand its namespace to the runtime's `durableUpdates`. The webhook
311
+ * ingress only persists a job and sets an alarm; each alarm handles ONE update
312
+ * and checkpoints before scheduling the next. Unlike an HTTP waitUntil tail, an
313
+ * alarm handler owns its full invocation, so slow transcript/LLM work is not
314
+ * cancelled ~30 seconds after Telegram receives its acknowledgement.
315
+ *
316
+ * `resolve` is the same (memoized) runtime loader given to `botWorkerFetch`:
317
+ *
318
+ * const loadRuntime = async (env: Env) => ({ bot: await getBot(env), ... })
319
+ * export class TelegramUpdateRunner extends telegramUpdateRunner(loadRuntime) {}
320
+ * export default { fetch: botWorkerFetch(loadRuntime) }
321
+ */
322
+ export function telegramUpdateRunner(resolve, options = {}) {
323
+ const maxAttempts = options.maxAttempts ?? 3;
324
+ const retryMs = options.retryMs ?? [5_000, 30_000];
325
+ const dedupeLimit = options.dedupeLimit ?? 512;
326
+ const fallbackThrottle = alertThrottle();
327
+ return class TelegramUpdateRunner {
328
+ state;
329
+ env;
330
+ constructor(state, env) {
331
+ this.state = state;
332
+ this.env = env;
333
+ }
334
+ async fetch(request) {
335
+ if (request.method !== "POST" ||
336
+ new URL(request.url).pathname !== "/enqueue") {
337
+ return new Response("not found", { status: 404 });
338
+ }
339
+ const update = await request.json().catch(() => null);
340
+ const updateId = telegramUpdateId(update);
341
+ if (updateId === null)
342
+ return new Response("invalid Telegram update", { status: 400 });
343
+ const enqueued = await this.state.storage.transaction(async (txn) => {
344
+ if (await txn.get(dedupeKey(updateId)))
345
+ return false;
346
+ const tail = ((await txn.get(TAIL_KEY)) ?? 0) + 1;
347
+ const head = await txn.get(HEAD_KEY);
348
+ await txn.put(jobKey(tail), {
349
+ updateId,
350
+ update,
351
+ attempts: 0,
352
+ enqueuedAt: Date.now(),
353
+ });
354
+ await txn.put(TAIL_KEY, tail);
355
+ if (head === undefined)
356
+ await txn.put(HEAD_KEY, tail);
357
+ await txn.put(dedupeKey(updateId), "queued");
358
+ return true;
359
+ });
360
+ // A duplicate delivery is also a recovery kick: if the first attempt
361
+ // committed the job but failed while arming its alarm, Telegram's retry
362
+ // must repair that gap before we acknowledge it.
363
+ if ((await this.state.storage.get(HEAD_KEY)) !== undefined &&
364
+ (await this.state.storage.getAlarm()) === null) {
365
+ await this.state.storage.setAlarm(Date.now());
366
+ }
367
+ return new Response(JSON.stringify({ enqueued, duplicate: !enqueued }), {
368
+ headers: { "content-type": "application/json" },
369
+ });
370
+ }
371
+ async alarm() {
372
+ const sequence = await this.state.storage.get(HEAD_KEY);
373
+ if (sequence === undefined)
374
+ return;
375
+ const key = jobKey(sequence);
376
+ const job = await this.state.storage.get(key);
377
+ if (!job) {
378
+ await this.finish(sequence, null);
379
+ await this.scheduleNext();
380
+ return;
381
+ }
382
+ let rt;
383
+ try {
384
+ rt = await resolve(this.env);
385
+ await rt.bot.updates.handleUpdate(job.update);
386
+ if (rt.flush)
387
+ await rt.flush();
388
+ }
389
+ catch (error) {
390
+ job.attempts += 1;
391
+ runnerLog.error(`queued update ${job.updateId} failed · attempt ${job.attempts}/${maxAttempts}:`, error instanceof Error ? error.message : error);
392
+ if (rt) {
393
+ const runtime = rt;
394
+ await (runtime.adminIds?.() ?? Promise.resolve([]))
395
+ .then((ids) => alertAdminError(runtime.bot, ids, `queued Telegram update ${job.updateId} failed`, error, runtime.errorThrottle ?? fallbackThrottle))
396
+ .catch(() => { });
397
+ }
398
+ if (job.attempts >= maxAttempts) {
399
+ await this.finish(sequence, job.updateId);
400
+ await this.scheduleNext();
401
+ return;
402
+ }
403
+ await this.state.storage.put(key, job);
404
+ await this.state.storage.setAlarm(Date.now() + (retryMs[job.attempts - 1] ?? retryMs.at(-1) ?? 30_000));
405
+ return;
406
+ }
407
+ // Checkpointing sits outside the processing catch: if storage/alarm
408
+ // scheduling itself fails, let the platform retry the alarm from durable
409
+ // state instead of misclassifying the completed Telegram update as an
410
+ // application failure and rebuilding a retired job.
411
+ await this.finish(sequence, job.updateId);
412
+ runnerLog.info(`queued update ${job.updateId} completed · ${Date.now() - job.enqueuedAt}ms`);
413
+ await this.scheduleNext();
414
+ }
415
+ /** Retire the head job and retain a bounded completed-id window for webhook de-duplication. */
416
+ async finish(sequence, updateId) {
417
+ await this.state.storage.transaction(async (txn) => {
418
+ await txn.delete(jobKey(sequence));
419
+ if (updateId !== null) {
420
+ await txn.put(dedupeKey(updateId), "done");
421
+ const done = (await txn.get(DONE_KEY)) ?? [];
422
+ done.push(updateId);
423
+ while (done.length > dedupeLimit) {
424
+ const expired = done.shift();
425
+ if (expired !== undefined)
426
+ await txn.delete(dedupeKey(expired));
427
+ }
428
+ await txn.put(DONE_KEY, done);
429
+ }
430
+ const tail = (await txn.get(TAIL_KEY)) ?? sequence;
431
+ if (sequence >= tail) {
432
+ await txn.delete([HEAD_KEY, TAIL_KEY]);
433
+ }
434
+ else {
435
+ await txn.put(HEAD_KEY, sequence + 1);
436
+ }
437
+ });
438
+ }
439
+ async scheduleNext() {
440
+ if ((await this.state.storage.get(HEAD_KEY)) !== undefined) {
441
+ await this.state.storage.setAlarm(Date.now());
442
+ }
443
+ }
444
+ };
445
+ }
265
446
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function normalize(symbol: string): string;
2
+ export declare function areEquivalent(symbol1: string, symbol2: string): boolean;
3
+ export declare function getVariations(symbol: string): string[];
4
+ export declare function isCrypto(code: string): boolean;
5
+ export declare function isStablecoin(code: string): boolean;
6
+ export declare function isFiat(code: string): boolean;
7
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/classify.ts"],"names":[],"mappings":"AA+CA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BhD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAatD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmB9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAclD;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkC5C"}