@grom.js/effect-tg 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -4
- package/dist/BotApi.d.ts +32 -0
- package/dist/BotApi.d.ts.map +1 -1
- package/dist/BotApi.js +16 -0
- package/dist/BotApi.js.map +1 -1
- package/package.json +1 -1
- package/src/BotApi.ts +62 -0
package/README.md
CHANGED
|
@@ -83,15 +83,22 @@ This design enables:
|
|
|
83
83
|
```ts
|
|
84
84
|
import { FetchHttpClient } from '@effect/platform'
|
|
85
85
|
import { BotApi, BotApiTransport, BotApiUrl } from '@grom.js/effect-tg'
|
|
86
|
-
import { Effect, Layer } from 'effect'
|
|
86
|
+
import { Config, Effect, Layer } from 'effect'
|
|
87
87
|
|
|
88
|
+
// Use a shortcut to construct BotApi
|
|
89
|
+
const BotApiLive = Layer.provide(
|
|
90
|
+
BotApi.layerConfig({ token: Config.redacted('BOT_TOKEN') }),
|
|
91
|
+
FetchHttpClient.layer
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
// Or provide all layers manually
|
|
88
95
|
const BotApiLive = BotApi.layer.pipe(
|
|
89
96
|
Layer.provide(BotApiTransport.layer),
|
|
90
97
|
Layer.provide(
|
|
91
|
-
Layer.
|
|
98
|
+
Layer.effect(
|
|
92
99
|
BotApiUrl.BotApiUrl,
|
|
93
|
-
|
|
94
|
-
)
|
|
100
|
+
Effect.map(Config.string('BOT_API_TOKEN'), BotApiUrl.makeProd)
|
|
101
|
+
),
|
|
95
102
|
),
|
|
96
103
|
Layer.provide(FetchHttpClient.layer),
|
|
97
104
|
)
|
package/dist/BotApi.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import type * as Config from 'effect/Config';
|
|
2
|
+
import type * as ConfigError from 'effect/ConfigError';
|
|
1
3
|
import type * as BotApiError from './BotApiError.ts';
|
|
2
4
|
import type { MethodParams, MethodResults, BotApi as Service, Types } from './internal/botApi.gen.ts';
|
|
5
|
+
import * as HttpClient from '@effect/platform/HttpClient';
|
|
3
6
|
import * as Context from 'effect/Context';
|
|
4
7
|
import * as Effect from 'effect/Effect';
|
|
5
8
|
import * as Layer from 'effect/Layer';
|
|
9
|
+
import * as Redacted from 'effect/Redacted';
|
|
6
10
|
import * as BotApiTransport from './BotApiTransport.ts';
|
|
7
11
|
export type { MethodParams, MethodResults, Service, Types };
|
|
8
12
|
declare const BotApi_base: Context.TagClass<BotApi, "@grom.js/effect-tg/BotApi", Service>;
|
|
@@ -17,4 +21,32 @@ export declare const make: (args: {
|
|
|
17
21
|
}) => Service;
|
|
18
22
|
export declare const layer: Layer.Layer<BotApi, never, BotApiTransport.BotApiTransport>;
|
|
19
23
|
type MethodArgs<TMethod extends keyof MethodParams> = void extends MethodParams[TMethod] ? [params?: MethodParams[TMethod]] : [params: MethodParams[TMethod]];
|
|
24
|
+
/**
|
|
25
|
+
* Constructs a `BotApi` layer from the given configuration.
|
|
26
|
+
*/
|
|
27
|
+
export declare const layerConfig: (options: {
|
|
28
|
+
/**
|
|
29
|
+
* Bot API token from [@BotFather](https://t.me/BotFather).
|
|
30
|
+
*/
|
|
31
|
+
readonly token: Config.Config<Redacted.Redacted>;
|
|
32
|
+
/**
|
|
33
|
+
* Target Bot API environment:
|
|
34
|
+
*
|
|
35
|
+
* - `prod` — production environment
|
|
36
|
+
* - `test` — [test environment](https://core.telegram.org/bots/features#dedicated-test-environment)
|
|
37
|
+
*
|
|
38
|
+
* @default 'prod'
|
|
39
|
+
*/
|
|
40
|
+
readonly environment?: "prod" | "test";
|
|
41
|
+
/**
|
|
42
|
+
* A function to transform the underlying `BotApiTransport` before
|
|
43
|
+
* it's used to call Bot API methods.
|
|
44
|
+
*
|
|
45
|
+
* Useful for:
|
|
46
|
+
* - Adding custom middleware (logging, metrics, caching)
|
|
47
|
+
* - Adding custom retry logic or error handling
|
|
48
|
+
* - Integrating with monitoring or debugging tools
|
|
49
|
+
*/
|
|
50
|
+
readonly transformTransport?: (transport: BotApiTransport.Service) => BotApiTransport.Service;
|
|
51
|
+
}) => Layer.Layer<BotApi, ConfigError.ConfigError, HttpClient.HttpClient>;
|
|
20
52
|
//# sourceMappingURL=BotApi.d.ts.map
|
package/dist/BotApi.d.ts.map
CHANGED
|
@@ -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,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;
|
|
1
|
+
{"version":3,"file":"BotApi.d.ts","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,WAAW,MAAM,oBAAoB,CAAA;AACtD,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,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AAIvD,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;AAErC;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS;IACnC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAEhD;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAEtC;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,OAAO,KAAK,eAAe,CAAC,OAAO,CAAA;CAC9F,KAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAyBrE,CAAA"}
|
package/dist/BotApi.js
CHANGED
|
@@ -1,11 +1,27 @@
|
|
|
1
|
+
import * as HttpClient from '@effect/platform/HttpClient';
|
|
1
2
|
import * as Context from 'effect/Context';
|
|
2
3
|
import * as Effect from 'effect/Effect';
|
|
4
|
+
import * as Function from 'effect/Function';
|
|
3
5
|
import * as Layer from 'effect/Layer';
|
|
6
|
+
import * as Redacted from 'effect/Redacted';
|
|
4
7
|
import * as BotApiTransport from "./BotApiTransport.js";
|
|
8
|
+
import * as BotApiUrl from "./BotApiUrl.js";
|
|
5
9
|
import * as internal from "./internal/botApi.js";
|
|
6
10
|
export class BotApi extends Context.Tag('@grom.js/effect-tg/BotApi')() {
|
|
7
11
|
}
|
|
8
12
|
export const callMethod = (method, params = undefined) => BotApi.pipe(Effect.flatMap(api => api[method](params)));
|
|
9
13
|
export const make = internal.make;
|
|
10
14
|
export const layer = Layer.effect(BotApi, Effect.andThen(BotApiTransport.BotApiTransport, transport => internal.make({ transport })));
|
|
15
|
+
/**
|
|
16
|
+
* Constructs a `BotApi` layer from the given configuration.
|
|
17
|
+
*/
|
|
18
|
+
export const layerConfig = (options) => {
|
|
19
|
+
const { token, environment = 'prod', transformTransport, } = options;
|
|
20
|
+
return Layer.provide(layer, Layer.effect(BotApiTransport.BotApiTransport, Effect.all([
|
|
21
|
+
HttpClient.HttpClient,
|
|
22
|
+
token.pipe(Effect.map(token => (environment === 'prod'
|
|
23
|
+
? BotApiUrl.makeProd(Redacted.value(token))
|
|
24
|
+
: BotApiUrl.makeTest(Redacted.value(token))))),
|
|
25
|
+
]).pipe(Effect.map(([httpClient, botApiUrl]) => BotApiTransport.make({ httpClient, botApiUrl })), Effect.map(transformTransport ?? Function.identity))));
|
|
26
|
+
};
|
|
11
27
|
//# sourceMappingURL=BotApi.js.map
|
package/dist/BotApi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BotApi.js","sourceRoot":"","sources":["../src/BotApi.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,eAAe,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,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;AAOD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OA0B3B,EAAuE,EAAE;IACxE,MAAM,EACJ,KAAK,EACL,WAAW,GAAG,MAAM,EACpB,kBAAkB,GACnB,GAAG,OAAO,CAAA;IACX,OAAO,KAAK,CAAC,OAAO,CAClB,KAAK,EACL,KAAK,CAAC,MAAM,CACV,eAAe,CAAC,eAAe,EAC/B,MAAM,CAAC,GAAG,CAAC;QACT,UAAU,CAAC,UAAU;QACrB,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAClB,WAAW,KAAK,MAAM;YACpB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAC9C,CAAC,CACH;KACF,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,EACxF,MAAM,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,CACpD,CACF,CACF,CAAA;AACH,CAAC,CAAA"}
|
package/package.json
CHANGED
package/src/BotApi.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type * as Config from 'effect/Config'
|
|
2
|
+
import type * as ConfigError from 'effect/ConfigError'
|
|
1
3
|
import type * as BotApiError from './BotApiError.ts'
|
|
2
4
|
import type {
|
|
3
5
|
MethodParams,
|
|
@@ -5,10 +7,14 @@ import type {
|
|
|
5
7
|
BotApi as Service,
|
|
6
8
|
Types,
|
|
7
9
|
} from './internal/botApi.gen.ts'
|
|
10
|
+
import * as HttpClient from '@effect/platform/HttpClient'
|
|
8
11
|
import * as Context from 'effect/Context'
|
|
9
12
|
import * as Effect from 'effect/Effect'
|
|
13
|
+
import * as Function from 'effect/Function'
|
|
10
14
|
import * as Layer from 'effect/Layer'
|
|
15
|
+
import * as Redacted from 'effect/Redacted'
|
|
11
16
|
import * as BotApiTransport from './BotApiTransport.ts'
|
|
17
|
+
import * as BotApiUrl from './BotApiUrl.ts'
|
|
12
18
|
import * as internal from './internal/botApi.ts'
|
|
13
19
|
|
|
14
20
|
export type { MethodParams, MethodResults, Service, Types }
|
|
@@ -60,3 +66,59 @@ type MethodArgs<TMethod extends keyof MethodParams> =
|
|
|
60
66
|
void extends MethodParams[TMethod]
|
|
61
67
|
? [params?: MethodParams[TMethod]]
|
|
62
68
|
: [params: MethodParams[TMethod]]
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Constructs a `BotApi` layer from the given configuration.
|
|
72
|
+
*/
|
|
73
|
+
export const layerConfig = (options: {
|
|
74
|
+
/**
|
|
75
|
+
* Bot API token from [@BotFather](https://t.me/BotFather).
|
|
76
|
+
*/
|
|
77
|
+
readonly token: Config.Config<Redacted.Redacted>
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Target Bot API environment:
|
|
81
|
+
*
|
|
82
|
+
* - `prod` — production environment
|
|
83
|
+
* - `test` — [test environment](https://core.telegram.org/bots/features#dedicated-test-environment)
|
|
84
|
+
*
|
|
85
|
+
* @default 'prod'
|
|
86
|
+
*/
|
|
87
|
+
readonly environment?: 'prod' | 'test'
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* A function to transform the underlying `BotApiTransport` before
|
|
91
|
+
* it's used to call Bot API methods.
|
|
92
|
+
*
|
|
93
|
+
* Useful for:
|
|
94
|
+
* - Adding custom middleware (logging, metrics, caching)
|
|
95
|
+
* - Adding custom retry logic or error handling
|
|
96
|
+
* - Integrating with monitoring or debugging tools
|
|
97
|
+
*/
|
|
98
|
+
readonly transformTransport?: (transport: BotApiTransport.Service) => BotApiTransport.Service
|
|
99
|
+
}): Layer.Layer<BotApi, ConfigError.ConfigError, HttpClient.HttpClient> => {
|
|
100
|
+
const {
|
|
101
|
+
token,
|
|
102
|
+
environment = 'prod',
|
|
103
|
+
transformTransport,
|
|
104
|
+
} = options
|
|
105
|
+
return Layer.provide(
|
|
106
|
+
layer,
|
|
107
|
+
Layer.effect(
|
|
108
|
+
BotApiTransport.BotApiTransport,
|
|
109
|
+
Effect.all([
|
|
110
|
+
HttpClient.HttpClient,
|
|
111
|
+
token.pipe(
|
|
112
|
+
Effect.map(token => (
|
|
113
|
+
environment === 'prod'
|
|
114
|
+
? BotApiUrl.makeProd(Redacted.value(token))
|
|
115
|
+
: BotApiUrl.makeTest(Redacted.value(token))
|
|
116
|
+
)),
|
|
117
|
+
),
|
|
118
|
+
]).pipe(
|
|
119
|
+
Effect.map(([httpClient, botApiUrl]) => BotApiTransport.make({ httpClient, botApiUrl })),
|
|
120
|
+
Effect.map(transformTransport ?? Function.identity),
|
|
121
|
+
),
|
|
122
|
+
),
|
|
123
|
+
)
|
|
124
|
+
}
|