max-nestjs 0.0.4 → 0.0.6

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 (82) hide show
  1. package/dist/constants.d.ts +20 -0
  2. package/dist/constants.js +29 -0
  3. package/dist/constants.js.map +1 -0
  4. package/dist/{max-user.decorator.js → decorators/auth.js} +2 -2
  5. package/dist/decorators/auth.js.map +1 -0
  6. package/dist/decorators/common.d.ts +28 -0
  7. package/dist/decorators/common.js +42 -0
  8. package/dist/decorators/common.js.map +1 -0
  9. package/dist/decorators/index.d.ts +2 -0
  10. package/dist/decorators/index.js +19 -0
  11. package/dist/decorators/index.js.map +1 -0
  12. package/dist/execution-context.d.ts +20 -0
  13. package/dist/execution-context.js +43 -0
  14. package/dist/execution-context.js.map +1 -0
  15. package/dist/guards/auth.guard.d.ts +9 -0
  16. package/dist/guards/auth.guard.js +41 -0
  17. package/dist/guards/auth.guard.js.map +1 -0
  18. package/dist/index.d.ts +11 -7
  19. package/dist/index.js +24 -7
  20. package/dist/index.js.map +1 -1
  21. package/dist/interfaces.d.ts +44 -0
  22. package/dist/{max.interface.js → interfaces.js} +1 -1
  23. package/dist/interfaces.js.map +1 -0
  24. package/dist/max.module.d.ts +21 -3
  25. package/dist/max.module.js +151 -28
  26. package/dist/max.module.js.map +1 -1
  27. package/dist/params.factory.d.ts +7 -0
  28. package/dist/params.factory.js +31 -0
  29. package/dist/params.factory.js.map +1 -0
  30. package/dist/scenes/base-scene.d.ts +22 -0
  31. package/dist/scenes/base-scene.js +39 -0
  32. package/dist/scenes/base-scene.js.map +1 -0
  33. package/dist/scenes/context.d.ts +17 -0
  34. package/dist/scenes/context.js +16 -0
  35. package/dist/scenes/context.js.map +1 -0
  36. package/dist/scenes/index.d.ts +11 -0
  37. package/dist/scenes/index.js +21 -0
  38. package/dist/scenes/index.js.map +1 -0
  39. package/dist/scenes/scene-context.d.ts +38 -0
  40. package/dist/scenes/scene-context.js +95 -0
  41. package/dist/scenes/scene-context.js.map +1 -0
  42. package/dist/scenes/session.d.ts +36 -0
  43. package/dist/scenes/session.js +63 -0
  44. package/dist/scenes/session.js.map +1 -0
  45. package/dist/scenes/stage.d.ts +35 -0
  46. package/dist/scenes/stage.js +66 -0
  47. package/dist/scenes/stage.js.map +1 -0
  48. package/dist/scenes/wizard-context.d.ts +28 -0
  49. package/dist/scenes/wizard-context.js +36 -0
  50. package/dist/scenes/wizard-context.js.map +1 -0
  51. package/dist/scenes/wizard-scene.d.ts +19 -0
  52. package/dist/scenes/wizard-scene.js +49 -0
  53. package/dist/scenes/wizard-scene.js.map +1 -0
  54. package/dist/services/base-explorer.service.d.ts +7 -0
  55. package/dist/services/base-explorer.service.js +29 -0
  56. package/dist/services/base-explorer.service.js.map +1 -0
  57. package/dist/services/index.d.ts +3 -0
  58. package/dist/services/index.js +10 -0
  59. package/dist/services/index.js.map +1 -0
  60. package/dist/services/listeners-explorer.service.d.ts +33 -0
  61. package/dist/services/listeners-explorer.service.js +179 -0
  62. package/dist/services/listeners-explorer.service.js.map +1 -0
  63. package/dist/services/metadata-accessor.service.d.ts +12 -0
  64. package/dist/services/metadata-accessor.service.js +44 -0
  65. package/dist/services/metadata-accessor.service.js.map +1 -0
  66. package/dist/types.d.ts +0 -1
  67. package/dist/utils.d.ts +12 -0
  68. package/dist/utils.js +41 -0
  69. package/dist/utils.js.map +1 -0
  70. package/dist/validation.d.ts +9 -0
  71. package/dist/{max-auth.guard.js → validation.js} +11 -19
  72. package/dist/validation.js.map +1 -0
  73. package/package.json +4 -3
  74. package/dist/max-auth.guard.d.ts +0 -9
  75. package/dist/max-auth.guard.js.map +0 -1
  76. package/dist/max-user.decorator.js.map +0 -1
  77. package/dist/max.constants.d.ts +0 -3
  78. package/dist/max.constants.js +0 -7
  79. package/dist/max.constants.js.map +0 -1
  80. package/dist/max.interface.d.ts +0 -17
  81. package/dist/max.interface.js.map +0 -1
  82. /package/dist/{max-user.decorator.d.ts → decorators/auth.d.ts} +0 -0
@@ -5,42 +5,165 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
- var MaxModule_1;
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var MaxCoreModule_1;
9
15
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.MaxModule = void 0;
16
+ exports.MaxCoreModule = void 0;
11
17
  const common_1 = require("@nestjs/common");
12
- const max_constants_1 = require("./max.constants");
13
- const max_auth_guard_1 = require("./max-auth.guard");
14
- let MaxModule = MaxModule_1 = class MaxModule {
18
+ const core_1 = require("@nestjs/core");
19
+ const max_bot_api_1 = require("@maxhub/max-bot-api");
20
+ const constants_1 = require("./constants");
21
+ const services_1 = require("./services");
22
+ const scenes_1 = require("./scenes");
23
+ const utils_1 = require("./utils");
24
+ const auth_guard_1 = require("./guards/auth.guard");
25
+ const validation_1 = require("./validation");
26
+ const RETRY_BASE_MS = 5000;
27
+ const RETRY_MAX_MS = 60000;
28
+ const formatError = (error) => error instanceof Error ? (error.stack ?? error.message) : String(error);
29
+ /**
30
+ * Корневой модуль мини-фреймворка сцен/wizard для @maxhub/max-bot-api.
31
+ * Аналог `TelegrafModule` из nestjs-telegraf.
32
+ */
33
+ let MaxCoreModule = MaxCoreModule_1 = class MaxCoreModule {
34
+ constructor(botName, options, moduleRef) {
35
+ this.botName = botName;
36
+ this.options = options;
37
+ this.moduleRef = moduleRef;
38
+ this.logger = new common_1.Logger(MaxCoreModule_1.name);
39
+ this.isStopping = false;
40
+ }
15
41
  static forRoot(options) {
42
+ if (!options.token.trim()) {
43
+ throw new Error('MAX bot token is required');
44
+ }
16
45
  return {
17
- module: MaxModule_1,
46
+ module: MaxCoreModule_1,
47
+ global: true,
18
48
  providers: [
19
- {
20
- provide: max_constants_1.MAX_OPTIONS_SYMBOL,
21
- useValue: normalizeOptions(options)
22
- },
23
- max_auth_guard_1.MaxAuthGuard
49
+ { provide: constants_1.MAX_MODULE_OPTIONS, useValue: options },
50
+ ...this.coreProviders((0, utils_1.getBotToken)(options.botName)),
51
+ validation_1.MaxValidationService,
52
+ auth_guard_1.MaxAuthGuard
53
+ ],
54
+ exports: [
55
+ constants_1.MAX_STAGE,
56
+ constants_1.MAX_MODULE_OPTIONS,
57
+ (0, utils_1.getBotToken)(options.botName),
58
+ validation_1.MaxValidationService,
59
+ auth_guard_1.MaxAuthGuard
60
+ ]
61
+ };
62
+ }
63
+ static forRootAsync(options) {
64
+ const botToken = (0, utils_1.getBotToken)(options.botName);
65
+ return {
66
+ module: MaxCoreModule_1,
67
+ global: true,
68
+ imports: options.imports ?? [],
69
+ providers: [
70
+ ...this.createAsyncProviders(options),
71
+ ...this.coreProviders(botToken),
72
+ validation_1.MaxValidationService,
73
+ auth_guard_1.MaxAuthGuard
24
74
  ],
25
- exports: [max_constants_1.MAX_OPTIONS_SYMBOL, max_auth_guard_1.MaxAuthGuard],
26
- global: true
75
+ exports: [constants_1.MAX_STAGE, constants_1.MAX_MODULE_OPTIONS, botToken, validation_1.MaxValidationService, auth_guard_1.MaxAuthGuard]
27
76
  };
28
77
  }
78
+ // Провайдеры, общие для forRoot/forRootAsync (бот, имя, stage).
79
+ static coreProviders(botToken) {
80
+ return [
81
+ { provide: constants_1.MAX_BOT_NAME, useValue: botToken },
82
+ { provide: constants_1.MAX_STAGE, useClass: scenes_1.Stage },
83
+ {
84
+ provide: botToken,
85
+ useFactory: (options) => {
86
+ const contextType = options.contextType ?? scenes_1.WizardContext;
87
+ const bot = new max_bot_api_1.Bot(options.token, { contextType });
88
+ bot.use((0, scenes_1.session)());
89
+ if (options.middlewares?.length) {
90
+ bot.use(...options.middlewares);
91
+ }
92
+ bot.catch((error) => {
93
+ // Отказ guard'а (CanActivate → false) бросает ForbiddenException;
94
+ // пользователю уже ответил сам guard — шумить в лог не нужно.
95
+ if (error instanceof common_1.ForbiddenException) {
96
+ return;
97
+ }
98
+ common_1.Logger.error(`${formatError(error)}`, 'MaxBot');
99
+ });
100
+ return bot;
101
+ },
102
+ inject: [constants_1.MAX_MODULE_OPTIONS]
103
+ }
104
+ ];
105
+ }
106
+ static createAsyncProviders(options) {
107
+ if (options.useFactory) {
108
+ return [
109
+ {
110
+ provide: constants_1.MAX_MODULE_OPTIONS,
111
+ useFactory: options.useFactory,
112
+ inject: options.inject ?? []
113
+ }
114
+ ];
115
+ }
116
+ const inject = (options.useExisting || options.useClass);
117
+ const providers = [
118
+ {
119
+ provide: constants_1.MAX_MODULE_OPTIONS,
120
+ useFactory: (factory) => factory.createMaxOptions(),
121
+ inject: [inject]
122
+ }
123
+ ];
124
+ if (options.useClass) {
125
+ providers.push({ provide: options.useClass, useClass: options.useClass });
126
+ }
127
+ return providers;
128
+ }
129
+ // ── Жизненный цикл polling'а ──────────────────────────────────────────────
130
+ onApplicationBootstrap() {
131
+ if (this.options.launch) {
132
+ this.bot = this.moduleRef.get(this.botName, { strict: false });
133
+ this.initialize();
134
+ }
135
+ }
136
+ initialize(attempt = 0) {
137
+ if (this.isStopping || !this.bot) {
138
+ return;
139
+ }
140
+ this.logger.log('MAX bot initializing ...');
141
+ this.bot.start().catch((error) => {
142
+ if (this.isStopping) {
143
+ return;
144
+ }
145
+ this.bot?.stop();
146
+ this.logger.error(`MAX bot polling crashed ${formatError(error)}`);
147
+ const delay = Math.min(RETRY_BASE_MS * 2 ** attempt, RETRY_MAX_MS);
148
+ this.logger.warn(`MAX bot restarting in ${delay / 1000}s (attempt ${attempt + 1})`);
149
+ setTimeout(() => this.initialize(attempt + 1), delay);
150
+ });
151
+ }
152
+ onApplicationShutdown() {
153
+ this.isStopping = true;
154
+ this.bot?.stop();
155
+ this.logger.log('MAX bot polling stopped');
156
+ }
29
157
  };
30
- exports.MaxModule = MaxModule;
31
- exports.MaxModule = MaxModule = MaxModule_1 = __decorate([
158
+ exports.MaxCoreModule = MaxCoreModule;
159
+ exports.MaxCoreModule = MaxCoreModule = MaxCoreModule_1 = __decorate([
32
160
  (0, common_1.Global)(),
33
- (0, common_1.Module)({})
34
- ], MaxModule);
35
- const normalizeOptions = (options) => {
36
- const botToken = options.botToken.trim();
37
- if (!botToken) {
38
- throw new Error('MAX bot token is required');
39
- }
40
- const headerName = options.headerName?.trim() || max_constants_1.DEFAULT_MAX_INIT_DATA_HEADER;
41
- return {
42
- botToken,
43
- headerName
44
- };
45
- };
161
+ (0, common_1.Module)({
162
+ imports: [core_1.DiscoveryModule],
163
+ providers: [services_1.ListenersExplorerService, services_1.MetadataAccessorService]
164
+ }),
165
+ __param(0, (0, common_1.Inject)(constants_1.MAX_BOT_NAME)),
166
+ __param(1, (0, common_1.Inject)(constants_1.MAX_MODULE_OPTIONS)),
167
+ __metadata("design:paramtypes", [String, Object, core_1.ModuleRef])
168
+ ], MaxCoreModule);
46
169
  //# sourceMappingURL=max.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"max.module.js","sourceRoot":"","sources":["../src/max.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAmE;AACnE,mDAAkF;AAElF,qDAA+C;AAIxC,IAAM,SAAS,iBAAf,MAAM,SAAS;IACb,MAAM,CAAC,OAAO,CAAC,OAAyB;QAC7C,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,kCAAkB;oBAC3B,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;iBACpC;gBACD,6BAAY;aACb;YACD,OAAO,EAAE,CAAC,kCAAkB,EAAE,6BAAY,CAAC;YAC3C,MAAM,EAAE,IAAI;SACb,CAAA;IACH,CAAC;CACF,CAAA;AAfY,8BAAS;oBAAT,SAAS;IAFrB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,SAAS,CAerB;AAED,MAAM,gBAAgB,GAAG,CAAC,OAAyB,EAA4B,EAAE;IAC/E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,4CAA4B,CAAA;IAE7E,OAAO;QACL,QAAQ;QACR,UAAU;KACX,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"max.module.js","sourceRoot":"","sources":["../src/max.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ParamData } from '@nestjs/common';
2
+ import { ParamsFactory } from '@nestjs/core/helpers/external-context-creator';
3
+ import { MaxParamtype } from './constants';
4
+ /** Разрешает значения параметр-декораторов из `(ctx, next)`. */
5
+ export declare class MaxParamsFactory implements ParamsFactory {
6
+ exchangeKeyForValue(type: MaxParamtype, data: ParamData, args: unknown[]): unknown;
7
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaxParamsFactory = void 0;
4
+ const constants_1 = require("./constants");
5
+ /** Разрешает значения параметр-декораторов из `(ctx, next)`. */
6
+ class MaxParamsFactory {
7
+ exchangeKeyForValue(type, data, args) {
8
+ const ctx = args[0];
9
+ const next = args[1];
10
+ switch (type) {
11
+ case constants_1.MaxParamtype.CONTEXT:
12
+ return ctx;
13
+ case constants_1.MaxParamtype.NEXT:
14
+ return next;
15
+ case constants_1.MaxParamtype.SENDER: {
16
+ const sender = ctx.user ?? ctx.message?.sender ?? ctx.callback?.user;
17
+ return data && sender ? sender[data] : sender;
18
+ }
19
+ case constants_1.MaxParamtype.MESSAGE:
20
+ return data && ctx.message
21
+ ? ctx.message[data]
22
+ : ctx.message;
23
+ case constants_1.MaxParamtype.PAYLOAD:
24
+ return ctx.callback?.payload;
25
+ default:
26
+ return null;
27
+ }
28
+ }
29
+ }
30
+ exports.MaxParamsFactory = MaxParamsFactory;
31
+ //# sourceMappingURL=params.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.factory.js","sourceRoot":"","sources":["../src/params.factory.ts"],"names":[],"mappings":";;;AAGA,2CAA0C;AAE1C,gEAAgE;AAChE,MAAa,gBAAgB;IAC3B,mBAAmB,CAAC,IAAkB,EAAE,IAAe,EAAE,IAAe;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAY,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAwB,CAAA;QAE3C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,wBAAY,CAAC,OAAO;gBACvB,OAAO,GAAG,CAAA;YACZ,KAAK,wBAAY,CAAC,IAAI;gBACpB,OAAO,IAAI,CAAA;YACb,KAAK,wBAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAA;gBACpE,OAAO,IAAI,IAAI,MAAM,CAAC,CAAC,CAAE,MAAkC,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACtF,CAAC;YACD,KAAK,wBAAY,CAAC,OAAO;gBACvB,OAAO,IAAI,IAAI,GAAG,CAAC,OAAO;oBACxB,CAAC,CAAE,GAAG,CAAC,OAA8C,CAAC,IAAc,CAAC;oBACrE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAA;YACjB,KAAK,wBAAY,CAAC,OAAO;gBACvB,OAAO,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAA;YAC9B;gBACE,OAAO,IAAI,CAAA;QACf,CAAC;IACH,CAAC;CACF;AAxBD,4CAwBC"}
@@ -0,0 +1,22 @@
1
+ import { Composer, Context, Middleware, MiddlewareFn } from '@maxhub/max-bot-api';
2
+ export interface SceneOptions<C extends Context> {
3
+ ttl?: number;
4
+ handlers?: ReadonlyArray<Middleware<C>>;
5
+ enterHandlers?: ReadonlyArray<Middleware<C>>;
6
+ leaveHandlers?: ReadonlyArray<Middleware<C>>;
7
+ }
8
+ /**
9
+ * Базовая сцена — Composer с идентификатором и обработчиками входа/выхода.
10
+ * Порт telegraf `scenes/base.ts` на @maxhub/max-bot-api.
11
+ */
12
+ export declare class BaseScene<C extends Context = Context> extends Composer<C> {
13
+ id: string;
14
+ ttl?: number;
15
+ enterHandler: MiddlewareFn<C>;
16
+ leaveHandler: MiddlewareFn<C>;
17
+ constructor(id: string, options?: SceneOptions<C>);
18
+ enter(...fns: Array<Middleware<C>>): this;
19
+ leave(...fns: Array<Middleware<C>>): this;
20
+ enterMiddleware(): MiddlewareFn<C>;
21
+ leaveMiddleware(): MiddlewareFn<C>;
22
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseScene = void 0;
4
+ const max_bot_api_1 = require("@maxhub/max-bot-api");
5
+ /**
6
+ * Базовая сцена — Composer с идентификатором и обработчиками входа/выхода.
7
+ * Порт telegraf `scenes/base.ts` на @maxhub/max-bot-api.
8
+ */
9
+ class BaseScene extends max_bot_api_1.Composer {
10
+ constructor(id, options) {
11
+ const opts = {
12
+ handlers: [],
13
+ enterHandlers: [],
14
+ leaveHandlers: [],
15
+ ...options
16
+ };
17
+ super(...opts.handlers);
18
+ this.id = id;
19
+ this.ttl = opts.ttl;
20
+ this.enterHandler = max_bot_api_1.Composer.compose([...opts.enterHandlers]);
21
+ this.leaveHandler = max_bot_api_1.Composer.compose([...opts.leaveHandlers]);
22
+ }
23
+ enter(...fns) {
24
+ this.enterHandler = max_bot_api_1.Composer.compose([this.enterHandler, ...fns]);
25
+ return this;
26
+ }
27
+ leave(...fns) {
28
+ this.leaveHandler = max_bot_api_1.Composer.compose([this.leaveHandler, ...fns]);
29
+ return this;
30
+ }
31
+ enterMiddleware() {
32
+ return this.enterHandler;
33
+ }
34
+ leaveMiddleware() {
35
+ return this.leaveHandler;
36
+ }
37
+ }
38
+ exports.BaseScene = BaseScene;
39
+ //# sourceMappingURL=base-scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-scene.js","sourceRoot":"","sources":["../../src/scenes/base-scene.ts"],"names":[],"mappings":";;;AAAA,qDAAiF;AASjF;;;GAGG;AACH,MAAa,SAAuC,SAAQ,sBAAW;IAMrE,YAAY,EAAU,EAAE,OAAyB;QAC/C,MAAM,IAAI,GAA0E;YAClF,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,EAAE;YACjB,aAAa,EAAE,EAAE;YACjB,GAAG,OAAO;SACX,CAAA;QACD,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACZ,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACnB,IAAI,CAAC,YAAY,GAAG,sBAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;QAC7D,IAAI,CAAC,YAAY,GAAG,sBAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,GAAyB;QAChC,IAAI,CAAC,YAAY,GAAG,sBAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,GAAG,GAAyB;QAChC,IAAI,CAAC,YAAY,GAAG,sBAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;QACjE,OAAO,IAAI,CAAA;IACb,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;CACF;AArCD,8BAqCC"}
@@ -0,0 +1,17 @@
1
+ import { Context } from '@maxhub/max-bot-api';
2
+ import { SceneContextScene, SceneSession, SceneSessionData } from './scene-context';
3
+ import { WizardContextWizard, WizardSession, WizardSessionData } from './wizard-context';
4
+ /**
5
+ * Контекст со сценами. Свойства проставляются middleware'ами (`session`/`scene`),
6
+ * поэтому объявлены через `declare` (без runtime-инициализации).
7
+ */
8
+ export declare class SceneContext<D extends SceneSessionData = SceneSessionData> extends Context {
9
+ session?: SceneSession<D>;
10
+ scene: SceneContextScene<any, D>;
11
+ }
12
+ /** Контекст wizard-сцены: добавляет `ctx.wizard` поверх сцен. */
13
+ export declare class WizardContext<D extends WizardSessionData = WizardSessionData> extends Context {
14
+ session?: WizardSession<D>;
15
+ scene: SceneContextScene<any, D>;
16
+ wizard: WizardContextWizard<any>;
17
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WizardContext = exports.SceneContext = void 0;
4
+ const max_bot_api_1 = require("@maxhub/max-bot-api");
5
+ /**
6
+ * Контекст со сценами. Свойства проставляются middleware'ами (`session`/`scene`),
7
+ * поэтому объявлены через `declare` (без runtime-инициализации).
8
+ */
9
+ class SceneContext extends max_bot_api_1.Context {
10
+ }
11
+ exports.SceneContext = SceneContext;
12
+ /** Контекст wizard-сцены: добавляет `ctx.wizard` поверх сцен. */
13
+ class WizardContext extends max_bot_api_1.Context {
14
+ }
15
+ exports.WizardContext = WizardContext;
16
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/scenes/context.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAI7C;;;GAGG;AACH,MAAa,YAA4D,SAAQ,qBAAO;CAGvF;AAHD,oCAGC;AAED,iEAAiE;AACjE,MAAa,aAA+D,SAAQ,qBAAO;CAI1F;AAJD,sCAIC"}
@@ -0,0 +1,11 @@
1
+ export { session, MemorySessionStore, getDefaultSessionKey } from './session';
2
+ export type { SessionStore, SessionOptions } from './session';
3
+ export { BaseScene } from './base-scene';
4
+ export type { SceneOptions } from './base-scene';
5
+ export { SceneContextScene } from './scene-context';
6
+ export type { SceneSession, SceneSessionData, SceneSessionContext, SceneContextSceneOptions } from './scene-context';
7
+ export { Stage } from './stage';
8
+ export { WizardContextWizard } from './wizard-context';
9
+ export type { WizardSession, WizardSessionData, WizardSessionContext } from './wizard-context';
10
+ export { WizardScene } from './wizard-scene';
11
+ export { SceneContext, WizardContext } from './context';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WizardContext = exports.SceneContext = exports.WizardScene = exports.WizardContextWizard = exports.Stage = exports.SceneContextScene = exports.BaseScene = exports.getDefaultSessionKey = exports.MemorySessionStore = exports.session = void 0;
4
+ var session_1 = require("./session");
5
+ Object.defineProperty(exports, "session", { enumerable: true, get: function () { return session_1.session; } });
6
+ Object.defineProperty(exports, "MemorySessionStore", { enumerable: true, get: function () { return session_1.MemorySessionStore; } });
7
+ Object.defineProperty(exports, "getDefaultSessionKey", { enumerable: true, get: function () { return session_1.getDefaultSessionKey; } });
8
+ var base_scene_1 = require("./base-scene");
9
+ Object.defineProperty(exports, "BaseScene", { enumerable: true, get: function () { return base_scene_1.BaseScene; } });
10
+ var scene_context_1 = require("./scene-context");
11
+ Object.defineProperty(exports, "SceneContextScene", { enumerable: true, get: function () { return scene_context_1.SceneContextScene; } });
12
+ var stage_1 = require("./stage");
13
+ Object.defineProperty(exports, "Stage", { enumerable: true, get: function () { return stage_1.Stage; } });
14
+ var wizard_context_1 = require("./wizard-context");
15
+ Object.defineProperty(exports, "WizardContextWizard", { enumerable: true, get: function () { return wizard_context_1.WizardContextWizard; } });
16
+ var wizard_scene_1 = require("./wizard-scene");
17
+ Object.defineProperty(exports, "WizardScene", { enumerable: true, get: function () { return wizard_scene_1.WizardScene; } });
18
+ var context_1 = require("./context");
19
+ Object.defineProperty(exports, "SceneContext", { enumerable: true, get: function () { return context_1.SceneContext; } });
20
+ Object.defineProperty(exports, "WizardContext", { enumerable: true, get: function () { return context_1.WizardContext; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scenes/index.ts"],"names":[],"mappings":";;;AAAA,qCAA6E;AAApE,kGAAA,OAAO,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,+GAAA,oBAAoB,OAAA;AAE1D,2CAAwC;AAA/B,uGAAA,SAAS,OAAA;AAElB,iDAAmD;AAA1C,kHAAA,iBAAiB,OAAA;AAO1B,iCAA+B;AAAtB,8FAAA,KAAK,OAAA;AACd,mDAAsD;AAA7C,qHAAA,mBAAmB,OAAA;AAE5B,+CAA4C;AAAnC,2GAAA,WAAW,OAAA;AACpB,qCAAuD;AAA9C,uGAAA,YAAY,OAAA;AAAE,wGAAA,aAAa,OAAA"}
@@ -0,0 +1,38 @@
1
+ import { Context } from '@maxhub/max-bot-api';
2
+ import { BaseScene } from './base-scene';
3
+ export interface SceneSessionData {
4
+ current?: string;
5
+ expires?: number;
6
+ state?: object;
7
+ }
8
+ export interface SceneSession<S extends SceneSessionData = SceneSessionData> {
9
+ __scenes?: S;
10
+ }
11
+ /** Контекст, у которого есть сессия со сценами (привязывается session middleware). */
12
+ export type SceneSessionContext<D extends SceneSessionData = SceneSessionData> = Context & {
13
+ session?: SceneSession<D>;
14
+ };
15
+ export interface SceneContextSceneOptions<D extends SceneSessionData> {
16
+ ttl?: number;
17
+ default?: string;
18
+ defaultSession: D;
19
+ }
20
+ /**
21
+ * `ctx.scene` — управление текущей сценой пользователя. Состояние хранится в
22
+ * `ctx.session.__scenes`. Порт telegraf `scenes/context.ts`.
23
+ */
24
+ export declare class SceneContextScene<C extends SceneSessionContext<D>, D extends SceneSessionData = SceneSessionData> {
25
+ private readonly ctx;
26
+ private readonly scenes;
27
+ private readonly options;
28
+ constructor(ctx: C, scenes: Map<string, BaseScene<C>>, options: Partial<SceneContextSceneOptions<D>>);
29
+ get session(): D;
30
+ get state(): object;
31
+ set state(value: object);
32
+ get current(): BaseScene<C> | undefined;
33
+ reset(): void;
34
+ enter(sceneId: string, initialState?: object, silent?: boolean): Promise<unknown>;
35
+ reenter(): Promise<unknown> | undefined;
36
+ private leaving;
37
+ leave(): Promise<void>;
38
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SceneContextScene = void 0;
4
+ const noop = () => Promise.resolve();
5
+ const now = () => Math.floor(Date.now() / 1000);
6
+ /**
7
+ * `ctx.scene` — управление текущей сценой пользователя. Состояние хранится в
8
+ * `ctx.session.__scenes`. Порт telegraf `scenes/context.ts`.
9
+ */
10
+ class SceneContextScene {
11
+ constructor(ctx, scenes, options) {
12
+ this.ctx = ctx;
13
+ this.scenes = scenes;
14
+ this.leaving = false;
15
+ const fallbackSessionDefault = {};
16
+ this.options = { defaultSession: fallbackSessionDefault, ...options };
17
+ }
18
+ get session() {
19
+ const defaultSession = Object.assign({}, this.options.defaultSession);
20
+ let session = this.ctx.session?.__scenes ?? defaultSession;
21
+ if (session.expires !== undefined && session.expires < now()) {
22
+ session = defaultSession;
23
+ }
24
+ if (this.ctx.session === undefined) {
25
+ this.ctx.session = { __scenes: session };
26
+ }
27
+ else {
28
+ this.ctx.session.__scenes = session;
29
+ }
30
+ return session;
31
+ }
32
+ get state() {
33
+ return (this.session.state ??= {});
34
+ }
35
+ set state(value) {
36
+ this.session.state = { ...value };
37
+ }
38
+ get current() {
39
+ const sceneId = this.session.current ?? this.options.default;
40
+ return sceneId === undefined || !this.scenes.has(sceneId)
41
+ ? undefined
42
+ : this.scenes.get(sceneId);
43
+ }
44
+ reset() {
45
+ if (this.ctx.session !== undefined) {
46
+ this.ctx.session.__scenes = Object.assign({}, this.options.defaultSession);
47
+ }
48
+ }
49
+ async enter(sceneId, initialState = {}, silent = false) {
50
+ if (!this.scenes.has(sceneId)) {
51
+ throw new Error(`max-bot-nestjs: can't find scene: ${sceneId}`);
52
+ }
53
+ if (!silent) {
54
+ await this.leave();
55
+ }
56
+ this.session.current = sceneId;
57
+ this.state = initialState;
58
+ const ttl = this.current?.ttl ?? this.options.ttl;
59
+ if (ttl !== undefined) {
60
+ this.session.expires = now() + ttl;
61
+ }
62
+ if (this.current === undefined || silent) {
63
+ return;
64
+ }
65
+ const handler = 'enterMiddleware' in this.current && typeof this.current.enterMiddleware === 'function'
66
+ ? this.current.enterMiddleware()
67
+ : this.current.middleware();
68
+ return await handler(this.ctx, noop);
69
+ }
70
+ reenter() {
71
+ return this.session.current === undefined
72
+ ? undefined
73
+ : this.enter(this.session.current, this.state);
74
+ }
75
+ async leave() {
76
+ if (this.leaving)
77
+ return;
78
+ try {
79
+ this.leaving = true;
80
+ if (this.current === undefined) {
81
+ return;
82
+ }
83
+ const handler = 'leaveMiddleware' in this.current && typeof this.current.leaveMiddleware === 'function'
84
+ ? this.current.leaveMiddleware()
85
+ : noop;
86
+ await handler(this.ctx, noop);
87
+ return this.reset();
88
+ }
89
+ finally {
90
+ this.leaving = false;
91
+ }
92
+ }
93
+ }
94
+ exports.SceneContextScene = SceneContextScene;
95
+ //# sourceMappingURL=scene-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-context.js","sourceRoot":"","sources":["../../src/scenes/scene-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Context, MiddlewareFn } from '@maxhub/max-bot-api';
2
+ /**
3
+ * Хранилище сессий. По умолчанию используется in-memory `MemorySessionStore`,
4
+ * но интерфейс позволяет подключить персистентное хранилище (например, Mongo).
5
+ */
6
+ export interface SessionStore<T> {
7
+ get(key: string): T | undefined | Promise<T | undefined>;
8
+ set(key: string, value: T): void | Promise<void>;
9
+ delete(key: string): void | Promise<void>;
10
+ }
11
+ /** Простое in-memory хранилище сессий (Map). */
12
+ export declare class MemorySessionStore<T> implements SessionStore<T> {
13
+ private readonly store;
14
+ get(key: string): T | undefined;
15
+ set(key: string, value: T): void;
16
+ delete(key: string): void;
17
+ }
18
+ export interface SessionOptions<S, C extends Context> {
19
+ /** Имя свойства контекста (по умолчанию `session`). */
20
+ property?: string;
21
+ /** Ключ сессии. По умолчанию — id пользователя MAX. */
22
+ getSessionKey?: (ctx: C) => string | undefined;
23
+ store?: SessionStore<S>;
24
+ defaultSession?: (ctx: C) => S;
25
+ }
26
+ /**
27
+ * Ключ сессии по умолчанию: id пользователя MAX (бот общается 1:1, поэтому
28
+ * достаточно ключа по пользователю). Берём id из любого типа апдейта.
29
+ */
30
+ export declare const getDefaultSessionKey: (ctx: Context) => string | undefined;
31
+ /**
32
+ * Middleware, добавляющий `ctx.session` поверх произвольного хранилища.
33
+ * Значение читается до выполнения цепочки и записывается обратно после неё.
34
+ * Упрощённая версия telegraf-session: один процесс, низкая конкуренция.
35
+ */
36
+ export declare function session<S extends object, C extends Context = Context>(options?: SessionOptions<S, C>): MiddlewareFn<C>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultSessionKey = exports.MemorySessionStore = void 0;
4
+ exports.session = session;
5
+ /** Простое in-memory хранилище сессий (Map). */
6
+ class MemorySessionStore {
7
+ constructor() {
8
+ this.store = new Map();
9
+ }
10
+ get(key) {
11
+ return this.store.get(key);
12
+ }
13
+ set(key, value) {
14
+ this.store.set(key, value);
15
+ }
16
+ delete(key) {
17
+ this.store.delete(key);
18
+ }
19
+ }
20
+ exports.MemorySessionStore = MemorySessionStore;
21
+ /**
22
+ * Ключ сессии по умолчанию: id пользователя MAX (бот общается 1:1, поэтому
23
+ * достаточно ключа по пользователю). Берём id из любого типа апдейта.
24
+ */
25
+ const getDefaultSessionKey = (ctx) => {
26
+ const userId = ctx.user?.user_id ?? ctx.message?.sender?.user_id ?? ctx.callback?.user?.user_id;
27
+ return userId === undefined ? undefined : String(userId);
28
+ };
29
+ exports.getDefaultSessionKey = getDefaultSessionKey;
30
+ /**
31
+ * Middleware, добавляющий `ctx.session` поверх произвольного хранилища.
32
+ * Значение читается до выполнения цепочки и записывается обратно после неё.
33
+ * Упрощённая версия telegraf-session: один процесс, низкая конкуренция.
34
+ */
35
+ function session(options) {
36
+ const property = options?.property ?? 'session';
37
+ const getSessionKey = options?.getSessionKey ?? exports.getDefaultSessionKey;
38
+ const store = options?.store ?? new MemorySessionStore();
39
+ const defaultSession = options?.defaultSession ?? (() => ({}));
40
+ return async (ctx, next) => {
41
+ const key = getSessionKey(ctx);
42
+ if (!key) {
43
+ return next();
44
+ }
45
+ let value = (await store.get(key)) ?? defaultSession(ctx);
46
+ Object.defineProperty(ctx, property, {
47
+ configurable: true,
48
+ enumerable: true,
49
+ get: () => value,
50
+ set: (next_) => {
51
+ value = next_;
52
+ }
53
+ });
54
+ await next();
55
+ if (value == null) {
56
+ await store.delete(key);
57
+ }
58
+ else {
59
+ await store.set(key, value);
60
+ }
61
+ };
62
+ }
63
+ //# sourceMappingURL=session.js.map