@adriangalilea/utils 0.31.0 → 1.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.
- package/README.md +47 -3
- package/dist/bot/admin.d.ts.map +1 -1
- package/dist/bot/admin.js.map +1 -1
- package/dist/bot/create.d.ts +110 -0
- package/dist/bot/create.d.ts.map +1 -0
- package/dist/bot/create.js +228 -0
- package/dist/bot/create.js.map +1 -0
- package/dist/bot/kit.d.ts +1 -2
- package/dist/bot/kit.d.ts.map +1 -1
- package/dist/bot/kit.js.map +1 -1
- package/dist/bot/language.d.ts +8 -0
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +9 -2
- package/dist/bot/language.js.map +1 -1
- package/dist/bot/menu.d.ts +30 -5
- package/dist/bot/menu.d.ts.map +1 -1
- package/dist/bot/menu.js +47 -31
- package/dist/bot/menu.js.map +1 -1
- package/dist/bot/payments/derive.d.ts +1 -1
- package/dist/bot/payments/derive.js +1 -1
- package/dist/bot/payments/plugin.d.ts +6 -0
- package/dist/bot/payments/plugin.d.ts.map +1 -1
- package/dist/bot/payments/plugin.js +5 -2
- package/dist/bot/payments/plugin.js.map +1 -1
- package/dist/bot/storage-d1.d.ts +50 -0
- package/dist/bot/storage-d1.d.ts.map +1 -0
- package/dist/bot/storage-d1.js +68 -0
- package/dist/bot/storage-d1.js.map +1 -0
- package/dist/bot/worker.d.ts +57 -0
- package/dist/bot/worker.d.ts.map +1 -0
- package/dist/bot/worker.js +235 -0
- package/dist/bot/worker.js.map +1 -0
- package/package.json +15 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-d1.js","sourceRoot":"","sources":["../../src/bot/storage-d1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type AlertThrottle } from "./notify.js";
|
|
2
|
+
/** The slice of a gramio `Bot` the worker cap drives — structural, so versions don't pin. */
|
|
3
|
+
export type WorkerBot = {
|
|
4
|
+
info?: {
|
|
5
|
+
username?: string;
|
|
6
|
+
};
|
|
7
|
+
updates: {
|
|
8
|
+
handleUpdate(update: unknown): Promise<unknown>;
|
|
9
|
+
};
|
|
10
|
+
api: {
|
|
11
|
+
setWebhook(params: {
|
|
12
|
+
url: string;
|
|
13
|
+
secret_token: string;
|
|
14
|
+
allowed_updates: string[];
|
|
15
|
+
}): Promise<unknown>;
|
|
16
|
+
deleteWebhook(): Promise<unknown>;
|
|
17
|
+
getWebhookInfo(): Promise<{
|
|
18
|
+
url?: string;
|
|
19
|
+
[k: string]: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
/** For the lifecycle DMs (notifyAdmins rides the same bot). */
|
|
22
|
+
sendMessage(params: {
|
|
23
|
+
chat_id: number;
|
|
24
|
+
text: string;
|
|
25
|
+
}): Promise<unknown>;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
type WaitUntilCtx = {
|
|
29
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
30
|
+
};
|
|
31
|
+
export type BotWorkerRuntime = {
|
|
32
|
+
bot: WorkerBot;
|
|
33
|
+
/** Telegram webhook secret; unset → webhook/setup respond 500 (a misconfigured prod must scream). */
|
|
34
|
+
webhookSecret?: string;
|
|
35
|
+
/** Bearer for /pause, /resume, /webhook-status; unset → those 404 (surface disabled). */
|
|
36
|
+
operatorSecret?: string;
|
|
37
|
+
/** Deployment label echoed in responses/DMs (e.g. the wrangler env name). */
|
|
38
|
+
mode?: string;
|
|
39
|
+
/** Live admin resolver for the lifecycle DMs + error alerts. Default: nobody (DMs off). */
|
|
40
|
+
adminIds?: () => Promise<readonly number[]>;
|
|
41
|
+
/** Awaited inside waitUntil after each update — hand `d1Storage`'s flush here. */
|
|
42
|
+
flush?: () => Promise<void>;
|
|
43
|
+
/** Extra fields merged into /webhook-status (e.g. a live feature flag). */
|
|
44
|
+
statusExtra?: () => Promise<Record<string, unknown>>;
|
|
45
|
+
/** Consumer endpoints, tried BEFORE the built-ins. Return null to fall through. */
|
|
46
|
+
routes?: (request: Request, url: URL, ctx: WaitUntilCtx) => Promise<Response | null> | Response | null;
|
|
47
|
+
/** Error-alert throttle (share one to share its budget). Default: own 60s window. */
|
|
48
|
+
errorThrottle?: AlertThrottle;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Build the Worker `fetch` handler. `resolve` runs per request — memoize your
|
|
52
|
+
* bot construction inside it (the classic `let botPromise` pattern) so the
|
|
53
|
+
* isolate builds once.
|
|
54
|
+
*/
|
|
55
|
+
export declare function botWorkerFetch<Env>(resolve: (env: Env) => Promise<BotWorkerRuntime> | BotWorkerRuntime): (request: Request, env: Env, ctx: WaitUntilCtx) => Promise<Response>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +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;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,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,CAkLtE"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cloudflare Worker cap for a GramIO bot: everything between "I have a
|
|
3
|
+
* `Bot` with features" and "it serves Telegram traffic in production", so a
|
|
4
|
+
* bot file never hand-rolls a fetch handler. The workerd twin of `bot/kit`'s
|
|
5
|
+
* `gracefulStart` (which owns the Node long-poll lifecycle).
|
|
6
|
+
*
|
|
7
|
+
* Endpoints (all on the worker root):
|
|
8
|
+
*
|
|
9
|
+
* POST / webhook — `X-Telegram-Bot-Api-Secret-Token` checked,
|
|
10
|
+
* acked immediately; the update (+ storage flush) rides
|
|
11
|
+
* `ctx.waitUntil`, errors DM the admins (throttled).
|
|
12
|
+
* POST /setup registers the webhook with `allowed_updates` DERIVED
|
|
13
|
+
* from the bot's handlers (a new handler type never
|
|
14
|
+
* fires until /setup reruns — deploys should end here).
|
|
15
|
+
* Body may carry `{sha, author, message}`: the deploy
|
|
16
|
+
* DM then names the commit that went live.
|
|
17
|
+
* POST /deploy-started the "what is shipping" DM — curl it from your deploy
|
|
18
|
+
* script on the STILL-LIVE version the moment a deploy
|
|
19
|
+
* starts. Body `{sha, author, message, etaSeconds?}`.
|
|
20
|
+
* POST /pause deleteWebhook (traffic truly stops; Telegram queues
|
|
21
|
+
* ~24h) — operator-authed.
|
|
22
|
+
* POST /resume re-register the webhook — operator-authed.
|
|
23
|
+
* GET /webhook-status `{mode, paused, webhook, ...statusExtra}` — operator-authed.
|
|
24
|
+
* GET / liveness: `ok (<mode>)`.
|
|
25
|
+
*
|
|
26
|
+
* Auth: `/setup` + `/deploy-started` take `Bearer <webhookSecret>`; the
|
|
27
|
+
* operator verbs take `Bearer <operatorSecret>` and 404 when it's unset.
|
|
28
|
+
* Consumer endpoints go in `routes` (tried first, return null to fall through).
|
|
29
|
+
*
|
|
30
|
+
* Usage — the resolver receives the Worker env and returns the runtime (build
|
|
31
|
+
* & memoize your bot inside it):
|
|
32
|
+
*
|
|
33
|
+
* export default { fetch: botWorkerFetch(async (env) => ({
|
|
34
|
+
* bot: await getBot(env),
|
|
35
|
+
* webhookSecret: env.WEBHOOK_SECRET,
|
|
36
|
+
* operatorSecret: env.SEND_SECRET,
|
|
37
|
+
* mode: env.MODE,
|
|
38
|
+
* adminIds: () => readAdminIds(env),
|
|
39
|
+
* flush,
|
|
40
|
+
* })) }
|
|
41
|
+
*/
|
|
42
|
+
import { buildAllowedUpdates } from "gramio";
|
|
43
|
+
import { createLogger } from "../universal/log.js";
|
|
44
|
+
import { alertAdminError, alertThrottle, notifyAdmins, } from "./notify.js";
|
|
45
|
+
const log = createLogger("bot/worker");
|
|
46
|
+
/**
|
|
47
|
+
* Build the Worker `fetch` handler. `resolve` runs per request — memoize your
|
|
48
|
+
* bot construction inside it (the classic `let botPromise` pattern) so the
|
|
49
|
+
* isolate builds once.
|
|
50
|
+
*/
|
|
51
|
+
export function botWorkerFetch(resolve) {
|
|
52
|
+
const fallbackThrottle = alertThrottle();
|
|
53
|
+
return async (request, env, ctx) => {
|
|
54
|
+
const url = new URL(request.url);
|
|
55
|
+
try {
|
|
56
|
+
const rt = await resolve(env);
|
|
57
|
+
const { bot } = rt;
|
|
58
|
+
const mode = rt.mode ?? "?";
|
|
59
|
+
const adminIds = rt.adminIds ?? (async () => []);
|
|
60
|
+
const throttle = rt.errorThrottle ?? fallbackThrottle;
|
|
61
|
+
const webhookSecret = rt.webhookSecret?.trim();
|
|
62
|
+
// Consumer routes first — the escape hatch for bot-specific endpoints.
|
|
63
|
+
if (rt.routes) {
|
|
64
|
+
const handled = await rt.routes(request, url, ctx);
|
|
65
|
+
if (handled)
|
|
66
|
+
return handled;
|
|
67
|
+
}
|
|
68
|
+
if (request.method === "GET" && url.pathname === "/") {
|
|
69
|
+
return new Response(`ok (${mode})`);
|
|
70
|
+
}
|
|
71
|
+
if (request.method === "POST" && url.pathname === "/") {
|
|
72
|
+
if (!webhookSecret)
|
|
73
|
+
return new Response("webhookSecret is required", { status: 500 });
|
|
74
|
+
if (request.headers.get("X-Telegram-Bot-Api-Secret-Token") !==
|
|
75
|
+
webhookSecret) {
|
|
76
|
+
return new Response("Unauthorized", { status: 401 });
|
|
77
|
+
}
|
|
78
|
+
let update;
|
|
79
|
+
try {
|
|
80
|
+
update = await request.json();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return new Response("Bad Request", { status: 400 });
|
|
84
|
+
}
|
|
85
|
+
// Ack Telegram immediately, then keep the Worker alive for the slow
|
|
86
|
+
// work (avoids GramIO's 30s webhook timeout).
|
|
87
|
+
ctx.waitUntil((async () => {
|
|
88
|
+
await bot.updates.handleUpdate(update);
|
|
89
|
+
if (rt.flush)
|
|
90
|
+
await rt.flush();
|
|
91
|
+
})().catch(async (error) => {
|
|
92
|
+
log.error("update failed:", error instanceof Error ? error.message : error);
|
|
93
|
+
// awaited so the DM rides the same waitUntil, not a frozen isolate
|
|
94
|
+
await alertAdminError(bot, await adminIds(), "webhook update failed", error, throttle);
|
|
95
|
+
}));
|
|
96
|
+
return new Response("OK");
|
|
97
|
+
}
|
|
98
|
+
// Deploy narration, step 1 of 2: what is SHIPPING (curled on the still-live version).
|
|
99
|
+
if (request.method === "POST" && url.pathname === "/deploy-started") {
|
|
100
|
+
if (!webhookSecret)
|
|
101
|
+
return new Response("webhookSecret is required", { status: 500 });
|
|
102
|
+
if (bearerToken(request.headers.get("Authorization")) !== webhookSecret) {
|
|
103
|
+
return new Response("forbidden", { status: 403 });
|
|
104
|
+
}
|
|
105
|
+
const meta = await request.json().catch(() => ({}));
|
|
106
|
+
const commit = parseCommitMeta(meta);
|
|
107
|
+
const eta = etaSeconds(meta);
|
|
108
|
+
log.info(`deploy started${commit ? ` · ${describeCommit(commit)}` : ""}`);
|
|
109
|
+
ctx.waitUntil(adminIds().then((ids) => notifyAdmins(bot, ids, `🛳 <b>@${bot.info?.username}</b> deploying${eta ? ` <i>(~${eta}s)</i>` : ""}…${commitHtml(commit)}`, DEPLOY_DM_PARAMS)));
|
|
110
|
+
return new Response("ok");
|
|
111
|
+
}
|
|
112
|
+
// Deploy narration, step 2 of 2: what went LIVE — and the load-bearing
|
|
113
|
+
// webhook re-registration (allowed_updates derives from the handlers).
|
|
114
|
+
if (request.method === "POST" && url.pathname === "/setup") {
|
|
115
|
+
if (!webhookSecret)
|
|
116
|
+
return new Response("webhookSecret is required", { status: 500 });
|
|
117
|
+
const token = bearerToken(request.headers.get("Authorization")) ??
|
|
118
|
+
request.headers.get("X-Setup-Token");
|
|
119
|
+
if (token !== webhookSecret)
|
|
120
|
+
return new Response("forbidden", { status: 403 });
|
|
121
|
+
const commit = parseCommitMeta(await request.json().catch(() => ({})));
|
|
122
|
+
const allowedUpdates = await registerWebhook(bot, url.origin, webhookSecret);
|
|
123
|
+
log.success(`deployed${commit ? ` · ${describeCommit(commit)}` : ""} — webhook registered`);
|
|
124
|
+
ctx.waitUntil(adminIds().then((ids) => notifyAdmins(bot, ids, `🚀 <b>@${bot.info?.username}</b> deployed · webhook registered${commitHtml(commit)}`, DEPLOY_DM_PARAMS)));
|
|
125
|
+
return new Response(`[${mode}] webhook set to ${url.origin}/ (updates: ${allowedUpdates.join(", ")})`);
|
|
126
|
+
}
|
|
127
|
+
// The operator tap: pause = deleteWebhook (Telegram queues ~24h),
|
|
128
|
+
// resume = re-register, status = getWebhookInfo (+statusExtra).
|
|
129
|
+
if (url.pathname === "/pause" ||
|
|
130
|
+
url.pathname === "/resume" ||
|
|
131
|
+
url.pathname === "/webhook-status") {
|
|
132
|
+
const secret = rt.operatorSecret?.trim();
|
|
133
|
+
if (!secret)
|
|
134
|
+
return json({ error: "operator API disabled" }, 404);
|
|
135
|
+
if (request.headers.get("Authorization") !== `Bearer ${secret}`) {
|
|
136
|
+
return json({ error: "unauthorized" }, 401);
|
|
137
|
+
}
|
|
138
|
+
if (request.method === "POST" && url.pathname === "/pause") {
|
|
139
|
+
await bot.api.deleteWebhook();
|
|
140
|
+
ctx.waitUntil(adminIds().then((ids) => notifyAdmins(bot, ids, `⏸️ @${bot.info?.username} [${mode}] paused — webhook deleted, Telegram queues ~24h.`)));
|
|
141
|
+
}
|
|
142
|
+
else if (request.method === "POST" && url.pathname === "/resume") {
|
|
143
|
+
if (!webhookSecret)
|
|
144
|
+
return new Response("webhookSecret is required", { status: 500 });
|
|
145
|
+
await registerWebhook(bot, url.origin, webhookSecret);
|
|
146
|
+
ctx.waitUntil(adminIds().then((ids) => notifyAdmins(bot, ids, `▶️ @${bot.info?.username} [${mode}] resumed — webhook re-registered.`)));
|
|
147
|
+
}
|
|
148
|
+
else if (!(request.method === "GET" && url.pathname === "/webhook-status")) {
|
|
149
|
+
return new Response("Not Found", { status: 404 });
|
|
150
|
+
}
|
|
151
|
+
const info = await bot.api.getWebhookInfo();
|
|
152
|
+
const extra = rt.statusExtra ? await rt.statusExtra() : {};
|
|
153
|
+
return json({ mode, paused: !info.url, ...extra, webhook: info });
|
|
154
|
+
}
|
|
155
|
+
return new Response("Not Found", { status: 404 });
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
log.error("worker request failed:", error instanceof Error ? error.message : error);
|
|
159
|
+
return new Response("internal error", { status: 500 });
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// allowed_updates must list the opt-in types (message_reaction, chat-member
|
|
164
|
+
// events) or Telegram never delivers them. Derived from the bot's registered
|
|
165
|
+
// handlers — which is why deploys re-register (/setup) and /resume re-derives
|
|
166
|
+
// instead of remembering a stale list.
|
|
167
|
+
async function registerWebhook(bot, origin, webhookSecret) {
|
|
168
|
+
const allowedUpdates = [...buildAllowedUpdates(bot)];
|
|
169
|
+
await bot.api.setWebhook({
|
|
170
|
+
url: `${origin}/`,
|
|
171
|
+
secret_token: webhookSecret,
|
|
172
|
+
allowed_updates: allowedUpdates,
|
|
173
|
+
});
|
|
174
|
+
return allowedUpdates;
|
|
175
|
+
}
|
|
176
|
+
function bearerToken(header) {
|
|
177
|
+
const match = /^Bearer\s+(.+)$/i.exec(header ?? "");
|
|
178
|
+
return match?.[1]?.trim() || null;
|
|
179
|
+
}
|
|
180
|
+
function json(value, status = 200) {
|
|
181
|
+
return new Response(JSON.stringify(value), {
|
|
182
|
+
status,
|
|
183
|
+
headers: { "content-type": "application/json" },
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
function parseCommitMeta(meta) {
|
|
187
|
+
const m = meta;
|
|
188
|
+
const commit = {
|
|
189
|
+
sha: typeof m?.sha === "string" ? m.sha.trim().slice(0, 7) : "",
|
|
190
|
+
author: typeof m?.author === "string" ? m.author.trim() : "",
|
|
191
|
+
message: typeof m?.message === "string"
|
|
192
|
+
? (m.message.split("\n")[0]?.trim().slice(0, 120) ?? "")
|
|
193
|
+
: "",
|
|
194
|
+
};
|
|
195
|
+
return commit.sha || commit.author || commit.message ? commit : null;
|
|
196
|
+
}
|
|
197
|
+
/** One line for the operator log: `abc1234 · Author · "message"`. */
|
|
198
|
+
function describeCommit(c) {
|
|
199
|
+
return [c.sha, c.author, c.message ? `“${c.message}”` : ""]
|
|
200
|
+
.filter(Boolean)
|
|
201
|
+
.join(" · ");
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* The deploy DMs' commit block (Telegram HTML), appended to the headline:
|
|
205
|
+
* a mono sha + author line, then the message as a quote. Empty when no metadata came.
|
|
206
|
+
*/
|
|
207
|
+
function commitHtml(c) {
|
|
208
|
+
if (!c)
|
|
209
|
+
return "";
|
|
210
|
+
const head = [
|
|
211
|
+
c.sha ? `<code>${escapeHtml(c.sha)}</code>` : "",
|
|
212
|
+
escapeHtml(c.author),
|
|
213
|
+
]
|
|
214
|
+
.filter(Boolean)
|
|
215
|
+
.join(" · ");
|
|
216
|
+
const quote = c.message
|
|
217
|
+
? `\n<blockquote>${escapeHtml(c.message)}</blockquote>`
|
|
218
|
+
: "";
|
|
219
|
+
return `${head ? `\n${head}` : ""}${quote}`;
|
|
220
|
+
}
|
|
221
|
+
// HTML mode + no link preview, shared by both deploy DMs.
|
|
222
|
+
const DEPLOY_DM_PARAMS = {
|
|
223
|
+
parse_mode: "HTML",
|
|
224
|
+
link_preview_options: { is_disabled: true },
|
|
225
|
+
};
|
|
226
|
+
/** The recent average deploy duration (seconds) a CI measured, when present and sane. */
|
|
227
|
+
function etaSeconds(meta) {
|
|
228
|
+
const n = Number(meta?.etaSeconds);
|
|
229
|
+
return Number.isFinite(n) && n > 0 && n < 3600 ? Math.round(n) : null;
|
|
230
|
+
}
|
|
231
|
+
// Local minimal escaper; graduates to bot/format when that module lands.
|
|
232
|
+
function escapeHtml(s) {
|
|
233
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/bot/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adriangalilea/utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "TypeScript utilities - logger, currency, formatter, GramIO bot plugins, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -84,6 +84,10 @@
|
|
|
84
84
|
"types": "./dist/bot/storage.d.ts",
|
|
85
85
|
"default": "./dist/bot/storage.js"
|
|
86
86
|
},
|
|
87
|
+
"./bot/storage-d1": {
|
|
88
|
+
"types": "./dist/bot/storage-d1.d.ts",
|
|
89
|
+
"default": "./dist/bot/storage-d1.js"
|
|
90
|
+
},
|
|
87
91
|
"./bot/ctx": {
|
|
88
92
|
"types": "./dist/bot/ctx.d.ts",
|
|
89
93
|
"default": "./dist/bot/ctx.js"
|
|
@@ -103,6 +107,14 @@
|
|
|
103
107
|
"./bot/notify": {
|
|
104
108
|
"types": "./dist/bot/notify.d.ts",
|
|
105
109
|
"default": "./dist/bot/notify.js"
|
|
110
|
+
},
|
|
111
|
+
"./bot/worker": {
|
|
112
|
+
"types": "./dist/bot/worker.d.ts",
|
|
113
|
+
"default": "./dist/bot/worker.js"
|
|
114
|
+
},
|
|
115
|
+
"./bot/create": {
|
|
116
|
+
"types": "./dist/bot/create.d.ts",
|
|
117
|
+
"default": "./dist/bot/create.js"
|
|
106
118
|
}
|
|
107
119
|
},
|
|
108
120
|
"files": [
|
|
@@ -124,7 +136,8 @@
|
|
|
124
136
|
"fix": "biome check --write --unsafe",
|
|
125
137
|
"ci": "biome ci",
|
|
126
138
|
"prepublishOnly": "pnpm run build",
|
|
127
|
-
"test:worker-safe": "pnpm run build && tsx tests/worker-safe-test.ts"
|
|
139
|
+
"test:worker-safe": "pnpm run build && tsx tests/worker-safe-test.ts",
|
|
140
|
+
"demo:bot": "tsx tests/create-demo.ts"
|
|
128
141
|
},
|
|
129
142
|
"keywords": [
|
|
130
143
|
"typescript",
|