@grom.js/effect-tg 0.8.0 → 0.9.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 (99) hide show
  1. package/README.md +162 -5
  2. package/dist/BotApi.d.ts +10 -12
  3. package/dist/BotApi.d.ts.map +1 -1
  4. package/dist/BotApi.js +2 -2
  5. package/dist/BotApi.js.map +1 -1
  6. package/dist/BotApiError.d.ts +46 -71
  7. package/dist/BotApiError.d.ts.map +1 -1
  8. package/dist/BotApiError.js +59 -41
  9. package/dist/BotApiError.js.map +1 -1
  10. package/dist/BotApiTransport.d.ts +10 -17
  11. package/dist/BotApiTransport.d.ts.map +1 -1
  12. package/dist/BotApiTransport.js +2 -7
  13. package/dist/BotApiTransport.js.map +1 -1
  14. package/dist/BotApiUrl.d.ts +6 -8
  15. package/dist/BotApiUrl.d.ts.map +1 -1
  16. package/dist/BotApiUrl.js.map +1 -1
  17. package/dist/Content.d.ts.map +1 -1
  18. package/dist/Dialog.d.ts +96 -41
  19. package/dist/Dialog.d.ts.map +1 -1
  20. package/dist/Dialog.js +60 -25
  21. package/dist/Dialog.js.map +1 -1
  22. package/dist/File.d.ts +1 -2
  23. package/dist/File.d.ts.map +1 -1
  24. package/dist/File.js +1 -1
  25. package/dist/File.js.map +1 -1
  26. package/dist/Markup.d.ts.map +1 -1
  27. package/dist/Runner.d.ts +1 -1
  28. package/dist/Runner.d.ts.map +1 -1
  29. package/dist/Send.d.ts +57 -130
  30. package/dist/Send.d.ts.map +1 -1
  31. package/dist/Send.js +65 -128
  32. package/dist/Send.js.map +1 -1
  33. package/dist/Text.d.ts.map +1 -1
  34. package/dist/internal/botApi.d.ts +3 -1
  35. package/dist/internal/botApi.d.ts.map +1 -1
  36. package/dist/internal/botApi.gen.d.ts +6501 -0
  37. package/dist/internal/botApi.gen.d.ts.map +1 -0
  38. package/dist/internal/botApi.gen.js +2 -0
  39. package/dist/internal/botApi.gen.js.map +1 -0
  40. package/dist/internal/botApi.js +2 -6
  41. package/dist/internal/botApi.js.map +1 -1
  42. package/dist/internal/botApiError.d.ts +5 -2
  43. package/dist/internal/botApiError.d.ts.map +1 -1
  44. package/dist/internal/botApiError.js +8 -18
  45. package/dist/internal/botApiError.js.map +1 -1
  46. package/dist/internal/botApiTransport.d.ts +5 -2
  47. package/dist/internal/botApiTransport.d.ts.map +1 -1
  48. package/dist/internal/botApiTransport.js +14 -10
  49. package/dist/internal/botApiTransport.js.map +1 -1
  50. package/dist/internal/dialog.d.ts +27 -10
  51. package/dist/internal/dialog.d.ts.map +1 -1
  52. package/dist/internal/dialog.js +88 -14
  53. package/dist/internal/dialog.js.map +1 -1
  54. package/dist/internal/file.d.ts +1 -1
  55. package/dist/internal/file.d.ts.map +1 -1
  56. package/dist/internal/file.js +1 -1
  57. package/dist/internal/file.js.map +1 -1
  58. package/dist/internal/runner.d.ts +4 -5
  59. package/dist/internal/runner.d.ts.map +1 -1
  60. package/dist/internal/runner.js +14 -19
  61. package/dist/internal/runner.js.map +1 -1
  62. package/dist/internal/send.d.ts +4 -4
  63. package/dist/internal/send.d.ts.map +1 -1
  64. package/dist/internal/send.js +62 -51
  65. package/dist/internal/send.js.map +1 -1
  66. package/package.json +11 -9
  67. package/src/BotApi.ts +38 -31
  68. package/src/BotApiError.ts +109 -63
  69. package/src/BotApiTransport.ts +18 -20
  70. package/src/BotApiUrl.ts +6 -8
  71. package/src/Content.ts +14 -14
  72. package/src/Dialog.ts +164 -42
  73. package/src/File.ts +3 -4
  74. package/src/Markup.ts +5 -5
  75. package/src/Send.ts +114 -202
  76. package/src/Text.ts +5 -5
  77. package/src/internal/botApi.gen.ts +6783 -0
  78. package/src/internal/botApi.ts +7 -11
  79. package/src/internal/botApiError.ts +15 -20
  80. package/src/internal/botApiTransport.ts +25 -17
  81. package/src/internal/dialog.ts +109 -26
  82. package/src/internal/file.ts +1 -1
  83. package/src/internal/runner.ts +34 -38
  84. package/src/internal/send.ts +161 -132
  85. package/dist/internal/botApiMethods.gen.d.ts +0 -2110
  86. package/dist/internal/botApiMethods.gen.d.ts.map +0 -1
  87. package/dist/internal/botApiMethods.gen.js +0 -2
  88. package/dist/internal/botApiMethods.gen.js.map +0 -1
  89. package/dist/internal/botApiShape.gen.d.ts +0 -406
  90. package/dist/internal/botApiShape.gen.d.ts.map +0 -1
  91. package/dist/internal/botApiShape.gen.js +0 -2
  92. package/dist/internal/botApiShape.gen.js.map +0 -1
  93. package/dist/internal/botApiTypes.gen.d.ts +0 -3986
  94. package/dist/internal/botApiTypes.gen.d.ts.map +0 -1
  95. package/dist/internal/botApiTypes.gen.js +0 -2
  96. package/dist/internal/botApiTypes.gen.js.map +0 -1
  97. package/src/internal/botApiMethods.gen.ts +0 -2111
  98. package/src/internal/botApiShape.gen.ts +0 -406
  99. package/src/internal/botApiTypes.gen.ts +0 -4264
package/README.md CHANGED
@@ -1,9 +1,166 @@
1
- Effectful library for crafting Telegram bots.
1
+ # effect-tg
2
+
3
+ [![Effectful](https://img.shields.io/badge/Effectful-%23000?style=flat&logo=effect&logoColor=%23fff)](https://effect.website/)
4
+ [![npm](https://img.shields.io/npm/v/%40grom.js%2Feffect-tg?style=flat&logo=npm&logoColor=%23BB443E&logoSize=auto&label=%C2%A0&labelColor=%23fff&color=%23BB443E)](https://www.npmjs.com/package/@grom.js/effect-tg)
2
5
 
3
- > [!WARNING]
4
- > Work in progress.
6
+ Effectful library for crafting Telegram bots.
5
7
 
6
8
  ## Features
7
9
 
8
- - Effectful and typesafe API.
9
- - Up-to-date and documented Bot API methods and types.
10
+ - Modular design to build with [Effect](https://effect.website).
11
+ - Complete type definitions for [Bot API](https://core.telegram.org/bots/api) methods and types.
12
+
13
+ ## Installation
14
+
15
+ ```sh
16
+ # Install the library
17
+ npm install @grom.js/effect-tg
18
+
19
+ # Install Effect dependencies
20
+ npm install effect @effect/platform
21
+ ```
22
+
23
+ ## Working with Bot API
24
+
25
+ ### Calling methods
26
+
27
+ `BotApi` service provides access to Telegram's Bot API.
28
+ Each method on `BotApi` corresponds to the Bot API method with typed parameters and results.
29
+ Methods return an `Effect` that succeeds with the method result or fails with `BotApiError` (see ["Error handling"](#error-handling)).
30
+
31
+ **Example:** Calling Bot API methods using `BotApi`.
32
+
33
+ ```ts
34
+ import { BotApi } from '@grom.js/effect-tg'
35
+ import { Effect } from 'effect'
36
+
37
+ const program = Effect.gen(function* () {
38
+ const api = yield* BotApi.BotApi
39
+ const me = yield* api.getMe()
40
+ yield* api.sendMessage({
41
+ chat_id: 123456789,
42
+ text: `Hello from ${me.username}!`,
43
+ })
44
+ })
45
+ ```
46
+
47
+ Alternatively, you can use `BotApi.callMethod` function to call any method by name.
48
+
49
+ **Example:** Calling Bot API methods using `BotApi.callMethod`.
50
+
51
+ ```ts
52
+ import { BotApi } from '@grom.js/effect-tg'
53
+ import { Effect } from 'effect'
54
+
55
+ const program = Effect.gen(function* () {
56
+ const me = yield* BotApi.callMethod('getMe')
57
+ yield* BotApi.callMethod('sendMessage', {
58
+ chat_id: 123456789,
59
+ text: `Hello from ${me.username}!`,
60
+ })
61
+ })
62
+ ```
63
+
64
+ ### Configuration
65
+
66
+ `BotApi` has a layered architecture:
67
+
68
+ ```
69
+ ┌• BotApi — typed interface that delegates calls to `BotApiTransport`.
70
+ └─┬• BotApiTransport — serializes parameters, sends HTTP requests, parses responses.
71
+ ├──• BotApiUrl — constructs endpoint URLs to methods and files.
72
+ └──• HttpClient — performs HTTP requests.
73
+ ```
74
+
75
+ This design enables:
76
+
77
+ - **Extensibility**: Extend `BotApiTransport` to implement logging, retrying, etc.
78
+ - **Testability**: Mock implementation of `BotApiTransport` or `HttpClient` to test your bot.
79
+ - **Portability:** Provide different `BotApiUrl` to run a bot on test environment or with local Bot API server.
80
+
81
+ **Example:** Constructing `BotApi` layer.
82
+
83
+ ```ts
84
+ import { FetchHttpClient } from '@effect/platform'
85
+ import { BotApi, BotApiTransport, BotApiUrl } from '@grom.js/effect-tg'
86
+ import { Effect, Layer } from 'effect'
87
+
88
+ const BotApiLive = BotApi.layer.pipe(
89
+ Layer.provide(BotApiTransport.layer),
90
+ Layer.provide(
91
+ Layer.succeed(
92
+ BotApiUrl.BotApiUrl,
93
+ BotApiUrl.makeProd('YOUR_BOT_TOKEN')
94
+ )
95
+ ),
96
+ Layer.provide(FetchHttpClient.layer),
97
+ )
98
+ ```
99
+
100
+ ### Error handling
101
+
102
+ Failed `BotApi` method calls result in `BotApiError`, which is a union of tagged errors with additional information:
103
+
104
+ - `TransportError` — HTTP or network failure. `cause` property contains the original error from `HttpClient`.
105
+ - `RateLimited` — bot has exceeded flood limit. `retryAfter` property contains the duration to wait before retry.
106
+ - `GroupUpgraded` — group has been migrated to supergroup. `supergroup` property contains an object with the new ID.
107
+ - `MethodFailed` — response was unsuccessful, but the exact reason could not be determined. `possibleReason` property contains common failure reasons as string literals, determined by error code and description, which are subject to change.
108
+ - `InternalServerError` — Bot API server failed with 5xx error code.
109
+
110
+ All errors except `TransportError` also have `response` property that contains the original response from Bot API.
111
+
112
+ **Example:** Handling Bot API failures.
113
+
114
+ ```ts
115
+ import { BotApi } from '@grom.js/effect-tg'
116
+ import { Duration, Effect, Match } from 'effect'
117
+
118
+ const program = BotApi.callMethod('doSomething').pipe(
119
+ Effect.matchEffect({
120
+ onSuccess: result => Effect.logInfo('Got result:', result),
121
+ onFailure: e => Match.value(e).pipe(
122
+ Match.tagsExhaustive({
123
+ TransportError: ({ message }) =>
124
+ Effect.logError(`Probably network issue: ${message}`),
125
+ RateLimited: ({ retryAfter }) =>
126
+ Effect.logError(`Try again in ${Duration.format(retryAfter)}`),
127
+ GroupUpgraded: ({ supergroup }) =>
128
+ Effect.logError(`Group now has a new ID: ${supergroup.id}`),
129
+ MethodFailed: ({ possibleReason, response }) =>
130
+ Match.value(possibleReason).pipe(
131
+ Match.when('BotBlockedByUser', () =>
132
+ Effect.logError('I was blocked...')),
133
+ Match.orElse(() =>
134
+ Effect.logError(`Unsuccessful response: ${response.description}`)),
135
+ ),
136
+ InternalServerError: () =>
137
+ Effect.logError('Not much we can do about it.'),
138
+ }),
139
+ ),
140
+ }),
141
+ )
142
+ ```
143
+
144
+ ### Types
145
+
146
+ `BotApi` module exports type definitions for all Bot API types, method parameters and results.
147
+
148
+ **Example:** Creating custom types from Bot API types.
149
+
150
+ ```ts
151
+ import { BotApi, BotApiError } from '@grom.js/effect-tg'
152
+ import { Effect } from 'effect'
153
+
154
+ // Union of all possible updates
155
+ type UpdateType = Exclude<keyof BotApi.Types.Update, 'update_id'>
156
+
157
+ // Function to get gifts of multiple chats
158
+ type GiftsCollector = (
159
+ chatIds: Array<BotApi.MethodParams['getChatGifts']['chat_id']>,
160
+ params: Omit<BotApi.MethodParams['getChatGifts'], 'chat_id'>,
161
+ ) => Effect.Effect<
162
+ Array<BotApi.MethodResults['getChatGifts']>,
163
+ BotApiError.BotApiError,
164
+ BotApi.BotApi
165
+ >
166
+ ```
package/dist/BotApi.d.ts CHANGED
@@ -1,22 +1,20 @@
1
1
  import type * as BotApiError from './BotApiError.ts';
2
- import type { MethodParams, MethodResults } from './internal/botApiMethods.gen.ts';
3
- import type { BotApiShape } from './internal/botApiShape.gen.ts';
4
- import type * as Types from './internal/botApiTypes.gen.ts';
2
+ import type { MethodParams, MethodResults, BotApi as Service, Types } from './internal/botApi.gen.ts';
5
3
  import * as Context from 'effect/Context';
6
4
  import * as Effect from 'effect/Effect';
7
5
  import * as Layer from 'effect/Layer';
8
6
  import * as BotApiTransport from './BotApiTransport.ts';
9
- export type { MethodParams, MethodResults, Types };
10
- declare const BotApi_base: Context.TagClass<BotApi, "@grom.js/effect-tg/BotApi", BotApiShape>;
7
+ export type { MethodParams, MethodResults, Service, Types };
8
+ declare const BotApi_base: Context.TagClass<BotApi, "@grom.js/effect-tg/BotApi", Service>;
11
9
  export declare class BotApi extends BotApi_base {
12
10
  }
13
- export declare namespace BotApi {
14
- type Service = BotApiShape;
11
+ export interface BotApiMethod<TMethod extends keyof MethodParams> {
12
+ (...args: MethodArgs<TMethod>): Effect.Effect<MethodResults[TMethod], BotApiError.BotApiError, never>;
15
13
  }
16
- export interface Method<M extends keyof MethodParams, E = BotApiError.BotApiError | BotApiTransport.BotApiTransportError, R = never> {
17
- (params: MethodParams[M]): Effect.Effect<MethodResults[M], E, R>;
18
- }
19
- export declare const make: (transport: BotApiTransport.BotApiTransport.Service) => BotApiShape;
14
+ export declare const callMethod: <TMethod extends keyof MethodParams>(method: TMethod, ...args: MethodArgs<TMethod>) => Effect.Effect<MethodResults[TMethod], BotApiError.BotApiError, BotApi>;
15
+ export declare const make: (args: {
16
+ transport: BotApiTransport.Service;
17
+ }) => Service;
20
18
  export declare const layer: Layer.Layer<BotApi, never, BotApiTransport.BotApiTransport>;
21
- export declare const callMethod: <M extends keyof MethodParams>(method: M, params: MethodParams[M]) => Effect.Effect<MethodResults[M], BotApiError.BotApiError | BotApiTransport.BotApiTransportError, BotApi>;
19
+ type MethodArgs<TMethod extends keyof MethodParams> = void extends MethodParams[TMethod] ? [params?: MethodParams[TMethod]] : [params: MethodParams[TMethod]];
22
20
  //# sourceMappingURL=BotApi.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApi.d.ts","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,WAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAChE,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAGvD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;;AAElD,qBAAa,MAAO,SAAQ,WAGzB;CAAG;AAEN,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC9B,KAAY,OAAO,GAAG,WAAW,CAAA;CAClC;AAED,MAAM,WAAW,MAAM,CACrB,CAAC,SAAS,MAAM,YAAY,EAC5B,CAAC,GAAG,WAAW,CAAC,WAAW,GAAG,eAAe,CAAC,oBAAoB,EAClE,CAAC,GAAG,KAAK;IAET,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CACjE;AAED,eAAO,MAAM,IAAI,EAAE,CACjB,SAAS,EAAE,eAAe,CAAC,eAAe,CAAC,OAAO,KAC/C,WAA2B,CAAA;AAEhC,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,MAAM,EACN,KAAK,EACL,eAAe,CAAC,eAAe,CAIhC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EACpD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KACpB,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,CAAC,CAAC,EAChB,WAAW,CAAC,WAAW,GAAG,eAAe,CAAC,oBAAoB,EAC9D,MAAM,CAMA,CAAA"}
1
+ {"version":3,"file":"BotApi.d.ts","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,WAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,MAAM,IAAI,OAAO,EACjB,KAAK,EACN,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAGvD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;;AAE3D,qBAAa,MAAO,SAAQ,WAGzB;CAAG;AAEN,MAAM,WAAW,YAAY,CAAC,OAAO,SAAS,MAAM,YAAY;IAC9D,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAC3C,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,KAAK,CACN,CAAA;CACF;AAED,eAAO,MAAM,UAAU,EAAE,CAAC,OAAO,SAAS,MAAM,YAAY,EAC1D,MAAM,EAAE,OAAO,EACf,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,KACzB,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,OAAO,CAAC,EACtB,WAAW,CAAC,WAAW,EACvB,MAAM,CAMA,CAAA;AAER,eAAO,MAAM,IAAI,EAAE,CAAC,IAAI,EAAE;IACxB,SAAS,EAAE,eAAe,CAAC,OAAO,CAAA;CACnC,KAAK,OAAuB,CAAA;AAE7B,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,MAAM,EACN,KAAK,EACL,eAAe,CAAC,eAAe,CAOhC,CAAA;AAED,KAAK,UAAU,CAAC,OAAO,SAAS,MAAM,YAAY,IAChD,IAAI,SAAS,YAAY,CAAC,OAAO,CAAC,GAC9B,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,GAChC,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA"}
package/dist/BotApi.js CHANGED
@@ -5,7 +5,7 @@ import * as BotApiTransport from "./BotApiTransport.js";
5
5
  import * as internal from "./internal/botApi.js";
6
6
  export class BotApi extends Context.Tag('@grom.js/effect-tg/BotApi')() {
7
7
  }
8
+ export const callMethod = (method, params = undefined) => BotApi.pipe(Effect.flatMap(api => api[method](params)));
8
9
  export const make = internal.make;
9
- export const layer = Layer.effect(BotApi, Effect.andThen(BotApiTransport.BotApiTransport, internal.make));
10
- export const callMethod = (method, params = undefined) => BotApi.pipe(Effect.flatMap((api) => api[method](params)));
10
+ export const layer = Layer.effect(BotApi, Effect.andThen(BotApiTransport.BotApiTransport, transport => internal.make({ transport })));
11
11
  //# sourceMappingURL=BotApi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAIhD,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAGjE;CAAG;AAcN,MAAM,CAAC,MAAM,IAAI,GAEE,QAAQ,CAAC,IAAI,CAAA;AAEhC,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,MAAM,EACN,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC/D,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAOnB,CACF,MAAc,EACd,SAAkB,SAAS,EAC3B,EAAE,CAAC,MAAM,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,CAAA"}
1
+ {"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAIhD,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAGjE;CAAG;AAUN,MAAM,CAAC,MAAM,UAAU,GAOnB,CACF,MAAc,EACd,SAAkB,SAAS,EAC3B,EAAE,CAAC,MAAM,CAAC,IAAI,CACd,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,GAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAC7C,CAAA;AAER,MAAM,CAAC,MAAM,IAAI,GAED,QAAQ,CAAC,IAAI,CAAA;AAE7B,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,MAAM,EACN,MAAM,CAAC,OAAO,CACZ,eAAe,CAAC,eAAe,EAC/B,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAC1C,CACF,CAAA"}
@@ -1,91 +1,66 @@
1
- import type * as Duration from 'effect/Duration';
2
- import type * as BotApi from './BotApi.ts';
3
- declare const BotApiError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
4
- readonly _tag: "@grom.js/effect-tg/BotApiError";
1
+ import type * as HttpBody from '@effect/platform/HttpBody';
2
+ import type * as HttpClientError from '@effect/platform/HttpClientError';
3
+ import type * as BotApiTransport from './BotApiTransport.ts';
4
+ import * as Duration from 'effect/Duration';
5
+ import * as Dialog from './Dialog.ts';
6
+ export declare const TypeId = "@grom.js/effect-tg/BotApiError";
7
+ export type TypeId = typeof TypeId;
8
+ export declare const isBotApiError: (u: unknown) => u is BotApiError;
9
+ export type BotApiError = TransportError | MethodFailed | GroupUpgraded | RateLimited | InternalServerError;
10
+ declare const TransportError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
11
+ readonly _tag: "TransportError";
5
12
  } & Readonly<A>;
6
13
  /**
7
- * Error returned from the Bot API server in case of unsuccessful method call.
14
+ * Error caused by the transport when accessing Bot API.
8
15
  */
9
- export declare class BotApiError extends BotApiError_base<{
10
- code: number;
11
- description: string;
12
- parameters?: BotApi.Types.ResponseParameters;
16
+ export declare class TransportError extends TransportError_base<{
17
+ cause: HttpClientError.HttpClientError | HttpBody.HttpBodyError;
13
18
  }> {
19
+ readonly [TypeId]: TypeId;
14
20
  get message(): string;
15
21
  }
16
- /**
17
- * Attempts to narrow a {@link BotApiError} to a more specific {@link KnownError}.
18
- *
19
- * **Warning!** Error types are detected based on the error code and message
20
- * returned from the Bot API, which are not guaranteed to be the same in
21
- * the future. If they change, this function may not determine error type
22
- * correctly.
23
- *
24
- * @see {@link https://github.com/tdlib/telegram-bot-api telegram-bot-api source code}
25
- */
26
- export declare const narrow: (error: BotApiError) => KnownError | BotApiError;
27
- export type KnownError = TooManyRequests | BotBlockedByUser | MessageNotModified | ReplyMarkupTooLong | QueryIdInvalid | MediaGroupedInvalid;
28
- declare const TooManyRequests_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
29
- readonly _tag: "@grom.js/effect-tg/BotApiError/TooManyRequests";
22
+ declare const MethodFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
23
+ readonly _tag: "MethodFailed";
30
24
  } & Readonly<A>;
31
- /**
32
- * Flood limit exceeded. Need to wait `retryAfter` before retrying.
33
- */
34
- export declare class TooManyRequests extends TooManyRequests_base<{
35
- cause: BotApiError;
36
- retryAfter: Duration.Duration;
37
- }> {
38
- }
39
- declare const BotBlockedByUser_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
40
- readonly _tag: "@grom.js/effect-tg/BotApiError/BotBlockedByUser";
41
- } & Readonly<A>;
42
- /**
43
- * Bot was blocked by the user.
44
- */
45
- export declare class BotBlockedByUser extends BotBlockedByUser_base<{
46
- cause: BotApiError;
47
- }> {
48
- }
49
- declare const MessageNotModified_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
50
- readonly _tag: "@grom.js/effect-tg/BotApiError/MessageNotModified";
51
- } & Readonly<A>;
52
- /**
53
- * Message was not modified as its content and reply markup
54
- * are exactly the same as the current one.
55
- */
56
- export declare class MessageNotModified extends MessageNotModified_base<{
57
- cause: BotApiError;
25
+ export declare class MethodFailed extends MethodFailed_base<{
26
+ response: FailureResponse;
27
+ possibleReason: MethodFailureReason;
58
28
  }> {
29
+ readonly [TypeId]: TypeId;
30
+ get message(): string;
59
31
  }
60
- declare const ReplyMarkupTooLong_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
61
- readonly _tag: "@grom.js/effect-tg/BotApiError/ReplyMarkupTooLong";
32
+ declare const GroupUpgraded_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
33
+ readonly _tag: "GroupUpgraded";
62
34
  } & Readonly<A>;
63
- /**
64
- * Message reply markup is too long.
65
- */
66
- export declare class ReplyMarkupTooLong extends ReplyMarkupTooLong_base<{
67
- cause: BotApiError;
35
+ export declare class GroupUpgraded extends GroupUpgraded_base<{
36
+ response: FailureResponse;
37
+ supergroup: Dialog.Supergroup;
68
38
  }> {
39
+ readonly [TypeId]: TypeId;
40
+ get message(): string;
69
41
  }
70
- declare const QueryIdInvalid_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
71
- readonly _tag: "@grom.js/effect-tg/BotApiError/QueryIdInvalid";
42
+ declare const RateLimited_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
43
+ readonly _tag: "RateLimited";
72
44
  } & Readonly<A>;
73
- /**
74
- * Query has expired, or ID is invalid.
75
- */
76
- export declare class QueryIdInvalid extends QueryIdInvalid_base<{
77
- cause: BotApiError;
45
+ export declare class RateLimited extends RateLimited_base<{
46
+ response: FailureResponse;
47
+ retryAfter: Duration.Duration;
78
48
  }> {
49
+ readonly [TypeId]: TypeId;
50
+ get message(): string;
79
51
  }
80
- declare const MediaGroupedInvalid_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
81
- readonly _tag: "@grom.js/effect-tg/BotApiError/MediaGroupedInvalid";
52
+ declare const InternalServerError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
53
+ readonly _tag: "InternalServerError";
82
54
  } & Readonly<A>;
83
- /**
84
- * Invalid combination of media types in the media group.
85
- */
86
- export declare class MediaGroupedInvalid extends MediaGroupedInvalid_base<{
87
- cause: BotApiError;
55
+ export declare class InternalServerError extends InternalServerError_base<{
56
+ response: FailureResponse;
88
57
  }> {
58
+ readonly [TypeId]: TypeId;
89
59
  }
60
+ export declare const fromResponse: (response: FailureResponse) => BotApiError;
61
+ export type MethodFailureReason = 'Unknown' | 'BotBlockedByUser' | 'MessageNotModified' | 'ReplyMarkupTooLong' | 'QueryIdInvalid' | 'MediaGroupedInvalid';
62
+ type FailureResponse = Extract<BotApiTransport.BotApiResponse, {
63
+ ok: false;
64
+ }>;
90
65
  export {};
91
66
  //# sourceMappingURL=BotApiError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApiError.d.ts","sourceRoot":"","sources":["../src/BotApiError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,KAAK,MAAM,MAAM,aAAa,CAAA;;;;AAI1C;;GAEG;AACH,qBAAa,WAAY,SAAQ,iBAAmD;IAClF,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAA;CAC7C,CAAC;IACA,IAAa,OAAO,WAEnB;CACF;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,UAAU,GAAG,WAA6B,CAAA;AAEvF,MAAM,MAAM,UAAU,GAChB,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,cAAc,GACd,mBAAmB,CAAA;;;;AAEzB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,qBAAmE;IACtG,KAAK,EAAE,WAAW,CAAA;IAClB,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAA;CAC9B,CAAC;CAAG;;;;AAEL;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,sBAAoE;IACxG,KAAK,EAAE,WAAW,CAAA;CACnB,CAAC;CAAG;;;;AAEL;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAsE;IAC5G,KAAK,EAAE,WAAW,CAAA;CACnB,CAAC;CAAG;;;;AAEL;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,wBAAsE;IAC5G,KAAK,EAAE,WAAW,CAAA;CACnB,CAAC;CAAG;;;;AAEL;;GAEG;AACH,qBAAa,cAAe,SAAQ,oBAAkE;IACpG,KAAK,EAAE,WAAW,CAAA;CACnB,CAAC;CAAG;;;;AAEL;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,yBAAuE;IAC9G,KAAK,EAAE,WAAW,CAAA;CACnB,CAAC;CAAG"}
1
+ {"version":3,"file":"BotApiError.d.ts","sourceRoot":"","sources":["../src/BotApiError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,KAAK,eAAe,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAE5D,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAI3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAGrC,eAAO,MAAM,MAAM,mCAAmC,CAAA;AAEtD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAA;AAElC,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,WAA+C,CAAA;AAE/F,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,WAAW,GACX,mBAAmB,CAAA;;;;AAEvB;;GAEG;AACH,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,KAAK,EACD,eAAe,CAAC,eAAe,GAC/B,QAAQ,CAAC,aAAa,CAAA;CAC3B,CAAC;IACA,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;IAElC,IAAa,OAAO,WAanB;CACF;;;;AAED,qBAAa,YAAa,SAAQ,kBAAiC;IACjE,QAAQ,EAAE,eAAe,CAAA;IACzB,cAAc,EAAE,mBAAmB,CAAA;CACpC,CAAC;IACA,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;IAElC,IAAa,OAAO,WAEnB;CACF;;;;AAED,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAA;CAC9B,CAAC;IACA,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;IAElC,IAAa,OAAO,WAEnB;CACF;;;;AAED,qBAAa,WAAY,SAAQ,iBAAgC;IAC/D,QAAQ,EAAE,eAAe,CAAA;IACzB,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAA;CAC9B,CAAC;IACA,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;IAElC,IAAa,OAAO,WAEnB;CACF;;;;AAED,qBAAa,mBAAoB,SAAQ,yBAAwC;IAC/E,QAAQ,EAAE,eAAe,CAAA;CAC1B,CAAC;IACA,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAS;CACnC;AAED,eAAO,MAAM,YAAY,GAAI,UAAU,eAAe,KAAG,WA2BxD,CAAA;AAED,MAAM,MAAM,mBAAmB,GAC3B,SAAS,GACT,kBAAkB,GAClB,oBAAoB,GACpB,oBAAoB,GACpB,gBAAgB,GAChB,qBAAqB,CAAA;AAEzB,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,cAAc,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,CAAA"}
@@ -1,53 +1,71 @@
1
1
  import * as Data from 'effect/Data';
2
+ import * as Duration from 'effect/Duration';
3
+ import * as Match from 'effect/Match';
4
+ import * as Option from 'effect/Option';
5
+ import * as Predicate from 'effect/Predicate';
6
+ import * as Dialog from "./Dialog.js";
2
7
  import * as internal from "./internal/botApiError.js";
8
+ export const TypeId = '@grom.js/effect-tg/BotApiError';
9
+ export const isBotApiError = (u) => Predicate.hasProperty(u, TypeId);
3
10
  /**
4
- * Error returned from the Bot API server in case of unsuccessful method call.
11
+ * Error caused by the transport when accessing Bot API.
5
12
  */
6
- export class BotApiError extends Data.TaggedError('@grom.js/effect-tg/BotApiError') {
13
+ export class TransportError extends Data.TaggedError('TransportError') {
14
+ [TypeId] = TypeId;
7
15
  get message() {
8
- return `(${this.code}) ${this.description}`;
16
+ return Match.value(this.cause).pipe(Match.tagsExhaustive({
17
+ RequestError: e => e.message,
18
+ ResponseError: e => e.message,
19
+ HttpBodyError: e => Match.value(e.reason).pipe(Match.tagsExhaustive({
20
+ SchemaError: e => e.error.message,
21
+ JsonError: e => `JsonError: ${e.error}`,
22
+ })),
23
+ }));
9
24
  }
10
25
  }
11
- /**
12
- * Attempts to narrow a {@link BotApiError} to a more specific {@link KnownError}.
13
- *
14
- * **Warning!** Error types are detected based on the error code and message
15
- * returned from the Bot API, which are not guaranteed to be the same in
16
- * the future. If they change, this function may not determine error type
17
- * correctly.
18
- *
19
- * @see {@link https://github.com/tdlib/telegram-bot-api telegram-bot-api source code}
20
- */
21
- export const narrow = internal.narrow;
22
- /**
23
- * Flood limit exceeded. Need to wait `retryAfter` before retrying.
24
- */
25
- export class TooManyRequests extends Data.TaggedError('@grom.js/effect-tg/BotApiError/TooManyRequests') {
26
- }
27
- /**
28
- * Bot was blocked by the user.
29
- */
30
- export class BotBlockedByUser extends Data.TaggedError('@grom.js/effect-tg/BotApiError/BotBlockedByUser') {
31
- }
32
- /**
33
- * Message was not modified as its content and reply markup
34
- * are exactly the same as the current one.
35
- */
36
- export class MessageNotModified extends Data.TaggedError('@grom.js/effect-tg/BotApiError/MessageNotModified') {
26
+ export class MethodFailed extends Data.TaggedError('MethodFailed') {
27
+ [TypeId] = TypeId;
28
+ get message() {
29
+ return `(${this.response.error_code}) ${this.response.description}`;
30
+ }
37
31
  }
38
- /**
39
- * Message reply markup is too long.
40
- */
41
- export class ReplyMarkupTooLong extends Data.TaggedError('@grom.js/effect-tg/BotApiError/ReplyMarkupTooLong') {
32
+ export class GroupUpgraded extends Data.TaggedError('GroupUpgraded') {
33
+ [TypeId] = TypeId;
34
+ get message() {
35
+ return `Group has been upgraded to a supergroup with ID ${this.supergroup.id}.`;
36
+ }
42
37
  }
43
- /**
44
- * Query has expired, or ID is invalid.
45
- */
46
- export class QueryIdInvalid extends Data.TaggedError('@grom.js/effect-tg/BotApiError/QueryIdInvalid') {
38
+ export class RateLimited extends Data.TaggedError('RateLimited') {
39
+ [TypeId] = TypeId;
40
+ get message() {
41
+ return `Flood limit exceeded. Should wait for ${Duration.format(this.retryAfter)} before retrying.`;
42
+ }
47
43
  }
48
- /**
49
- * Invalid combination of media types in the media group.
50
- */
51
- export class MediaGroupedInvalid extends Data.TaggedError('@grom.js/effect-tg/BotApiError/MediaGroupedInvalid') {
44
+ export class InternalServerError extends Data.TaggedError('InternalServerError') {
45
+ [TypeId] = TypeId;
52
46
  }
47
+ export const fromResponse = (response) => {
48
+ if (response.error_code === 429 && response.parameters?.retry_after != null) {
49
+ return new RateLimited({
50
+ response,
51
+ retryAfter: Duration.seconds(response.parameters.retry_after),
52
+ });
53
+ }
54
+ if (response.error_code === 400 && response.parameters?.migrate_to_chat_id != null) {
55
+ return new GroupUpgraded({
56
+ response,
57
+ supergroup: Dialog.supergroup(Option.getOrThrow(Dialog.decodePeerId('supergroup', response.parameters.migrate_to_chat_id))),
58
+ });
59
+ }
60
+ if (response.error_code >= 500) {
61
+ return new InternalServerError({ response });
62
+ }
63
+ return new MethodFailed({
64
+ response,
65
+ possibleReason: internal.guessReason({
66
+ code: response.error_code,
67
+ description: response.description,
68
+ }),
69
+ });
70
+ };
53
71
  //# sourceMappingURL=BotApiError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApiError.js","sourceRoot":"","sources":["../src/BotApiError.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,QAAQ,MAAM,2BAA2B,CAAA;AAErD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,IAAI,CAAC,WAAW,CAAC,gCAAgC,CAIhF;IACA,IAAa,OAAO;QAClB,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,CAAA;IAC7C,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,MAAM,GAAqD,QAAQ,CAAC,MAAM,CAAA;AAUvF;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,gDAAgD,CAGpG;CAAG;AAEL;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,iDAAiD,CAEtG;CAAG;AAEL;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,mDAAmD,CAE1G;CAAG;AAEL;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,mDAAmD,CAE1G;CAAG;AAEL;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,+CAA+C,CAElG;CAAG;AAEL;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,IAAI,CAAC,WAAW,CAAC,oDAAoD,CAE5G;CAAG"}
1
+ {"version":3,"file":"BotApiError.js","sourceRoot":"","sources":["../src/BotApiError.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,15 @@
1
- import type * as Types from './internal/botApiTypes.gen.ts';
1
+ import type * as BotApi from './BotApi.ts';
2
+ import type * as BotApiError from './BotApiError.ts';
2
3
  import * as HttpClient from '@effect/platform/HttpClient';
3
4
  import * as Context from 'effect/Context';
4
5
  import * as Effect from 'effect/Effect';
5
6
  import * as Layer from 'effect/Layer';
6
7
  import * as BotApiUrl from './BotApiUrl.ts';
7
- declare const BotApiTransport_base: Context.TagClass<BotApiTransport, "@grom.js/effect-tg/BotApiTransport", BotApiTransport.Service>;
8
+ declare const BotApiTransport_base: Context.TagClass<BotApiTransport, "@grom.js/effect-tg/BotApiTransport", Service>;
8
9
  export declare class BotApiTransport extends BotApiTransport_base {
9
10
  }
10
- export declare namespace BotApiTransport {
11
- interface Service {
12
- sendRequest: (method: string, params: unknown) => Effect.Effect<BotApiResponse, BotApiTransportError>;
13
- }
11
+ export interface Service {
12
+ sendRequest: (method: string, params: unknown) => Effect.Effect<BotApiResponse, BotApiError.TransportError>;
14
13
  }
15
14
  /**
16
15
  * @see https://core.telegram.org/bots/api#making-requests
@@ -23,18 +22,12 @@ export type BotApiResponse = {
23
22
  ok: false;
24
23
  error_code: number;
25
24
  description: string;
26
- parameters?: Types.ResponseParameters;
25
+ parameters?: BotApi.Types.ResponseParameters;
27
26
  };
28
- declare const BotApiTransportError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
29
- readonly _tag: "@grom.js/effect-tg/BotApiTransport/BotApiTransportError";
30
- } & Readonly<A>;
31
- /**
32
- * Error caused by the transport when accessing Bot API.
33
- */
34
- export declare class BotApiTransportError extends BotApiTransportError_base<{
35
- cause: unknown;
36
- }> {
37
- }
27
+ export declare const make: (options: {
28
+ httpClient: HttpClient.HttpClient;
29
+ botApiUrl: BotApiUrl.Service;
30
+ }) => Service;
38
31
  export declare const layer: Layer.Layer<BotApiTransport, never, HttpClient.HttpClient | BotApiUrl.BotApiUrl>;
39
32
  export {};
40
33
  //# sourceMappingURL=BotApiTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApiTransport.d.ts","sourceRoot":"","sources":["../src/BotApiTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;;AAG3C,qBAAa,eAAgB,SAAQ,oBAGlC;CAAG;AAEN,MAAM,CAAC,OAAO,WAAW,eAAe,CAAC;IACvC,UAAiB,OAAO;QACtB,WAAW,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,KACZ,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAA;KACzD;CACF;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IACA,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG;IACF,EAAE,EAAE,KAAK,CAAA;IACT,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAA;CACtC,CAAA;;;;AAEH;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,0BAA4E;IACpH,KAAK,EAAE,OAAO,CAAA;CACf,CAAC;CAAG;AAEL,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,eAAe,EACf,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAM5C,CAAA"}
1
+ {"version":3,"file":"BotApiTransport.d.ts","sourceRoot":"","sources":["../src/BotApiTransport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,KAAK,WAAW,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;;AAG3C,qBAAa,eAAgB,SAAQ,oBAGlC;CAAG;AAEN,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,KACZ,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,CAAA;CAC/D;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB;IACA,EAAE,EAAE,IAAI,CAAA;IACR,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG;IACF,EAAE,EAAE,KAAK,CAAA;IACT,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAA;CAC7C,CAAA;AAEH,eAAO,MAAM,IAAI,EAAE,CAAC,OAAO,EAAE;IAC3B,UAAU,EAAE,UAAU,CAAC,UAAU,CAAA;IACjC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAA;CAC7B,KAAK,OAAuB,CAAA;AAE7B,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,eAAe,EACf,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,SAAS,CAQ5C,CAAA"}
@@ -1,16 +1,11 @@
1
1
  import * as HttpClient from '@effect/platform/HttpClient';
2
2
  import * as Context from 'effect/Context';
3
- import * as Data from 'effect/Data';
4
3
  import * as Effect from 'effect/Effect';
5
4
  import * as Layer from 'effect/Layer';
6
5
  import * as BotApiUrl from "./BotApiUrl.js";
7
6
  import * as internal from "./internal/botApiTransport.js";
8
7
  export class BotApiTransport extends Context.Tag('@grom.js/effect-tg/BotApiTransport')() {
9
8
  }
10
- /**
11
- * Error caused by the transport when accessing Bot API.
12
- */
13
- export class BotApiTransportError extends Data.TaggedError('@grom.js/effect-tg/BotApiTransport/BotApiTransportError') {
14
- }
15
- export const layer = Layer.effect(BotApiTransport, Effect.all([HttpClient.HttpClient, BotApiUrl.BotApiUrl]).pipe(Effect.andThen(reqs => internal.make(...reqs))));
9
+ export const make = internal.make;
10
+ export const layer = Layer.effect(BotApiTransport, Effect.all([HttpClient.HttpClient, BotApiUrl.BotApiUrl]).pipe(Effect.andThen(([httpClient, botApiUrl]) => (internal.make({ httpClient, botApiUrl })))));
16
11
  //# sourceMappingURL=BotApiTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApiTransport.js","sourceRoot":"","sources":["../src/BotApiTransport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAEzD,MAAM,OAAO,eAAgB,SAAQ,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAGnF;CAAG;AA0BN;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,IAAI,CAAC,WAAW,CAAC,yDAAyD,CAElH;CAAG;AAEL,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,eAAe,EACf,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAC/C,CACF,CAAA"}
1
+ {"version":3,"file":"BotApiTransport.js","sourceRoot":"","sources":["../src/BotApiTransport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,QAAQ,MAAM,+BAA+B,CAAA;AAEzD,MAAM,OAAO,eAAgB,SAAQ,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAGnF;CAAG;AAwBN,MAAM,CAAC,MAAM,IAAI,GAGD,QAAQ,CAAC,IAAI,CAAA;AAE7B,MAAM,CAAC,MAAM,KAAK,GAId,KAAK,CAAC,MAAM,CACd,eAAe,EACf,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAC1C,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAC1C,CACF,CACF,CAAA"}
@@ -1,14 +1,12 @@
1
1
  import * as Context from 'effect/Context';
2
- declare const BotApiUrl_base: Context.TagClass<BotApiUrl, "@grom.js/effect-tg/BotApiUrl", BotApiUrl.Service>;
2
+ declare const BotApiUrl_base: Context.TagClass<BotApiUrl, "@grom.js/effect-tg/BotApiUrl", Service>;
3
3
  export declare class BotApiUrl extends BotApiUrl_base {
4
4
  }
5
- export declare namespace BotApiUrl {
6
- interface Service {
7
- toMethod: (method: string) => URL;
8
- toFile: (filePath: string) => URL;
9
- }
5
+ export interface Service {
6
+ toMethod: (method: string) => URL;
7
+ toFile: (filePath: string) => URL;
10
8
  }
11
- export declare const makeProd: (token: string) => BotApiUrl.Service;
12
- export declare const makeTest: (token: string) => BotApiUrl.Service;
9
+ export declare const makeProd: (token: string) => Service;
10
+ export declare const makeTest: (token: string) => Service;
13
11
  export {};
14
12
  //# sourceMappingURL=BotApiUrl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotApiUrl.d.ts","sourceRoot":"","sources":["../src/BotApiUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;;AAEzC,qBAAa,SAAU,SAAQ,cAG5B;CAAG;AAEN,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,UAAiB,OAAO;QACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,CAAA;QACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAA;KAClC;CACF;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,SAAS,CAAC,OAKlD,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,SAAS,CAAC,OAMlD,CAAA"}
1
+ {"version":3,"file":"BotApiUrl.d.ts","sourceRoot":"","sources":["../src/BotApiUrl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;;AAEzC,qBAAa,SAAU,SAAQ,cAG5B;CAAG;AAEN,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,CAAA;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAA;CAClC;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,OAKxC,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,OAMxC,CAAA"}