@yaebal/core 0.0.1 → 0.0.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.
- package/lib/composer.d.ts +2 -5
- package/lib/composer.d.ts.map +1 -1
- package/lib/composer.js +8 -10
- package/lib/composer.js.map +1 -1
- package/lib/core.test.js +3 -3
- package/lib/core.test.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/node.d.ts +5 -0
- package/lib/node.d.ts.map +1 -0
- package/lib/node.js +51 -0
- package/lib/node.js.map +1 -0
- package/lib/webhook.d.ts +0 -3
- package/lib/webhook.d.ts.map +1 -1
- package/lib/webhook.js +0 -41
- package/lib/webhook.js.map +1 -1
- package/package.json +5 -1
- package/src/composer.ts +9 -11
- package/src/core.test.ts +9 -3
- package/src/index.ts +2 -6
- package/src/node.ts +69 -0
- package/src/webhook.ts +0 -57
package/lib/composer.d.ts
CHANGED
|
@@ -47,6 +47,7 @@ export declare function matchQuery(ctx: Context, query: string): boolean;
|
|
|
47
47
|
*/
|
|
48
48
|
export declare class Composer<C extends Context = Context> {
|
|
49
49
|
protected middlewares: Middleware<C>[];
|
|
50
|
+
protected decorations: object[];
|
|
50
51
|
/** raw middleware. call `next()` to continue the chain. */
|
|
51
52
|
use(...middleware: Middleware<C>[]): this;
|
|
52
53
|
/** handle a specific update, optionally narrowed by a filter query. */
|
|
@@ -83,11 +84,7 @@ export declare class Composer<C extends Context = Context> {
|
|
|
83
84
|
* (`Partial<D>`) since they are absent on other update types.
|
|
84
85
|
*/
|
|
85
86
|
derive<D extends object>(updates: UpdateName | UpdateName[], fn: (ctx: C) => D | Promise<D>): Composer<C & Partial<D>>;
|
|
86
|
-
/**
|
|
87
|
-
* static context enrichment. adds `D` to the context type.
|
|
88
|
-
* NOTE: a production build would hoist this out of the per-request path entirely;
|
|
89
|
-
* here it is applied once at the top of the chain for simplicity.
|
|
90
|
-
*/
|
|
87
|
+
/** static context enrichment. adds `D` to the context type without adding middleware hops. */
|
|
91
88
|
decorate<D extends object>(value: D): Composer<C & D>;
|
|
92
89
|
/** merge another composer in, inheriting its full context type. */
|
|
93
90
|
extend<C2 extends Context>(other: Composer<C2>): Composer<C & C2>;
|
package/lib/composer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEpF,MAAM,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,MAAM,CAAC,EAAE,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAC7F,CAAC,SAAS,EAAE,EAEZ,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,KACjB,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC;IAC7E,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,CAAC;AAEhF,sFAAsF;AACtF,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,OAAO,GAAG,GAAG,MAAM,UAAU,GACzF,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACpB,CAAC,SAAS,GAAG,MAAM,OAAO,GAAG,gBAAgB,GAC5C,CAAC,GAAG;IAAE,aAAa,EAAE,aAAa,CAAA;CAAE,GACpC,CAAC,SAAS,GAAG,MAAM,YAAY,MAAM,EAAE,GACtC,CAAC,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,GACjC,CAAC,CAAC;AAEP,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAgBjG;AAkBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAS/D;AAED;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAChD,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAM;
|
|
1
|
+
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"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"}
|
package/lib/composer.js
CHANGED
|
@@ -47,6 +47,7 @@ export function matchQuery(ctx, query) {
|
|
|
47
47
|
*/
|
|
48
48
|
export class Composer {
|
|
49
49
|
middlewares = [];
|
|
50
|
+
decorations = [];
|
|
50
51
|
/** raw middleware. call `next()` to continue the chain. */
|
|
51
52
|
use(...middleware) {
|
|
52
53
|
this.middlewares.push(...middleware);
|
|
@@ -152,16 +153,9 @@ export class Composer {
|
|
|
152
153
|
});
|
|
153
154
|
return this;
|
|
154
155
|
}
|
|
155
|
-
/**
|
|
156
|
-
* static context enrichment. adds `D` to the context type.
|
|
157
|
-
* NOTE: a production build would hoist this out of the per-request path entirely;
|
|
158
|
-
* here it is applied once at the top of the chain for simplicity.
|
|
159
|
-
*/
|
|
156
|
+
/** static context enrichment. adds `D` to the context type without adding middleware hops. */
|
|
160
157
|
decorate(value) {
|
|
161
|
-
this.
|
|
162
|
-
Object.assign(ctx, value);
|
|
163
|
-
return next();
|
|
164
|
-
});
|
|
158
|
+
this.decorations.push(value);
|
|
165
159
|
return this;
|
|
166
160
|
}
|
|
167
161
|
/** merge another composer in, inheriting its full context type. */
|
|
@@ -171,8 +165,12 @@ export class Composer {
|
|
|
171
165
|
}
|
|
172
166
|
/** collapse this composer into a single middleware (used by `extend` and `Bot`). */
|
|
173
167
|
toMiddleware() {
|
|
168
|
+
const decorations = Object.assign({}, ...this.decorations);
|
|
174
169
|
const composed = compose(this.middlewares);
|
|
175
|
-
return (ctx, next) =>
|
|
170
|
+
return (ctx, next) => {
|
|
171
|
+
Object.assign(ctx, decorations);
|
|
172
|
+
return composed(ctx, next);
|
|
173
|
+
};
|
|
176
174
|
}
|
|
177
175
|
}
|
|
178
176
|
//# sourceMappingURL=composer.js.map
|
package/lib/composer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"AAgDA,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAI,WAA4B;IACtD,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI;QACjC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;QAEnB,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAS,EAAiB,EAAE;YACnD,IAAI,CAAC,IAAI,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACpE,SAAS,GAAG,CAAC,CAAC;YAEd,MAAM,EAAE,GAAG,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,EAAE;gBAAE,OAAO;YAEhB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAY,EAAE,KAAa;IAC9C,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACb,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5D,KAAK,MAAM;YACV,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACzC,KAAK,UAAU;YACd,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,GAAG,GAAG,GAAG,CAAC,OAA8C,CAAC;YAC/D,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9B,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAY,EAAE,KAAa;IACrD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACV,WAAW,GAAoB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.ts"],"names":[],"mappings":"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"}
|
package/lib/core.test.js
CHANGED
|
@@ -6,7 +6,7 @@ import { isMediaSource, media } from "./media.js";
|
|
|
6
6
|
import { webhookCallback } from "./webhook.js";
|
|
7
7
|
test("media helpers are branded and discriminated", () => {
|
|
8
8
|
assert.ok(isMediaSource(media.fileId("AgAC")));
|
|
9
|
-
assert.ok(isMediaSource(media.url("https://
|
|
9
|
+
assert.ok(isMediaSource(media.url("https://yaeb.al/y.png")));
|
|
10
10
|
assert.equal(isMediaSource({ kind: "fileId", fileId: "x" }), false); // unbranded
|
|
11
11
|
});
|
|
12
12
|
test("encodeRequest sends JSON when there is no upload", async () => {
|
|
@@ -15,8 +15,8 @@ test("encodeRequest sends JSON when there is no upload", async () => {
|
|
|
15
15
|
assert.deepEqual(JSON.parse(r.body), { chat_id: 1, photo: "AgAC" });
|
|
16
16
|
});
|
|
17
17
|
test("encodeRequest inlines a url media to its string", async () => {
|
|
18
|
-
const r = await encodeRequest({ photo: media.url("https://
|
|
19
|
-
assert.deepEqual(JSON.parse(r.body), { photo: "https://
|
|
18
|
+
const r = await encodeRequest({ photo: media.url("https://yaeb.al/p.png") });
|
|
19
|
+
assert.deepEqual(JSON.parse(r.body), { photo: "https://yaeb.al/p.png" });
|
|
20
20
|
});
|
|
21
21
|
test("encodeRequest builds multipart for a buffer upload", async () => {
|
|
22
22
|
const r = await encodeRequest({
|
package/lib/core.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACxD,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -8,8 +8,8 @@ export { Bot, type BotOptions } from "./bot.js";
|
|
|
8
8
|
export { Composer, compose, matchQuery, type Filter, type FilterQuery, type Filtered, type Middleware, type NextFn, type Plugin, } from "./composer.js";
|
|
9
9
|
export { Context, type ContextOptions } from "./context.js";
|
|
10
10
|
export { media, isMediaSource, type MediaSource } from "./media.js";
|
|
11
|
-
export { webhookCallback,
|
|
12
|
-
export { createApi, TelegramError, type Api, type ApiOptions, type FileReader, type BeforeHook, type AfterHook, type ErrorHook, type ErrorAction, } from "./api.js";
|
|
11
|
+
export { webhookCallback, type UpdateSink, type WebhookOptions } from "./webhook.js";
|
|
12
|
+
export { createApi, encodeRequest, TelegramError, type Api, type ApiOptions, type FileReader, type BeforeHook, type AfterHook, type ErrorHook, type ErrorAction, } from "./api.js";
|
|
13
13
|
export { format, Stringable, bold, italic, underline, strikethrough, spoiler, code, pre, link, mention, type FormatResult, } from "./format.js";
|
|
14
14
|
export type * from "./telegram-types.js";
|
|
15
15
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACN,QAAQ,EACR,OAAO,EACP,UAAU,EACV,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,MAAM,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACN,QAAQ,EACR,OAAO,EACP,UAAU,EACV,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,MAAM,EACX,KAAK,MAAM,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EACN,SAAS,EACT,aAAa,EACb,aAAa,EACb,KAAK,GAAG,EACR,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,MAAM,EACN,UAAU,EACV,IAAI,EACJ,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACP,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,OAAO,EACP,KAAK,YAAY,GACjB,MAAM,aAAa,CAAC;AACrB,mBAAmB,qBAAqB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { Bot } from "./bot.js";
|
|
|
8
8
|
export { Composer, compose, matchQuery, } from "./composer.js";
|
|
9
9
|
export { Context } from "./context.js";
|
|
10
10
|
export { media, isMediaSource } from "./media.js";
|
|
11
|
-
export { webhookCallback
|
|
12
|
-
export { createApi, TelegramError, } from "./api.js";
|
|
11
|
+
export { webhookCallback } from "./webhook.js";
|
|
12
|
+
export { createApi, encodeRequest, TelegramError, } from "./api.js";
|
|
13
13
|
export { format, Stringable, bold, italic, underline, strikethrough, spoiler, code, pre, link, mention, } from "./format.js";
|
|
14
14
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAmB,MAAM,UAAU,CAAC;AAChD,OAAO,EACN,QAAQ,EACR,OAAO,EACP,UAAU,GAOV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAmB,MAAM,UAAU,CAAC;AAChD,OAAO,EACN,QAAQ,EACR,OAAO,EACP,UAAU,GAOV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,eAAe,EAAwC,MAAM,cAAc,CAAC;AACrF,OAAO,EACN,SAAS,EACT,aAAa,EACb,aAAa,GAQb,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,MAAM,EACN,UAAU,EACV,IAAI,EACJ,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACP,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,OAAO,GAEP,MAAM,aAAa,CAAC"}
|
package/lib/node.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { UpdateSink, WebhookOptions } from "./webhook.js";
|
|
3
|
+
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
4
|
+
export declare function nodeWebhookCallback(bot: UpdateSink, options?: WebhookOptions): (req: IncomingMessage, res: ServerResponse) => void;
|
|
5
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAa/D,qFAAqF;AACrF,wBAAgB,mBAAmB,CAClC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,cAAmB,GAC1B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI,CAkDrD"}
|
package/lib/node.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const MAX_BODY = 1 << 20; // 1 MiB
|
|
2
|
+
function safeEqual(a, b) {
|
|
3
|
+
if (a.length !== b.length)
|
|
4
|
+
return false;
|
|
5
|
+
let diff = 0;
|
|
6
|
+
for (let i = 0; i < a.length; i++)
|
|
7
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
8
|
+
return diff === 0;
|
|
9
|
+
}
|
|
10
|
+
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
11
|
+
export function nodeWebhookCallback(bot, options = {}) {
|
|
12
|
+
return (req, res) => {
|
|
13
|
+
if (req.method !== "POST") {
|
|
14
|
+
res.statusCode = 405;
|
|
15
|
+
res.end();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const got = req.headers["x-telegram-bot-api-secret-token"];
|
|
19
|
+
if (options.secretToken &&
|
|
20
|
+
!safeEqual(typeof got === "string" ? got : "", options.secretToken)) {
|
|
21
|
+
res.statusCode = 401;
|
|
22
|
+
res.end();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let size = 0;
|
|
27
|
+
req.on("data", (c) => {
|
|
28
|
+
size += c.length;
|
|
29
|
+
if (size > MAX_BODY) {
|
|
30
|
+
res.statusCode = 413;
|
|
31
|
+
res.end();
|
|
32
|
+
req.destroy();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
chunks.push(c);
|
|
36
|
+
});
|
|
37
|
+
req.on("end", async () => {
|
|
38
|
+
try {
|
|
39
|
+
const update = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
40
|
+
await bot.handleUpdate(update);
|
|
41
|
+
res.statusCode = 200;
|
|
42
|
+
res.end("ok");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
res.statusCode = 400;
|
|
46
|
+
res.end();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=node.js.map
|
package/lib/node.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ;AAElC,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACtC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,mBAAmB,CAClC,GAAe,EACf,UAA0B,EAAE;IAE5B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,EAAE,CAAC;YAEV,OAAO;QACR,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC3D,IACC,OAAO,CAAC,WAAW;YACnB,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,EAClE,CAAC;YACF,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,EAAE,CAAC;YAEV,OAAO;QACR,CAAC;QAED,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;YAC5B,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;YAEjB,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;gBACrB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,GAAG,CAAC,OAAO,EAAE,CAAC;gBAEd,OAAO;YACR,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YACxB,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAW,CAAC;gBAC5E,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;gBAE/B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACR,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,EAAE,CAAC;YACX,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC"}
|
package/lib/webhook.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
1
|
import type { Update } from "./telegram-types.js";
|
|
3
2
|
/** anything that can take a single update — i.e. a `Bot`. */
|
|
4
3
|
export interface UpdateSink {
|
|
@@ -13,6 +12,4 @@ export interface WebhookOptions {
|
|
|
13
12
|
* cloudflare workers, and any runtime with the fetch globals.
|
|
14
13
|
*/
|
|
15
14
|
export declare function webhookCallback(bot: UpdateSink, options?: WebhookOptions): (request: Request) => Promise<Response>;
|
|
16
|
-
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
17
|
-
export declare function nodeWebhookCallback(bot: UpdateSink, options?: WebhookOptions): (req: IncomingMessage, res: ServerResponse) => void;
|
|
18
15
|
//# sourceMappingURL=webhook.d.ts.map
|
package/lib/webhook.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAiBlD,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IAC1B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC9B,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,cAAmB,GAC1B,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAyBzC"}
|
package/lib/webhook.js
CHANGED
|
@@ -38,45 +38,4 @@ export function webhookCallback(bot, options = {}) {
|
|
|
38
38
|
return new Response("ok");
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
42
|
-
export function nodeWebhookCallback(bot, options = {}) {
|
|
43
|
-
return (req, res) => {
|
|
44
|
-
if (req.method !== "POST") {
|
|
45
|
-
res.statusCode = 405;
|
|
46
|
-
res.end();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const got = req.headers["x-telegram-bot-api-secret-token"];
|
|
50
|
-
if (options.secretToken &&
|
|
51
|
-
!safeEqual(typeof got === "string" ? got : "", options.secretToken)) {
|
|
52
|
-
res.statusCode = 401;
|
|
53
|
-
res.end();
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const chunks = [];
|
|
57
|
-
let size = 0;
|
|
58
|
-
req.on("data", (c) => {
|
|
59
|
-
size += c.length;
|
|
60
|
-
if (size > MAX_BODY) {
|
|
61
|
-
res.statusCode = 413;
|
|
62
|
-
res.end();
|
|
63
|
-
req.destroy();
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
chunks.push(c);
|
|
67
|
-
});
|
|
68
|
-
req.on("end", async () => {
|
|
69
|
-
try {
|
|
70
|
-
const update = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
71
|
-
await bot.handleUpdate(update);
|
|
72
|
-
res.statusCode = 200;
|
|
73
|
-
res.end("ok");
|
|
74
|
-
}
|
|
75
|
-
catch {
|
|
76
|
-
res.statusCode = 400;
|
|
77
|
-
res.end();
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
41
|
//# sourceMappingURL=webhook.js.map
|
package/lib/webhook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../src/webhook.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ;AAElC;;;GAGG;AACH,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS;IACtC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,KAAK,CAAC,CAAC;AACnB,CAAC;AAYD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC9B,GAAe,EACf,UAA0B,EAAE;IAE5B,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1F,IACC,OAAO,CAAC,WAAW;YACnB,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,WAAW,CAAC,EAC5F,CAAC;YACF,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC;YACnE,OAAO,IAAI,QAAQ,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACJ,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAW,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yaebal/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "yaebal core — type-safe, chainable Telegram Bot API framework.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./lib/index.d.ts",
|
|
11
11
|
"import": "./lib/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./node": {
|
|
14
|
+
"types": "./lib/node.d.ts",
|
|
15
|
+
"import": "./lib/node.js"
|
|
12
16
|
}
|
|
13
17
|
},
|
|
14
18
|
"files": [
|
package/src/composer.ts
CHANGED
|
@@ -100,6 +100,7 @@ export function matchQuery(ctx: Context, query: string): boolean {
|
|
|
100
100
|
*/
|
|
101
101
|
export class Composer<C extends Context = Context> {
|
|
102
102
|
protected middlewares: Middleware<C>[] = [];
|
|
103
|
+
protected decorations: object[] = [];
|
|
103
104
|
|
|
104
105
|
/** raw middleware. call `next()` to continue the chain. */
|
|
105
106
|
use(...middleware: Middleware<C>[]): this {
|
|
@@ -252,17 +253,9 @@ export class Composer<C extends Context = Context> {
|
|
|
252
253
|
return this;
|
|
253
254
|
}
|
|
254
255
|
|
|
255
|
-
/**
|
|
256
|
-
* static context enrichment. adds `D` to the context type.
|
|
257
|
-
* NOTE: a production build would hoist this out of the per-request path entirely;
|
|
258
|
-
* here it is applied once at the top of the chain for simplicity.
|
|
259
|
-
*/
|
|
256
|
+
/** static context enrichment. adds `D` to the context type without adding middleware hops. */
|
|
260
257
|
decorate<D extends object>(value: D): Composer<C & D> {
|
|
261
|
-
this.
|
|
262
|
-
Object.assign(ctx as object, value);
|
|
263
|
-
return next();
|
|
264
|
-
});
|
|
265
|
-
|
|
258
|
+
this.decorations.push(value);
|
|
266
259
|
return this as unknown as Composer<C & D>;
|
|
267
260
|
}
|
|
268
261
|
|
|
@@ -274,7 +267,12 @@ export class Composer<C extends Context = Context> {
|
|
|
274
267
|
|
|
275
268
|
/** collapse this composer into a single middleware (used by `extend` and `Bot`). */
|
|
276
269
|
toMiddleware(): Middleware<C> {
|
|
270
|
+
const decorations = Object.assign({}, ...this.decorations);
|
|
277
271
|
const composed = compose(this.middlewares);
|
|
278
|
-
|
|
272
|
+
|
|
273
|
+
return (ctx, next) => {
|
|
274
|
+
Object.assign(ctx as object, decorations);
|
|
275
|
+
return composed(ctx, next);
|
|
276
|
+
};
|
|
279
277
|
}
|
|
280
278
|
}
|
package/src/core.test.ts
CHANGED
|
@@ -7,19 +7,21 @@ import { webhookCallback } from "./webhook.js";
|
|
|
7
7
|
|
|
8
8
|
test("media helpers are branded and discriminated", () => {
|
|
9
9
|
assert.ok(isMediaSource(media.fileId("AgAC")));
|
|
10
|
-
assert.ok(isMediaSource(media.url("https://
|
|
10
|
+
assert.ok(isMediaSource(media.url("https://yaeb.al/y.png")));
|
|
11
11
|
assert.equal(isMediaSource({ kind: "fileId", fileId: "x" }), false); // unbranded
|
|
12
12
|
});
|
|
13
13
|
|
|
14
14
|
test("encodeRequest sends JSON when there is no upload", async () => {
|
|
15
15
|
const r = await encodeRequest({ chat_id: 1, photo: media.fileId("AgAC") });
|
|
16
|
+
|
|
16
17
|
assert.equal(r.contentType, "application/json");
|
|
17
18
|
assert.deepEqual(JSON.parse(r.body as string), { chat_id: 1, photo: "AgAC" });
|
|
18
19
|
});
|
|
19
20
|
|
|
20
21
|
test("encodeRequest inlines a url media to its string", async () => {
|
|
21
|
-
const r = await encodeRequest({ photo: media.url("https://
|
|
22
|
-
|
|
22
|
+
const r = await encodeRequest({ photo: media.url("https://yaeb.al/p.png") });
|
|
23
|
+
|
|
24
|
+
assert.deepEqual(JSON.parse(r.body as string), { photo: "https://yaeb.al/p.png" });
|
|
23
25
|
});
|
|
24
26
|
|
|
25
27
|
test("encodeRequest builds multipart for a buffer upload", async () => {
|
|
@@ -29,7 +31,9 @@ test("encodeRequest builds multipart for a buffer upload", async () => {
|
|
|
29
31
|
reply_markup: { inline_keyboard: [] },
|
|
30
32
|
});
|
|
31
33
|
assert.ok(r.body instanceof FormData);
|
|
34
|
+
|
|
32
35
|
const form = r.body as FormData;
|
|
36
|
+
|
|
33
37
|
assert.equal(form.get("photo"), "attach://_file0");
|
|
34
38
|
assert.ok(form.get("_file0") instanceof Blob);
|
|
35
39
|
assert.equal(form.get("chat_id"), "7"); // non-string serialized
|
|
@@ -57,8 +61,10 @@ test("encodeRequest uses an injected readFile for media.path() (runtime-agnostic
|
|
|
57
61
|
assert.equal(p, "./pics/cat.jpg"); // path forwarded verbatim
|
|
58
62
|
return new Uint8Array([9, 8, 7]);
|
|
59
63
|
};
|
|
64
|
+
|
|
60
65
|
const r = await encodeRequest({ chat_id: 1, photo: media.path("./pics/cat.jpg") }, readFile);
|
|
61
66
|
const form = r.body as FormData;
|
|
67
|
+
|
|
62
68
|
assert.ok(form.get("_file0") instanceof Blob);
|
|
63
69
|
assert.equal(form.get("photo"), "attach://_file0");
|
|
64
70
|
assert.equal((form.get("_file0") as File).name, "cat.jpg"); // pure-js basename
|
package/src/index.ts
CHANGED
|
@@ -19,14 +19,10 @@ export {
|
|
|
19
19
|
} from "./composer.js";
|
|
20
20
|
export { Context, type ContextOptions } from "./context.js";
|
|
21
21
|
export { media, isMediaSource, type MediaSource } from "./media.js";
|
|
22
|
-
export {
|
|
23
|
-
webhookCallback,
|
|
24
|
-
nodeWebhookCallback,
|
|
25
|
-
type UpdateSink,
|
|
26
|
-
type WebhookOptions,
|
|
27
|
-
} from "./webhook.js";
|
|
22
|
+
export { webhookCallback, type UpdateSink, type WebhookOptions } from "./webhook.js";
|
|
28
23
|
export {
|
|
29
24
|
createApi,
|
|
25
|
+
encodeRequest,
|
|
30
26
|
TelegramError,
|
|
31
27
|
type Api,
|
|
32
28
|
type ApiOptions,
|
package/src/node.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { UpdateSink, WebhookOptions } from "./webhook.js";
|
|
3
|
+
import type { Update } from "./telegram-types.js";
|
|
4
|
+
|
|
5
|
+
const MAX_BODY = 1 << 20; // 1 MiB
|
|
6
|
+
|
|
7
|
+
function safeEqual(a: string, b: string): boolean {
|
|
8
|
+
if (a.length !== b.length) return false;
|
|
9
|
+
let diff = 0;
|
|
10
|
+
|
|
11
|
+
for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
12
|
+
return diff === 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
16
|
+
export function nodeWebhookCallback(
|
|
17
|
+
bot: UpdateSink,
|
|
18
|
+
options: WebhookOptions = {},
|
|
19
|
+
): (req: IncomingMessage, res: ServerResponse) => void {
|
|
20
|
+
return (req, res) => {
|
|
21
|
+
if (req.method !== "POST") {
|
|
22
|
+
res.statusCode = 405;
|
|
23
|
+
res.end();
|
|
24
|
+
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const got = req.headers["x-telegram-bot-api-secret-token"];
|
|
29
|
+
if (
|
|
30
|
+
options.secretToken &&
|
|
31
|
+
!safeEqual(typeof got === "string" ? got : "", options.secretToken)
|
|
32
|
+
) {
|
|
33
|
+
res.statusCode = 401;
|
|
34
|
+
res.end();
|
|
35
|
+
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const chunks: Buffer[] = [];
|
|
40
|
+
let size = 0;
|
|
41
|
+
|
|
42
|
+
req.on("data", (c: Buffer) => {
|
|
43
|
+
size += c.length;
|
|
44
|
+
|
|
45
|
+
if (size > MAX_BODY) {
|
|
46
|
+
res.statusCode = 413;
|
|
47
|
+
res.end();
|
|
48
|
+
req.destroy();
|
|
49
|
+
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
chunks.push(c);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
req.on("end", async () => {
|
|
57
|
+
try {
|
|
58
|
+
const update = JSON.parse(Buffer.concat(chunks).toString("utf8")) as Update;
|
|
59
|
+
await bot.handleUpdate(update);
|
|
60
|
+
|
|
61
|
+
res.statusCode = 200;
|
|
62
|
+
res.end("ok");
|
|
63
|
+
} catch {
|
|
64
|
+
res.statusCode = 400;
|
|
65
|
+
res.end();
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
}
|
package/src/webhook.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
1
|
import type { Update } from "./telegram-types.js";
|
|
3
2
|
|
|
4
3
|
/** telegram updates are tiny; reject anything wildly larger to avoid memory abuse. */
|
|
@@ -59,59 +58,3 @@ export function webhookCallback(
|
|
|
59
58
|
return new Response("ok");
|
|
60
59
|
};
|
|
61
60
|
}
|
|
62
|
-
|
|
63
|
-
/** a node `http` webhook handler — `http.createServer(nodeWebhookCallback(bot))`. */
|
|
64
|
-
export function nodeWebhookCallback(
|
|
65
|
-
bot: UpdateSink,
|
|
66
|
-
options: WebhookOptions = {},
|
|
67
|
-
): (req: IncomingMessage, res: ServerResponse) => void {
|
|
68
|
-
return (req, res) => {
|
|
69
|
-
if (req.method !== "POST") {
|
|
70
|
-
res.statusCode = 405;
|
|
71
|
-
res.end();
|
|
72
|
-
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const got = req.headers["x-telegram-bot-api-secret-token"];
|
|
77
|
-
if (
|
|
78
|
-
options.secretToken &&
|
|
79
|
-
!safeEqual(typeof got === "string" ? got : "", options.secretToken)
|
|
80
|
-
) {
|
|
81
|
-
res.statusCode = 401;
|
|
82
|
-
res.end();
|
|
83
|
-
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const chunks: Buffer[] = [];
|
|
88
|
-
|
|
89
|
-
let size = 0;
|
|
90
|
-
req.on("data", (c: Buffer) => {
|
|
91
|
-
size += c.length;
|
|
92
|
-
|
|
93
|
-
if (size > MAX_BODY) {
|
|
94
|
-
res.statusCode = 413;
|
|
95
|
-
res.end();
|
|
96
|
-
req.destroy();
|
|
97
|
-
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
chunks.push(c);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
req.on("end", async () => {
|
|
105
|
-
try {
|
|
106
|
-
const update = JSON.parse(Buffer.concat(chunks).toString("utf8")) as Update;
|
|
107
|
-
await bot.handleUpdate(update);
|
|
108
|
-
|
|
109
|
-
res.statusCode = 200;
|
|
110
|
-
res.end("ok");
|
|
111
|
-
} catch {
|
|
112
|
-
res.statusCode = 400;
|
|
113
|
-
res.end();
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
};
|
|
117
|
-
}
|