@xbibzlibrary/telebibz 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.
Files changed (134) hide show
  1. package/APPROVAL_FEATURE.md +73 -0
  2. package/CHANGELOG.md +21 -0
  3. package/LICENSE +21 -0
  4. package/README.md +171 -0
  5. package/SECURITY.md +15 -0
  6. package/bin/telebibz.mjs +3 -0
  7. package/dist/generated/api.d.ts +13 -0
  8. package/dist/generated/api.d.ts.map +1 -0
  9. package/dist/generated/api.js +192 -0
  10. package/dist/generated/api.js.map +1 -0
  11. package/dist/src/api/client.d.ts +32 -0
  12. package/dist/src/api/client.d.ts.map +1 -0
  13. package/dist/src/api/client.js +50 -0
  14. package/dist/src/api/client.js.map +1 -0
  15. package/dist/src/api/errors.d.ts +45 -0
  16. package/dist/src/api/errors.d.ts.map +1 -0
  17. package/dist/src/api/errors.js +65 -0
  18. package/dist/src/api/errors.js.map +1 -0
  19. package/dist/src/api/index.d.ts +5 -0
  20. package/dist/src/api/index.d.ts.map +1 -0
  21. package/dist/src/api/index.js +5 -0
  22. package/dist/src/api/index.js.map +1 -0
  23. package/dist/src/api/transport.d.ts +37 -0
  24. package/dist/src/api/transport.d.ts.map +1 -0
  25. package/dist/src/api/transport.js +134 -0
  26. package/dist/src/api/transport.js.map +1 -0
  27. package/dist/src/api/types.d.ts +441 -0
  28. package/dist/src/api/types.d.ts.map +1 -0
  29. package/dist/src/api/types.js +2 -0
  30. package/dist/src/api/types.js.map +1 -0
  31. package/dist/src/approval/approval.d.ts +63 -0
  32. package/dist/src/approval/approval.d.ts.map +1 -0
  33. package/dist/src/approval/approval.js +90 -0
  34. package/dist/src/approval/approval.js.map +1 -0
  35. package/dist/src/cache/cache.d.ts +33 -0
  36. package/dist/src/cache/cache.d.ts.map +1 -0
  37. package/dist/src/cache/cache.js +37 -0
  38. package/dist/src/cache/cache.js.map +1 -0
  39. package/dist/src/cli.d.ts +2 -0
  40. package/dist/src/cli.d.ts.map +1 -0
  41. package/dist/src/cli.js +55 -0
  42. package/dist/src/cli.js.map +1 -0
  43. package/dist/src/context/context.d.ts +46 -0
  44. package/dist/src/context/context.d.ts.map +1 -0
  45. package/dist/src/context/context.js +63 -0
  46. package/dist/src/context/context.js.map +1 -0
  47. package/dist/src/core/bot.d.ts +76 -0
  48. package/dist/src/core/bot.d.ts.map +1 -0
  49. package/dist/src/core/bot.js +160 -0
  50. package/dist/src/core/bot.js.map +1 -0
  51. package/dist/src/core/events.d.ts +71 -0
  52. package/dist/src/core/events.d.ts.map +1 -0
  53. package/dist/src/core/events.js +24 -0
  54. package/dist/src/core/events.js.map +1 -0
  55. package/dist/src/index.d.ts +18 -0
  56. package/dist/src/index.d.ts.map +1 -0
  57. package/dist/src/index.js +18 -0
  58. package/dist/src/index.js.map +1 -0
  59. package/dist/src/keyboard/index.d.ts +34 -0
  60. package/dist/src/keyboard/index.d.ts.map +1 -0
  61. package/dist/src/keyboard/index.js +43 -0
  62. package/dist/src/keyboard/index.js.map +1 -0
  63. package/dist/src/middleware/compose.d.ts +5 -0
  64. package/dist/src/middleware/compose.d.ts.map +1 -0
  65. package/dist/src/middleware/compose.js +17 -0
  66. package/dist/src/middleware/compose.js.map +1 -0
  67. package/dist/src/plugins/plugin.d.ts +36 -0
  68. package/dist/src/plugins/plugin.d.ts.map +1 -0
  69. package/dist/src/plugins/plugin.js +31 -0
  70. package/dist/src/plugins/plugin.js.map +1 -0
  71. package/dist/src/queue/queue.d.ts +52 -0
  72. package/dist/src/queue/queue.d.ts.map +1 -0
  73. package/dist/src/queue/queue.js +82 -0
  74. package/dist/src/queue/queue.js.map +1 -0
  75. package/dist/src/router/router.d.ts +35 -0
  76. package/dist/src/router/router.d.ts.map +1 -0
  77. package/dist/src/router/router.js +23 -0
  78. package/dist/src/router/router.js.map +1 -0
  79. package/dist/src/state/conversation.d.ts +40 -0
  80. package/dist/src/state/conversation.d.ts.map +1 -0
  81. package/dist/src/state/conversation.js +38 -0
  82. package/dist/src/state/conversation.js.map +1 -0
  83. package/dist/src/state/forms.d.ts +35 -0
  84. package/dist/src/state/forms.d.ts.map +1 -0
  85. package/dist/src/state/forms.js +41 -0
  86. package/dist/src/state/forms.js.map +1 -0
  87. package/dist/src/state/menu.d.ts +30 -0
  88. package/dist/src/state/menu.d.ts.map +1 -0
  89. package/dist/src/state/menu.js +28 -0
  90. package/dist/src/state/menu.js.map +1 -0
  91. package/dist/src/storage/storage.d.ts +33 -0
  92. package/dist/src/storage/storage.d.ts.map +1 -0
  93. package/dist/src/storage/storage.js +51 -0
  94. package/dist/src/storage/storage.js.map +1 -0
  95. package/dist/src/testing.d.ts +17 -0
  96. package/dist/src/testing.d.ts.map +1 -0
  97. package/dist/src/testing.js +12 -0
  98. package/dist/src/testing.js.map +1 -0
  99. package/dist/src/utils/text.d.ts +17 -0
  100. package/dist/src/utils/text.d.ts.map +1 -0
  101. package/dist/src/utils/text.js +0 -0
  102. package/dist/src/utils/text.js.map +1 -0
  103. package/dist/src/webhook/handler.d.ts +8 -0
  104. package/dist/src/webhook/handler.d.ts.map +1 -0
  105. package/dist/src/webhook/handler.js +27 -0
  106. package/dist/src/webhook/handler.js.map +1 -0
  107. package/dist-cjs/generated/api.js +194 -0
  108. package/dist-cjs/package.json +3 -0
  109. package/dist-cjs/src/api/client.js +53 -0
  110. package/dist-cjs/src/api/errors.js +74 -0
  111. package/dist-cjs/src/api/index.js +20 -0
  112. package/dist-cjs/src/api/transport.js +137 -0
  113. package/dist-cjs/src/api/types.js +2 -0
  114. package/dist-cjs/src/approval/approval.js +94 -0
  115. package/dist-cjs/src/cache/cache.js +41 -0
  116. package/dist-cjs/src/cli.js +57 -0
  117. package/dist-cjs/src/context/context.js +66 -0
  118. package/dist-cjs/src/core/bot.js +163 -0
  119. package/dist-cjs/src/core/events.js +27 -0
  120. package/dist-cjs/src/index.js +33 -0
  121. package/dist-cjs/src/keyboard/index.js +49 -0
  122. package/dist-cjs/src/middleware/compose.js +20 -0
  123. package/dist-cjs/src/plugins/plugin.js +35 -0
  124. package/dist-cjs/src/queue/queue.js +86 -0
  125. package/dist-cjs/src/router/router.js +26 -0
  126. package/dist-cjs/src/state/conversation.js +43 -0
  127. package/dist-cjs/src/state/forms.js +44 -0
  128. package/dist-cjs/src/state/menu.js +33 -0
  129. package/dist-cjs/src/storage/storage.js +54 -0
  130. package/dist-cjs/src/testing.js +18 -0
  131. package/dist-cjs/src/utils/text.js +0 -0
  132. package/dist-cjs/src/webhook/handler.js +29 -0
  133. package/docs/README.md +21 -0
  134. package/package.json +78 -0
@@ -0,0 +1,45 @@
1
+ import type { ResponseParameters, TelegramResponse } from "./types.js";
2
+ export type TelegramErrorKind = "retryable" | "rate-limit" | "authentication" | "validation" | "network" | "server" | "unknown";
3
+ export declare class TelegramError extends Error {
4
+ readonly name: string;
5
+ readonly kind: TelegramErrorKind;
6
+ readonly errorCode: number | undefined;
7
+ readonly parameters: ResponseParameters | undefined;
8
+ readonly method: string;
9
+ readonly payload: unknown;
10
+ readonly status: number | undefined;
11
+ constructor(message: string, options: {
12
+ method: string;
13
+ payload: unknown;
14
+ errorCode?: number;
15
+ parameters?: ResponseParameters;
16
+ status?: number;
17
+ kind?: TelegramErrorKind;
18
+ cause?: unknown;
19
+ });
20
+ get retryAfter(): number | undefined;
21
+ get migrateToChatId(): number | undefined;
22
+ }
23
+ export declare class TelegramRateLimitError extends TelegramError {
24
+ readonly name: string;
25
+ constructor(message: string, options: ConstructorParameters<typeof TelegramError>[1]);
26
+ }
27
+ export declare class TelegramAuthError extends TelegramError {
28
+ readonly name: string;
29
+ constructor(message: string, options: ConstructorParameters<typeof TelegramError>[1]);
30
+ }
31
+ export declare class TelegramValidationError extends TelegramError {
32
+ readonly name: string;
33
+ constructor(message: string, options: ConstructorParameters<typeof TelegramError>[1]);
34
+ }
35
+ export declare class TelegramNetworkError extends TelegramError {
36
+ readonly name: string;
37
+ constructor(message: string, options: ConstructorParameters<typeof TelegramError>[1]);
38
+ }
39
+ export declare function classifyTelegramError(errorCode?: number, status?: number): TelegramErrorKind;
40
+ export declare function telegramErrorFromResponse<T>(response: TelegramResponse<T>, context: {
41
+ method: string;
42
+ payload: unknown;
43
+ status?: number;
44
+ }): TelegramError;
45
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/api/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,YAAY,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEhI,qBAAa,aAAc,SAAQ,KAAK;IACtC,SAAkB,IAAI,EAAE,MAAM,CAAmB;IACjD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;IAU3L,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAyC;IAC7E,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAAgD;CAC1F;AAED,qBAAa,sBAAuB,SAAQ,aAAa;IACvD,SAAkB,IAAI,EAAE,MAAM,CAA4B;gBAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CACrF;AACD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,SAAkB,IAAI,EAAE,MAAM,CAAuB;gBACzC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CACrF;AACD,qBAAa,uBAAwB,SAAQ,aAAa;IACxD,SAAkB,IAAI,EAAE,MAAM,CAA6B;gBAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CACrF;AACD,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,SAAkB,IAAI,EAAE,MAAM,CAA0B;gBAC5C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CACrF;AAED,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAM5F;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAUzJ"}
@@ -0,0 +1,65 @@
1
+ export class TelegramError extends Error {
2
+ name = "TelegramError";
3
+ kind;
4
+ errorCode;
5
+ parameters;
6
+ method;
7
+ payload;
8
+ status;
9
+ constructor(message, options) {
10
+ super(message, { cause: options.cause });
11
+ this.method = options.method;
12
+ this.payload = options.payload;
13
+ this.errorCode = options.errorCode;
14
+ this.parameters = options.parameters;
15
+ this.status = options.status;
16
+ this.kind = options.kind ?? classifyTelegramError(options.errorCode, options.status);
17
+ }
18
+ get retryAfter() { return this.parameters?.retry_after; }
19
+ get migrateToChatId() { return this.parameters?.migrate_to_chat_id; }
20
+ }
21
+ export class TelegramRateLimitError extends TelegramError {
22
+ name = "TelegramRateLimitError";
23
+ constructor(message, options) { super(message, { ...options, kind: "rate-limit" }); }
24
+ }
25
+ export class TelegramAuthError extends TelegramError {
26
+ name = "TelegramAuthError";
27
+ constructor(message, options) { super(message, { ...options, kind: "authentication" }); }
28
+ }
29
+ export class TelegramValidationError extends TelegramError {
30
+ name = "TelegramValidationError";
31
+ constructor(message, options) { super(message, { ...options, kind: "validation" }); }
32
+ }
33
+ export class TelegramNetworkError extends TelegramError {
34
+ name = "TelegramNetworkError";
35
+ constructor(message, options) { super(message, { ...options, kind: "network" }); }
36
+ }
37
+ export function classifyTelegramError(errorCode, status) {
38
+ if (errorCode === 429)
39
+ return "rate-limit";
40
+ if (errorCode === 401 || status === 401 || status === 403)
41
+ return "authentication";
42
+ if (errorCode !== undefined && errorCode >= 400 && errorCode < 500)
43
+ return "validation";
44
+ if (status !== undefined && status >= 500)
45
+ return "server";
46
+ return "unknown";
47
+ }
48
+ export function telegramErrorFromResponse(response, context) {
49
+ const message = response.description ?? `Telegram API request failed for ${context.method}`;
50
+ const options = { method: context.method, payload: context.payload };
51
+ if (response.error_code !== undefined)
52
+ options.errorCode = response.error_code;
53
+ if (response.parameters !== undefined)
54
+ options.parameters = response.parameters;
55
+ if (context.status !== undefined)
56
+ options.status = context.status;
57
+ if (response.error_code === 429)
58
+ return new TelegramRateLimitError(message, options);
59
+ if (response.error_code === 401 || context.status === 401 || context.status === 403)
60
+ return new TelegramAuthError(message, options);
61
+ if (response.error_code !== undefined && response.error_code >= 400 && response.error_code < 500)
62
+ return new TelegramValidationError(message, options);
63
+ return new TelegramError(message, options);
64
+ }
65
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/api/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./client.js";
2
+ export * from "./errors.js";
3
+ export * from "./transport.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./client.js";
2
+ export * from "./errors.js";
3
+ export * from "./transport.js";
4
+ export * from "./types.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { TelegramResponse } from "./types.js";
2
+ export interface TransportRequest {
3
+ method: string;
4
+ payload?: Record<string, unknown>;
5
+ signal?: AbortSignal;
6
+ }
7
+ export interface TransportResponse<T = unknown> {
8
+ status: number;
9
+ headers: Headers;
10
+ data: TelegramResponse<T>;
11
+ }
12
+ export interface Transport {
13
+ request<T>(request: TransportRequest): Promise<TransportResponse<T>>;
14
+ }
15
+ export interface FetchTransportOptions {
16
+ baseUrl?: string;
17
+ fetch?: typeof globalThis.fetch;
18
+ timeoutMs?: number;
19
+ retries?: number;
20
+ backoffMs?: number;
21
+ maxBackoffMs?: number;
22
+ jitter?: number;
23
+ headers?: HeadersInit;
24
+ }
25
+ export declare class FetchTransport implements Transport {
26
+ private readonly baseUrl;
27
+ private readonly fetchImpl;
28
+ private readonly timeoutMs;
29
+ private readonly retries;
30
+ private readonly backoffMs;
31
+ private readonly maxBackoffMs;
32
+ private readonly jitter;
33
+ private readonly headers;
34
+ constructor(options?: FetchTransportOptions);
35
+ request<T>({ method, payload, signal }: TransportRequest): Promise<TransportResponse<T>>;
36
+ }
37
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/api/transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,qBAAa,cAAe,YAAW,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;gBAE1B,OAAO,GAAE,qBAA0B;IAYzC,OAAO,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAY,EAAE,MAAM,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CA6CpG"}
@@ -0,0 +1,134 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename, isAbsolute, resolve } from "node:path";
3
+ import { TelegramNetworkError } from "./errors.js";
4
+ export class FetchTransport {
5
+ baseUrl;
6
+ fetchImpl;
7
+ timeoutMs;
8
+ retries;
9
+ backoffMs;
10
+ maxBackoffMs;
11
+ jitter;
12
+ headers;
13
+ constructor(options = {}) {
14
+ this.baseUrl = (options.baseUrl ?? "https://api.telegram.org").replace(/\/$/, "");
15
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
16
+ if (!this.fetchImpl)
17
+ throw new Error("A fetch implementation is required.");
18
+ this.timeoutMs = options.timeoutMs ?? 30_000;
19
+ this.retries = options.retries ?? 2;
20
+ this.backoffMs = options.backoffMs ?? 250;
21
+ this.maxBackoffMs = options.maxBackoffMs ?? 8_000;
22
+ this.jitter = options.jitter ?? 0.2;
23
+ this.headers = options.headers ?? {};
24
+ }
25
+ async request({ method, payload = {}, signal }) {
26
+ const hasUpload = await containsUpload(payload);
27
+ let body;
28
+ const headers = new Headers(this.headers);
29
+ if (hasUpload) {
30
+ const form = new FormData();
31
+ for (const [key, value] of Object.entries(payload))
32
+ await appendFormValue(form, key, value);
33
+ body = form;
34
+ }
35
+ else {
36
+ headers.set("content-type", "application/json; charset=utf-8");
37
+ body = JSON.stringify(payload);
38
+ }
39
+ let attempt = 0;
40
+ while (true) {
41
+ const controller = new AbortController();
42
+ const timeout = setTimeout(() => controller.abort(new Error(`Request timed out after ${this.timeoutMs}ms`)), this.timeoutMs);
43
+ const onAbort = () => controller.abort(signal?.reason);
44
+ signal?.addEventListener("abort", onAbort, { once: true });
45
+ try {
46
+ const normalizedMethod = method.replace(/^\//, "");
47
+ const response = await this.fetchImpl(`${this.baseUrl}/${normalizedMethod}`, {
48
+ method: "POST",
49
+ headers,
50
+ body,
51
+ signal: controller.signal,
52
+ });
53
+ const data = await response.json();
54
+ return { status: response.status, headers: response.headers, data };
55
+ }
56
+ catch (error) {
57
+ if (signal?.aborted)
58
+ throw error;
59
+ if (attempt >= this.retries || !isRetryableNetworkError(error)) {
60
+ throw new TelegramNetworkError(error instanceof Error ? error.message : "Network request failed", { method, payload, cause: error });
61
+ }
62
+ const exponential = Math.min(this.maxBackoffMs, this.backoffMs * 2 ** attempt);
63
+ const spread = exponential * this.jitter;
64
+ const delay = Math.max(0, exponential - spread + Math.random() * spread * 2);
65
+ await new Promise((resolveDelay) => setTimeout(resolveDelay, delay));
66
+ attempt += 1;
67
+ }
68
+ finally {
69
+ clearTimeout(timeout);
70
+ signal?.removeEventListener("abort", onAbort);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ function isRetryableNetworkError(error) {
76
+ if (!(error instanceof Error))
77
+ return true;
78
+ return error.name === "AbortError" || /network|fetch|socket|timeout|temporar/i.test(error.message);
79
+ }
80
+ async function containsUpload(value) {
81
+ if (value instanceof Uint8Array || value instanceof ArrayBuffer || value instanceof Blob)
82
+ return true;
83
+ if (typeof value === "string")
84
+ return false;
85
+ if (value && typeof value === "object" && "source" in value)
86
+ return containsUpload(value.source);
87
+ if (Array.isArray(value)) {
88
+ for (const item of value)
89
+ if (await containsUpload(item))
90
+ return true;
91
+ }
92
+ else if (value && typeof value === "object") {
93
+ for (const item of Object.values(value))
94
+ if (await containsUpload(item))
95
+ return true;
96
+ }
97
+ return false;
98
+ }
99
+ async function appendFormValue(form, key, value) {
100
+ if (value === undefined || value === null)
101
+ return;
102
+ if (value instanceof Uint8Array) {
103
+ form.append(key, new Blob([value]));
104
+ return;
105
+ }
106
+ if (value instanceof ArrayBuffer) {
107
+ form.append(key, new Blob([value]));
108
+ return;
109
+ }
110
+ if (value instanceof Blob) {
111
+ form.append(key, value);
112
+ return;
113
+ }
114
+ if (value && typeof value === "object" && "source" in value) {
115
+ const upload = value;
116
+ if (typeof upload.source === "string" && (isAbsolute(upload.source) || upload.source.startsWith("./") || upload.source.startsWith("../"))) {
117
+ const filePath = resolve(upload.source);
118
+ const bytes = await readFile(filePath);
119
+ form.append(key, new Blob([bytes]), upload.filename ?? basename(filePath));
120
+ return;
121
+ }
122
+ return appendFormValue(form, key, upload.source);
123
+ }
124
+ if (typeof value === "string") {
125
+ form.append(key, value);
126
+ return;
127
+ }
128
+ if (typeof value === "number" || typeof value === "boolean") {
129
+ form.append(key, String(value));
130
+ return;
131
+ }
132
+ form.append(key, JSON.stringify(value));
133
+ }
134
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/api/transport.ts"],"names":[],"mappings":"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"}