@effect-ak/tg-bot-client 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,73 +1,54 @@
1
- // src/bot/factory/_service.ts
1
+ // src/bot/internal/launch.ts
2
2
  import * as Micro6 from "effect/Micro";
3
- import * as Context4 from "effect/Context";
3
+ import * as Context6 from "effect/Context";
4
4
 
5
- // src/bot/message-handler/_service.ts
5
+ // src/client/config.ts
6
6
  import * as Context from "effect/Context";
7
- var BotMessageHandler = class extends Context.Tag("BotMessageHandler")() {
8
- };
9
-
10
- // src/bot/update-poller/_service.ts
11
- import * as Micro4 from "effect/Micro";
12
- import * as Context3 from "effect/Context";
13
7
 
14
- // src/bot/update-poller/poll-updates.ts
15
- import * as Micro3 from "effect/Micro";
8
+ // src/const.ts
9
+ var defaultBaseUrl = "https://api.telegram.org";
10
+ var MESSAGE_EFFECTS = {
11
+ "\u{1F525}": "5104841245755180586",
12
+ "\u{1F44D}": "5107584321108051014",
13
+ "\u{1F44E}": "5104858069142078462",
14
+ "\u2764\uFE0F": "5159385139981059251",
15
+ "\u{1F389}": "5046509860389126442",
16
+ "\u{1F4A9}": "5046589136895476101"
17
+ };
18
+ var messageEffectIdCodes = Object.keys(MESSAGE_EFFECTS);
19
+ var isMessageEffect = (input) => {
20
+ return typeof input === "string" && input in MESSAGE_EFFECTS;
21
+ };
16
22
 
17
- // src/bot/update-poller/settings.ts
18
- var makeSettingsFrom = (input) => {
19
- let limit = input.batch_size ?? 10;
20
- let timeout = input.timeout ?? 10;
21
- let max_empty_responses = input.max_empty_responses;
22
- let log_level = input.log_level;
23
- let on_error = input.on_error;
24
- if (limit < 10 || limit > 100) {
25
- console.warn("Wrong limit, must be in [10..100], using 10 instead");
26
- limit = 10;
27
- }
28
- if (timeout < 2 || timeout > 10) {
29
- console.warn("Wrong timeout, must be in [2..10], using 2 instead");
30
- limit = 10;
31
- }
32
- if (max_empty_responses && max_empty_responses < 2) {
33
- console.warn("Wrong max_empty_responses, must be in [2..infinity], using infinity");
34
- max_empty_responses = void 0;
35
- }
36
- if (max_empty_responses && max_empty_responses < 2) {
37
- console.warn("Wrong max_empty_responses, must be in [2..infinity], using infinity");
38
- max_empty_responses = void 0;
39
- }
40
- if (!log_level) {
41
- log_level = "info";
42
- }
43
- if (!on_error) {
44
- on_error = "stop";
45
- }
46
- const config = {
47
- limit,
48
- timeout,
49
- max_empty_responses,
50
- log_level,
51
- on_error
52
- };
53
- console.log("bot configuration", config);
54
- return config;
23
+ // src/client/config.ts
24
+ var makeTgBotClientConfig = (input) => TgBotClientConfig.of({
25
+ ...input,
26
+ base_url: input.base_url ?? defaultBaseUrl
27
+ });
28
+ var TgBotClientConfig = class extends Context.Tag("TgBotClientConfig")() {
55
29
  };
56
30
 
57
- // src/bot/update-poller/fetch-and-handle.ts
58
- import * as Micro2 from "effect/Micro";
31
+ // src/bot/internal/types.ts
59
32
  import * as Data from "effect/Data";
60
-
61
- // src/bot/message-handler/types.ts
62
- import { TaggedClass } from "effect/Data";
63
- var BotResponse = class _BotResponse extends TaggedClass("BotResponse") {
33
+ import * as Context2 from "effect/Context";
34
+ var BotResponse = class _BotResponse extends Data.TaggedClass("BotResponse") {
64
35
  static make(result) {
65
36
  return new _BotResponse({ response: result });
66
37
  }
67
38
  static ignore = new _BotResponse({});
68
39
  };
40
+ var BotUpdateHandlersTag = class extends Context2.Tag("BotUpdateHandlers")() {
41
+ };
69
42
 
70
- // src/bot/message-handler/utils.ts
43
+ // src/bot/service/run.ts
44
+ import * as Micro4 from "effect/Micro";
45
+ import * as Context5 from "effect/Context";
46
+
47
+ // src/bot/internal/handle-update.ts
48
+ import * as Micro2 from "effect/Micro";
49
+ import * as Data3 from "effect/Data";
50
+
51
+ // src/bot/internal/utils.ts
71
52
  var extractUpdate = (input) => {
72
53
  for (const [field, value] of Object.entries(input)) {
73
54
  if (field == "update_id") {
@@ -96,32 +77,6 @@ var TgBotClientError = class _TgBotClientError extends TaggedError("TgBotClientE
96
77
  });
97
78
  };
98
79
 
99
- // src/client/config.ts
100
- import * as Context2 from "effect/Context";
101
-
102
- // src/const.ts
103
- var defaultBaseUrl = "https://api.telegram.org";
104
- var MESSAGE_EFFECTS = {
105
- "\u{1F525}": "5104841245755180586",
106
- "\u{1F44D}": "5107584321108051014",
107
- "\u{1F44E}": "5104858069142078462",
108
- "\u2764\uFE0F": "5159385139981059251",
109
- "\u{1F389}": "5046509860389126442",
110
- "\u{1F4A9}": "5046589136895476101"
111
- };
112
- var messageEffectIdCodes = Object.keys(MESSAGE_EFFECTS);
113
- var isMessageEffect = (input) => {
114
- return typeof input === "string" && input in MESSAGE_EFFECTS;
115
- };
116
-
117
- // src/client/config.ts
118
- var makeTgBotClientConfig = (input) => TgBotClientConfig.of({
119
- ...input,
120
- base_url: input.base_url ?? defaultBaseUrl
121
- });
122
- var TgBotClientConfig = class extends Context2.Tag("TgBotClientConfig")() {
123
- };
124
-
125
80
  // src/client/guards.ts
126
81
  var isFileContent = (input) => typeof input == "object" && input != null && ("file_content" in input && input.file_content instanceof Uint8Array) && ("file_name" in input && typeof input.file_name == "string");
127
82
  var isTgBotApiResponse = (input) => typeof input == "object" && input != null && ("ok" in input && typeof input.ok == "boolean");
@@ -183,60 +138,129 @@ var execute = (method, input) => Micro.gen(function* () {
183
138
  return response.result;
184
139
  });
185
140
 
186
- // src/bot/update-poller/fetch-and-handle.ts
187
- var HandleUpdateError = class extends Data.TaggedError("HandleUpdateError") {
141
+ // src/bot/internal/poll-settings.ts
142
+ import * as Context3 from "effect/Context";
143
+ import * as Data2 from "effect/Data";
144
+ var BotPollSettings = class _BotPollSettings extends Data2.Class {
145
+ static make(input) {
146
+ let batch_size = input.batch_size ?? 10;
147
+ let poll_timeout = input.poll_timeout ?? 10;
148
+ let max_empty_responses = input.max_empty_responses;
149
+ let log_level = input.log_level ?? "info";
150
+ let on_error = input.on_error;
151
+ if (batch_size < 10 || batch_size > 100) {
152
+ console.warn("Wrong batch_size, must be in [10..100], using 10 instead");
153
+ batch_size = 10;
154
+ }
155
+ if (poll_timeout < 2 || poll_timeout > 10) {
156
+ console.warn("Wrong poll_timeout, must be in [2..10], using 2 instead");
157
+ poll_timeout = 10;
158
+ }
159
+ if (max_empty_responses && max_empty_responses < 2) {
160
+ console.warn("Wrong max_empty_responses, must be in [2..infinity], using infinity");
161
+ max_empty_responses = void 0;
162
+ }
163
+ if (!log_level) {
164
+ log_level = "info";
165
+ }
166
+ if (!on_error) {
167
+ on_error = "stop";
168
+ }
169
+ const config = new _BotPollSettings({
170
+ batch_size,
171
+ poll_timeout,
172
+ max_empty_responses,
173
+ log_level,
174
+ on_error
175
+ });
176
+ console.log("bot poll settings", config);
177
+ return config;
178
+ }
188
179
  };
189
- var fetchAndHandle = ({ state, settings, handlers }) => Micro2.gen(function* () {
190
- const updateId = state.lastUpdateId;
191
- if (settings.log_level == "debug") {
192
- console.debug("getting updates", state);
180
+ var BotPollSettingsTag = class extends Context3.Reference()(
181
+ "BotSettings",
182
+ {
183
+ defaultValue() {
184
+ return BotPollSettings.make({});
185
+ }
193
186
  }
194
- const updates = yield* execute("get_updates", {
195
- ...settings,
196
- ...updateId ? { offset: updateId } : void 0
197
- }).pipe(
198
- Micro2.andThen((_) => _.sort((_2) => _2.update_id))
199
- );
200
- if (updates.length) {
201
- console.debug(`got a batch of updates (${updates.length})`);
187
+ ) {
188
+ };
189
+
190
+ // src/bot/internal/handle-update.ts
191
+ var BatchUpdateResult = class extends Data3.Class {
192
+ };
193
+ var handleUpdates = (updates) => Micro2.gen(function* () {
194
+ const pollSettings = yield* Micro2.service(BotPollSettingsTag);
195
+ const updateHandler = yield* Micro2.service(BotUpdateHandlersTag);
196
+ if (updateHandler.type == "single") {
197
+ return yield* handleOneByOne(updates, updateHandler, pollSettings);
198
+ } else {
199
+ return yield* handleEntireBatch(updates, updateHandler, pollSettings);
202
200
  }
203
- const lastUpdateId = updates.map((_) => _.update_id).sort().at(-1);
204
- if (!lastUpdateId) return { updates: [], lastUpdateId: void 0 };
205
- const hasError = yield* Micro2.forEach(
206
- updates,
207
- (update) => handleUpdate(update, settings, handlers).pipe(
208
- Micro2.catchAll((error) => {
209
- console.log("error", {
210
- updateId: update.update_id,
211
- updateKey: Object.keys(update).at(1),
212
- name: error._tag
213
- });
214
- return Micro2.succeed(void 0);
215
- })
216
- ),
217
- {
218
- concurrency: 10
201
+ });
202
+ var handleEntireBatch = (updates, handlers, pollSettings) => Micro2.try({
203
+ try: () => handlers.on_batch(updates),
204
+ catch: (_) => _
205
+ }).pipe(
206
+ Micro2.andThen((result) => {
207
+ if (result instanceof Promise) {
208
+ return Micro2.tryPromise({
209
+ try: () => result,
210
+ catch: (_) => _
211
+ });
212
+ } else {
213
+ return Micro2.succeed(result);
219
214
  }
220
- ).pipe(
221
- Micro2.andThen((batchResult) => {
222
- if (settings.log_level == "debug") {
223
- console.debug("handle batch result", batchResult);
224
- }
225
- return !batchResult.every((error) => error == null);
215
+ }),
216
+ Micro2.andThen(
217
+ (doNext) => new BatchUpdateResult({
218
+ hasErrors: !doNext,
219
+ updates
226
220
  })
227
- );
228
- if (lastUpdateId) {
229
- yield* execute("get_updates", {
230
- offset: lastUpdateId,
231
- limit: 0
221
+ ),
222
+ Micro2.catchAll((error) => {
223
+ console.log("handle batch error", {
224
+ errorMessage: error instanceof Error ? error.message : void 0,
225
+ updates: updates.map((_) => Object.keys(_).at(1))
232
226
  });
233
- if (settings.log_level == "debug") {
234
- console.debug("committed offset", lastUpdateId);
235
- }
227
+ return Micro2.succeed(
228
+ new BatchUpdateResult({
229
+ hasErrors: true,
230
+ updates
231
+ })
232
+ );
233
+ })
234
+ );
235
+ var HandleUpdateError = class extends Data3.TaggedError("HandleUpdateError") {
236
+ };
237
+ var handleOneByOne = (updates, handlers, pollSettings) => Micro2.forEach(
238
+ updates,
239
+ (update) => handleOneUpdate(update, handlers).pipe(
240
+ Micro2.catchAll((error) => {
241
+ console.log("update handle error", {
242
+ updateId: update.update_id,
243
+ updateKey: Object.keys(update).at(1),
244
+ name: error._tag
245
+ });
246
+ return Micro2.succeed(error);
247
+ })
248
+ ),
249
+ {
250
+ concurrency: 10
236
251
  }
237
- return { updates, lastUpdateId, hasError };
238
- });
239
- var handleUpdate = (updateObject, settings, handlers) => Micro2.gen(function* () {
252
+ ).pipe(
253
+ Micro2.andThen((batchResult) => {
254
+ if (pollSettings.log_level == "debug") {
255
+ console.debug("handle batch result", batchResult);
256
+ }
257
+ return new BatchUpdateResult({
258
+ hasErrors: !batchResult.every((error) => error == null),
259
+ updates
260
+ });
261
+ })
262
+ );
263
+ var handleOneUpdate = (updateObject, handlers) => Micro2.gen(function* () {
240
264
  const update = extractUpdate(updateObject);
241
265
  if (!update) {
242
266
  return yield* Micro2.fail(
@@ -246,8 +270,8 @@ var handleUpdate = (updateObject, settings, handlers) => Micro2.gen(function* ()
246
270
  })
247
271
  );
248
272
  }
249
- const handler = handlers[`on_${update.type}`];
250
- if (!handler) {
273
+ const updateHandler = handlers[`on_${update.type}`];
274
+ if (!updateHandler) {
251
275
  return yield* Micro2.fail(
252
276
  new HandleUpdateError({
253
277
  name: "HandlerNotDefined",
@@ -264,7 +288,7 @@ var handleUpdate = (updateObject, settings, handlers) => Micro2.gen(function* ()
264
288
  }
265
289
  let handleUpdateError;
266
290
  const handleResult = yield* Micro2.try({
267
- try: () => handler(update),
291
+ try: () => updateHandler(update),
268
292
  catch: (error) => new HandleUpdateError({
269
293
  name: "BotHandlerError",
270
294
  update: updateObject,
@@ -305,7 +329,8 @@ var handleUpdate = (updateObject, settings, handlers) => Micro2.gen(function* ()
305
329
  );
306
330
  })
307
331
  );
308
- if (!handleResult && settings.log_level == "debug") {
332
+ const pollSettings = yield* Micro2.service(BotPollSettingsTag);
333
+ if (!handleResult && pollSettings.log_level == "debug") {
309
334
  console.log(`Bot response is undefined for update with ID #${updateObject.update_id}.`);
310
335
  return;
311
336
  }
@@ -315,87 +340,144 @@ var handleUpdate = (updateObject, settings, handlers) => Micro2.gen(function* ()
315
340
  ...handleResult.response,
316
341
  chat_id: update.chat.id
317
342
  });
318
- if (settings.log_level == "debug" && "text") {
343
+ if (pollSettings.log_level == "debug" && "text") {
319
344
  console.debug("bot response", response);
320
345
  }
321
346
  }
322
347
  return handleUpdateError;
323
348
  });
324
349
 
325
- // src/bot/update-poller/poll-updates.ts
326
- var pollUpdates = (input) => {
327
- const state = {
328
- lastUpdateId: void 0,
329
- emptyResponses: 0
330
- };
331
- const settings = makeSettingsFrom(input.settings);
332
- return Micro3.delay(1e3)(
333
- fetchAndHandle({
334
- state,
335
- settings,
336
- handlers: input.settings
337
- })
338
- ).pipe(
339
- Micro3.repeat({
340
- while: ({ updates, lastUpdateId, hasError }) => {
341
- if (hasError === true && settings.on_error == "stop") {
342
- console.info("Could not handle some messages, quitting");
343
- return false;
344
- }
345
- if (updates.length == 0) {
346
- state.emptyResponses += 1;
347
- if (settings.max_empty_responses && state.emptyResponses > settings.max_empty_responses) {
348
- console.info("too many empty responses, quitting");
349
- return false;
350
- }
351
- } else {
352
- state.emptyResponses = 0;
353
- }
354
- ;
355
- if (lastUpdateId) {
356
- state.lastUpdateId = lastUpdateId + 1;
357
- }
358
- return true;
359
- }
360
- })
361
- );
350
+ // src/bot/service/fetch-updates.ts
351
+ import * as Micro3 from "effect/Micro";
352
+ import * as Data4 from "effect/Data";
353
+ import * as Context4 from "effect/Context";
354
+ var BotFetchUpdatesService = class extends Context4.Reference()(
355
+ "BotFetchUpdatesService",
356
+ {
357
+ defaultValue: () => {
358
+ const state = {
359
+ lastUpdateId: void 0,
360
+ emptyResponses: 0
361
+ };
362
+ const fetchUpdates = _fetchUpdates(state).pipe(
363
+ Micro3.tap((updates) => {
364
+ const id = updates.map((_) => _.update_id).sort().at(-1);
365
+ console.log("updating last update id", id);
366
+ state.lastUpdateId = id ? id + 1 : void 0;
367
+ console.log(state);
368
+ })
369
+ );
370
+ const commit = _commitLastBatch(state);
371
+ return {
372
+ state,
373
+ fetchUpdates,
374
+ commit
375
+ };
376
+ }
377
+ }
378
+ ) {
362
379
  };
363
-
364
- // src/bot/update-poller/_service.ts
365
- var BotUpdatePollerService = class extends Context3.Tag("BotUpdatePollerService")() {
380
+ var FetchUpdatesError = class extends Data4.TaggedError("FetchUpdatesError") {
366
381
  };
367
- var BotUpdatesPollerServiceDefault = Micro4.gen(function* () {
368
- console.log("Initiating BotUpdatesPollerServiceDefault");
369
- const state = {
370
- fiber: void 0
371
- };
372
- const runBot = Micro4.gen(function* () {
373
- console.log("run bot");
374
- const messageHandler = yield* Micro4.service(BotMessageHandler);
375
- const startFiber = pollUpdates({
376
- settings: messageHandler
382
+ var _fetchUpdates = (pollState) => Micro3.gen(function* () {
383
+ const pollSettings = yield* Micro3.service(BotPollSettingsTag);
384
+ if (pollSettings.max_empty_responses && pollState.emptyResponses == pollSettings.max_empty_responses) {
385
+ return yield* Micro3.fail(
386
+ new FetchUpdatesError({ name: "TooManyEmptyResponses" })
387
+ );
388
+ }
389
+ const updateId = pollState.lastUpdateId;
390
+ if (pollSettings.log_level == "debug") {
391
+ console.debug("getting updates", pollState);
392
+ }
393
+ const updates = yield* execute("get_updates", {
394
+ timeout: pollSettings.poll_timeout,
395
+ ...updateId ? { offset: updateId } : void 0
396
+ }).pipe(
397
+ Micro3.andThen((_) => _.sort((_2) => _2.update_id))
398
+ );
399
+ if (updates.length) {
400
+ console.debug(`got a batch of updates (${updates.length})`);
401
+ pollState.emptyResponses = 0;
402
+ return updates;
403
+ } else {
404
+ pollState.emptyResponses += 1;
405
+ return [];
406
+ }
407
+ });
408
+ var _commitLastBatch = (pollState) => Micro3.gen(function* () {
409
+ console.log("commit", { pollState });
410
+ if (pollState.lastUpdateId) {
411
+ return yield* execute("get_updates", {
412
+ offset: pollState.lastUpdateId,
413
+ limit: 0
377
414
  }).pipe(
378
- Micro4.forkDaemon,
379
- Micro4.tap(
380
- (fiber) => fiber.addObserver((exit) => {
381
- console.log("bot's fiber has been closed", exit);
415
+ Micro3.andThen(
416
+ Micro3.andThen(Micro3.service(BotPollSettingsTag), (pollSettings) => {
417
+ if (pollSettings.log_level == "debug") {
418
+ console.debug("committed offset", pollState);
419
+ }
382
420
  })
383
421
  )
384
422
  );
385
- if (state.fiber) {
386
- console.log("killing previous bot's fiber");
387
- yield* Micro4.fiberInterrupt(state.fiber);
423
+ } else {
424
+ return yield* Micro3.fail(new FetchUpdatesError({
425
+ name: "NoUpdatesToCommit"
426
+ }));
427
+ }
428
+ });
429
+
430
+ // src/bot/service/run.ts
431
+ var BotRunService = class extends Context5.Reference()(
432
+ "BotRunService",
433
+ {
434
+ defaultValue: () => {
435
+ console.log("Initiating BotRunService");
436
+ const state = {
437
+ fiber: void 0
438
+ };
439
+ const runBotInBackground = _runBotDaemon(state);
440
+ const getFiber = () => state.fiber;
441
+ return {
442
+ runBotInBackground,
443
+ getFiber
444
+ };
388
445
  }
389
- state.fiber = yield* startFiber;
390
- console.log("Fetching bot updates via long polling...");
391
- });
392
- return {
393
- runBot,
394
- getFiber: () => state.fiber
395
- };
446
+ }
447
+ ) {
448
+ };
449
+ var _runBotDaemon = (state) => Micro4.gen(function* () {
450
+ console.log("run bot");
451
+ const fetchService = yield* Micro4.service(BotFetchUpdatesService);
452
+ const startFiber = Micro4.delay(1e3)(
453
+ fetchService.fetchUpdates.pipe(
454
+ Micro4.andThen(
455
+ (updates) => handleUpdates(updates)
456
+ ),
457
+ Micro4.tap(
458
+ ({ updates }) => updates.length > 0 ? fetchService.commit : Micro4.void
459
+ )
460
+ )
461
+ ).pipe(
462
+ Micro4.repeat({
463
+ while: (_) => !_.hasErrors
464
+ }),
465
+ Micro4.forkDaemon,
466
+ Micro4.tap(
467
+ (fiber) => fiber.addObserver((exit) => {
468
+ console.log("bot's fiber has been closed", exit);
469
+ })
470
+ )
471
+ );
472
+ if (state.fiber) {
473
+ console.log("killing previous bot's fiber");
474
+ yield* Micro4.fiberInterrupt(state.fiber);
475
+ }
476
+ state.fiber = yield* startFiber;
477
+ console.log("Fetching bot updates via long polling...");
396
478
  });
397
479
 
398
- // src/bot/factory/client-config.ts
480
+ // src/bot/internal/client-config.ts
399
481
  import * as Micro5 from "effect/Micro";
400
482
  var makeClientConfigFrom = (input) => Micro5.gen(function* () {
401
483
  if (input.type == "config") {
@@ -417,35 +499,29 @@ var makeClientConfigFrom = (input) => Micro5.gen(function* () {
417
499
  return makeTgBotClientConfig(config);
418
500
  });
419
501
 
420
- // src/bot/factory/_service.ts
421
- var BotFactoryService = class extends Context4.Tag("BotFactoryService")() {
422
- };
423
- var BotFactoryServiceDefault = {
424
- runBot: (input) => Micro6.gen(function* () {
425
- const client = Context4.make(TgBotClientConfig, yield* makeClientConfigFrom(input));
426
- const poller = yield* BotUpdatesPollerServiceDefault.pipe(
427
- Micro6.provideContext(client)
428
- );
429
- yield* poller.runBot.pipe(
430
- Micro6.provideService(BotMessageHandler, input),
431
- Micro6.provideContext(client)
432
- );
433
- const reload = (input2) => poller.runBot.pipe(
434
- Micro6.provideService(BotMessageHandler, input2),
435
- Micro6.provideContext(client),
436
- Micro6.runPromise
437
- );
438
- return {
439
- reload,
440
- fiber: poller.getFiber
441
- };
442
- })
443
- };
502
+ // src/bot/internal/launch.ts
503
+ var launchBot = (input) => Micro6.gen(function* () {
504
+ const clientConfig = Context6.make(TgBotClientConfig, yield* makeClientConfigFrom(input));
505
+ const service8 = yield* Micro6.service(BotRunService);
506
+ yield* service8.runBotInBackground.pipe(
507
+ Micro6.provideContext(clientConfig),
508
+ Micro6.provideService(BotUpdateHandlersTag, input.mode),
509
+ Micro6.provideService(BotPollSettingsTag, BotPollSettings.make(input.poll ?? {}))
510
+ );
511
+ const reload = (mode) => service8.runBotInBackground.pipe(
512
+ Micro6.provideService(BotUpdateHandlersTag, mode),
513
+ Micro6.provideContext(clientConfig),
514
+ Micro6.runPromise
515
+ );
516
+ return {
517
+ reload,
518
+ fiber: service8.getFiber
519
+ };
520
+ });
444
521
 
445
522
  // src/bot/run.ts
446
523
  import * as Micro7 from "effect/Micro";
447
- var runTgChatBot = (input) => BotFactoryServiceDefault.runBot(input).pipe(
448
- Micro7.provideService(BotMessageHandler, input),
524
+ var runTgChatBot = (input) => launchBot(input).pipe(
449
525
  Micro7.runPromise
450
526
  );
451
527
 
@@ -454,7 +530,7 @@ import * as Micro10 from "effect/Micro";
454
530
 
455
531
  // src/client/file/_service.ts
456
532
  import * as Micro9 from "effect/Micro";
457
- import * as Context5 from "effect/Context";
533
+ import * as Context7 from "effect/Context";
458
534
 
459
535
  // src/client/file/get-file.ts
460
536
  import * as Micro8 from "effect/Micro";
@@ -485,7 +561,7 @@ var getFile = (fileId) => Micro8.gen(function* () {
485
561
  });
486
562
 
487
563
  // src/client/file/_service.ts
488
- var ClientFileService = class extends Context5.Tag("ClientFileService")() {
564
+ var ClientFileService = class extends Context7.Tag("ClientFileService")() {
489
565
  };
490
566
  var ClientFileServiceDefault = Micro9.gen(function* () {
491
567
  return {
@@ -516,14 +592,13 @@ var makeTgBotClient = (input) => {
516
592
  return client;
517
593
  };
518
594
  export {
519
- BotFactoryService,
520
- BotFactoryServiceDefault,
521
595
  BotResponse,
522
- BotUpdatePollerService,
523
- BotUpdatesPollerServiceDefault,
596
+ BotRunService,
597
+ BotUpdateHandlersTag,
524
598
  MESSAGE_EFFECTS,
525
599
  defaultBaseUrl,
526
600
  isMessageEffect,
601
+ launchBot,
527
602
  makeTgBotClient,
528
603
  messageEffectIdCodes,
529
604
  runTgChatBot
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@effect-ak/tg-bot-client",
3
- "version": "0.4.2",
4
- "homepage": "https://effect-ak.github.io/telegram-bot-client",
3
+ "version": "0.5.0",
4
+ "homepage": "https://effect-ak.github.io/telegram-bot-playground/",
5
5
  "author": {
6
6
  "name": "Aleksandr Kondaurov",
7
7
  "email": "kondaurov.dev@gmail.com"