@truelab/trueserver 0.1.4 → 0.3.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/CHANGELOG.md +27 -0
- package/MIGRATION.md +114 -1
- package/README.md +51 -20
- package/dist/application.d.ts +1 -5
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +1 -3
- package/dist/application.js.map +1 -1
- package/dist/helpers/env.helper.d.ts +16 -2
- package/dist/helpers/env.helper.d.ts.map +1 -1
- package/dist/helpers/env.helper.js +33 -9
- package/dist/helpers/env.helper.js.map +1 -1
- package/dist/helpers/fastify.helper.js +1 -1
- package/dist/helpers/fastify.helper.js.map +1 -1
- package/dist/helpers/logger.helper.d.ts.map +1 -1
- package/dist/helpers/logger.helper.js +34 -8
- package/dist/helpers/logger.helper.js.map +1 -1
- package/dist/helpers/tests.helper.d.ts +2 -1
- package/dist/helpers/tests.helper.d.ts.map +1 -1
- package/dist/helpers/tests.helper.js +1 -1
- package/dist/helpers/tests.helper.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/plugins/apikey.plugin.js +2 -2
- package/dist/plugins/apikey.plugin.js.map +1 -1
- package/dist/plugins/logger.plugin.d.ts.map +1 -1
- package/dist/plugins/logger.plugin.js +8 -6
- package/dist/plugins/logger.plugin.js.map +1 -1
- package/dist/plugins/sentry.plugin.js +2 -2
- package/dist/plugins/sentry.plugin.js.map +1 -1
- package/dist/plugins/swagger.plugin.js +1 -1
- package/dist/plugins/swagger.plugin.js.map +1 -1
- package/dist/schemas/shared.d.ts +2 -1
- package/dist/schemas/shared.d.ts.map +1 -1
- package/dist/schemas/shared.js +1 -1
- package/dist/schemas/shared.js.map +1 -1
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.0] - 2026-07-22
|
|
10
|
+
|
|
11
|
+
### Breaking
|
|
12
|
+
|
|
13
|
+
- Все env-переменные пакета получили префикс `GS_` (Game Server) — во избежание конфликтов с переменными других сервисов в общем окружении: `HOST`→`GS_HOST`, `PORT`→`GS_PORT`, `ROUTE_PREFIX`→`GS_ROUTE_PREFIX`, `API_HEADER`→`GS_API_HEADER`, `API_KEY`→`GS_API_KEY`, `LOG_LEVEL`→`GS_LOG_LEVEL`, `APP_ENV`→`GS_APP_ENV`, `SENTRY_DSN`→`GS_SENTRY_DSN`, `SENTRY_RATE`→`GS_SENTRY_RATE`. См. [MIGRATION](MIGRATION.md#migration-020--030).
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- Типизированный объект `env` (экспорт из корня пакета) — свойства `host`, `port`, `routePrefix`, `apiHeader`, `apiKey`, `logLevel`, `appEnv`, `sentryDsn`, `sentryRate` с уже прописанными дефолтами и корректными типами (`port`/`sentryRate` — `number`). Заменяет разбросанные по коду вызовы `getenv('GS_X', <дефолт>)` единой типизированной точкой доступа. Низкоуровневые `getenv`/`variation` остаются экспортированными — для собственных переменных потребителя.
|
|
18
|
+
- Логгер маскирует секреты (`authorization`/`cookie` заголовки, `token`/`password`/`signature` поля) в выводимых записях — значение заменяется на `[redacted]`, структура записи сохраняется.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Swagger UI (`/docs`) снова доступен только на `GS_APP_ENV=dev` — откат изменения из 0.1.3, включавшего его и на staging (`release`).
|
|
23
|
+
- `pino-pretty` включён только для `GS_APP_ENV=dev`; на `release`/`master` логгер пишет сырой NDJSON в stdout.
|
|
24
|
+
- Хуки request-логирования (`onRequest`/`onResponse`/`preHandler`/`preSerialization`) гейтятся по уровню уже сконфигурированного логгера, а не повторным чтением `GS_LOG_LEVEL`.
|
|
25
|
+
|
|
26
|
+
## [0.2.0] - 2026-07-06
|
|
27
|
+
|
|
28
|
+
### Breaking
|
|
29
|
+
|
|
30
|
+
- Удалена опция `new Application({ envPath })` и тип `TApplicationOptions`. Приоритетный env-файл теперь задаётся CLI-флагом `--env` при запуске процесса (см. Added). В проде `envPath` использовала только battle-rage, уже переведённая на штатный вариант, поэтому удаление безопасно. Рекомендуется minor-релиз **0.2.0**. См. [MIGRATION](MIGRATION.md#migration-014--020).
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- CLI-флаг `--env <path>` | `--env=<path>` (аргумент приложения, парсится из `process.argv`) — загружает указанный `.env` **с приоритетом** (`override: true`) поверх `./.env` из cwd и уже присутствующих `process.env`. Флаг обрабатывается на верхнем уровне `env.helper` (при импорте), т.е. **до** вычисления `loggerOptions` в `logger.helper`, поэтому влияет и на `LOG_LEVEL` (раньше `envPath` применялся позже и `LOG_LEVEL` терялся). Относительный путь резолвится от cwd процесса; несуществующий файл → `console.warn` без падения. Разбор аргумента — через `minimist`.
|
|
35
|
+
|
|
9
36
|
## [0.1.4] - 2026-07-06
|
|
10
37
|
|
|
11
38
|
### Changed
|
package/MIGRATION.md
CHANGED
|
@@ -1,12 +1,125 @@
|
|
|
1
1
|
# Migration
|
|
2
2
|
|
|
3
|
-
- [0.0
|
|
3
|
+
- [0.2.0 → 0.3.0](#migration-020--030) (последнее)
|
|
4
|
+
- [0.1.4 → 0.2.0](#migration-014--020)
|
|
5
|
+
- [0.0.7 → 0.1.0](#migration-007--010)
|
|
4
6
|
- [0.0.6 → 0.0.7](#migration-006--007)
|
|
5
7
|
- [0.0.5 → 0.0.6](#migration-005--006)
|
|
6
8
|
- [0.0.4 → 0.0.5](#migration-004--005)
|
|
7
9
|
|
|
8
10
|
---
|
|
9
11
|
|
|
12
|
+
## Migration: 0.2.0 → 0.3.0
|
|
13
|
+
|
|
14
|
+
Ломающее изменение — все env-переменные пакета получили префикс `GS_` (Game Server), чтобы не конфликтовать с переменными других сервисов в общем окружении.
|
|
15
|
+
|
|
16
|
+
> **TL;DR:**
|
|
17
|
+
> - Переименуйте переменные в `.env`/секретах/деплое (pm2, CI) согласно таблице ниже.
|
|
18
|
+
> - Опционально: замените ручные `getenv('GS_PORT', '2980')` и подобные вызовы в коде игры на новый типизированный объект `env` — дефолты уже прописаны, тип уже правильный.
|
|
19
|
+
|
|
20
|
+
### 1. Переименование переменных
|
|
21
|
+
|
|
22
|
+
| Старое | Новое |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `HOST` | `GS_HOST` |
|
|
25
|
+
| `PORT` | `GS_PORT` |
|
|
26
|
+
| `ROUTE_PREFIX` | `GS_ROUTE_PREFIX` |
|
|
27
|
+
| `API_HEADER` | `GS_API_HEADER` |
|
|
28
|
+
| `API_KEY` | `GS_API_KEY` |
|
|
29
|
+
| `LOG_LEVEL` | `GS_LOG_LEVEL` |
|
|
30
|
+
| `APP_ENV` | `GS_APP_ENV` |
|
|
31
|
+
| `SENTRY_DSN` | `GS_SENTRY_DSN` |
|
|
32
|
+
| `SENTRY_RATE` | `GS_SENTRY_RATE` |
|
|
33
|
+
|
|
34
|
+
```diff
|
|
35
|
+
-HOST=0.0.0.0
|
|
36
|
+
-PORT=2980
|
|
37
|
+
-ROUTE_PREFIX=/api/v1
|
|
38
|
+
-API_HEADER=x-api-key
|
|
39
|
+
-API_KEY=super-secret
|
|
40
|
+
-LOG_LEVEL=info
|
|
41
|
+
-APP_ENV=release
|
|
42
|
+
-SENTRY_DSN=https://...
|
|
43
|
+
-SENTRY_RATE=0.05
|
|
44
|
+
+GS_HOST=0.0.0.0
|
|
45
|
+
+GS_PORT=2980
|
|
46
|
+
+GS_ROUTE_PREFIX=/api/v1
|
|
47
|
+
+GS_API_HEADER=x-api-key
|
|
48
|
+
+GS_API_KEY=super-secret
|
|
49
|
+
+GS_LOG_LEVEL=info
|
|
50
|
+
+GS_APP_ENV=release
|
|
51
|
+
+GS_SENTRY_DSN=https://...
|
|
52
|
+
+GS_SENTRY_RATE=0.05
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Незамеченные старые (непрефиксованные) переменные больше не читаются пакетом — тихого фолбэка нет, применяются дефолты из таблицы в README.
|
|
56
|
+
|
|
57
|
+
### 2. Новое: типизированный `env`
|
|
58
|
+
|
|
59
|
+
```diff
|
|
60
|
+
-import { getenv, logger } from '@truelab/trueserver'
|
|
61
|
+
+import { env, logger } from '@truelab/trueserver'
|
|
62
|
+
|
|
63
|
+
await server.listen({
|
|
64
|
+
- host: getenv('HOST', 'localhost'),
|
|
65
|
+
- port: Number.parseInt(getenv('PORT', '2980'), 10),
|
|
66
|
+
+ host: env.host,
|
|
67
|
+
+ port: env.port,
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`getenv`/`variation` продолжают экспортироваться — используйте их для собственных, не связанных с Game Server переменных окружения игры.
|
|
72
|
+
|
|
73
|
+
### Чек-лист
|
|
74
|
+
|
|
75
|
+
1. `npm install @truelab/trueserver@0.3.0`.
|
|
76
|
+
2. Переименовать переменные в инфраструктуре запуска (`.env`, pm2/systemd/докер-entrypoint, CI-секреты) согласно таблице в п. 1.
|
|
77
|
+
3. Опционально: перевести код игры на `env.*` вместо ручных `getenv('GS_X', ...)`.
|
|
78
|
+
4. Прогнать тесты и проверить, что сервис поднимается с ожидаемым `HOST`/`PORT`/`LOG_LEVEL`.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Migration: 0.1.4 → 0.2.0
|
|
83
|
+
|
|
84
|
+
Единственное ломающее изменение — удалена опция `new Application({ envPath })` (вместе с типом `TApplicationOptions`). Приоритетный env-файл теперь задаётся CLI-флагом `--env` при запуске процесса.
|
|
85
|
+
|
|
86
|
+
> **TL;DR:**
|
|
87
|
+
> - Использовали `new Application({ envPath })` — уберите опцию: `new Application()`.
|
|
88
|
+
> - Конкретный env-файл теперь передавайте флагом `--env <path>` в команде запуска. Он не зависит от cwd и применяется **до** создания логгера, поэтому влияет и на `LOG_LEVEL`.
|
|
89
|
+
> - Ничего не передавали в `Application()` — менять нечего.
|
|
90
|
+
|
|
91
|
+
### 1. `new Application({ envPath })` → `new Application()`
|
|
92
|
+
|
|
93
|
+
```diff
|
|
94
|
+
-const app = new Application({ envPath: './server/.env' })
|
|
95
|
+
+const app = new Application()
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Передачу конкретного env-файла перенесите в команду запуска процесса:
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
pm2 start ./server/dist/index.js --name <proc> --cwd ${FOLDER_PATH} -- --env ./server/.env
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Флаг `--env`:
|
|
105
|
+
- поддерживает формы `--env <path>` и `--env=<path>`;
|
|
106
|
+
- применяет файл с `override: true` — он перекрывает и `./.env` из cwd, и уже выставленные `process.env`;
|
|
107
|
+
- резолвит относительный путь от cwd процесса (абсолютный — как есть);
|
|
108
|
+
- на несуществующий файл пишет `console.warn` и не роняет процесс.
|
|
109
|
+
|
|
110
|
+
### Почему
|
|
111
|
+
|
|
112
|
+
`envPath` применялся в конструкторе `Application` — уже **после** того, как `logger.helper` на этапе импорта прочитал `LOG_LEVEL`. Поэтому `PORT/HOST/API_KEY` из переданного файла применялись, а `LOG_LEVEL` — нет: сервер, запущенный не из корня воркспейса, молча терял `info`/startup-логи. Флаг `--env` парсится на верхнем уровне `env.helper`, гарантированно раньше чтения `LOG_LEVEL`, поэтому логи и env корректны из любого cwd.
|
|
113
|
+
|
|
114
|
+
### Чек-лист
|
|
115
|
+
|
|
116
|
+
1. `npm install @truelab/trueserver@0.2.0`.
|
|
117
|
+
2. Убрать аргумент из `new Application({ envPath })` → `new Application()`.
|
|
118
|
+
3. Если нужен конкретный env-файл на деплое — добавить `-- --env <path>` в команду запуска (pm2/systemd/докер-entrypoint).
|
|
119
|
+
4. Прогнать тесты и проверить, что startup-логи присутствуют.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
10
123
|
## Migration: 0.0.7 → 0.1.0
|
|
11
124
|
|
|
12
125
|
Ломающий релиз. Приводит пакет в полное соответствие контракту Game Server API v1.0.0.
|
package/README.md
CHANGED
|
@@ -21,8 +21,8 @@ npm install @truelab/trueserver
|
|
|
21
21
|
import {
|
|
22
22
|
Application,
|
|
23
23
|
EStakeType,
|
|
24
|
+
env,
|
|
24
25
|
handlers,
|
|
25
|
-
getenv,
|
|
26
26
|
logger,
|
|
27
27
|
registerGameConfig,
|
|
28
28
|
type TChecksumReply,
|
|
@@ -103,8 +103,8 @@ async function main() {
|
|
|
103
103
|
const server = await app.build()
|
|
104
104
|
|
|
105
105
|
await server.listen({
|
|
106
|
-
host:
|
|
107
|
-
port:
|
|
106
|
+
host: env.host,
|
|
107
|
+
port: env.port,
|
|
108
108
|
})
|
|
109
109
|
}
|
|
110
110
|
|
|
@@ -129,9 +129,9 @@ main().catch((error) => {
|
|
|
129
129
|
| `POST` | `/:rtpVersion/play` | `handlers.register('play', ...)` | One step of a round |
|
|
130
130
|
| `POST` | `/:rtpVersion/validate` | `handlers.register('validate', ...)` | Pre-round stake validation — returns `{ valid, reason? }` (enabled when `hasValidate=true`) |
|
|
131
131
|
|
|
132
|
-
Every request must carry the API key header. By default it is `x-api-key: test`; override with `
|
|
132
|
+
Every request must carry the API key header. By default it is `x-api-key: test`; override with `GS_API_HEADER` and `GS_API_KEY`.
|
|
133
133
|
|
|
134
|
-
`
|
|
134
|
+
`GS_ROUTE_PREFIX` is prepended to every route. For `GS_ROUTE_PREFIX=/api/v1`, the play endpoint becomes `POST /api/v1/96/play`. `/healthcheck` is always mounted directly under the prefix (no `{rtpVersion}` segment).
|
|
135
135
|
|
|
136
136
|
## Error envelope
|
|
137
137
|
|
|
@@ -168,29 +168,60 @@ import {
|
|
|
168
168
|
|
|
169
169
|
## Environment variables
|
|
170
170
|
|
|
171
|
+
All package-owned environment variables are prefixed with `GS_` (Game Server) to avoid collisions with other services sharing the same environment. They are available both as raw `process.env.GS_*` entries and through the typed `env` object exported by the package (see below).
|
|
172
|
+
|
|
171
173
|
| Variable | Default | Description |
|
|
172
174
|
| -------- | ------- | ----------- |
|
|
173
|
-
| `
|
|
174
|
-
| `
|
|
175
|
-
| `
|
|
176
|
-
| `
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
175
|
+
| `GS_HOST` | `localhost` | Listen host |
|
|
176
|
+
| `GS_PORT` | `2980` | Listen port |
|
|
177
|
+
| `GS_ROUTE_PREFIX` | empty | Prefix for all routes |
|
|
178
|
+
| `GS_API_HEADER` | `x-api-key` | Header name used by API-key plugin |
|
|
179
|
+
| `GS_API_KEY` | `test` | Expected API key value |
|
|
180
|
+
| `GS_LOG_LEVEL` | `debug` (dev) / `info` (release, master) | Pino log level |
|
|
181
|
+
| `GS_APP_ENV` | unset | `dev`, `release`, `master`; controls Swagger and environment mapping |
|
|
182
|
+
| `GS_SENTRY_DSN` | unset | Sentry DSN |
|
|
183
|
+
| `GS_SENTRY_RATE` | `0.01` | Sentry traces sample rate |
|
|
184
|
+
|
|
185
|
+
### Typed access
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
import { env } from '@truelab/trueserver'
|
|
189
|
+
|
|
190
|
+
env.host // GS_HOST, default 'localhost'
|
|
191
|
+
env.port // GS_PORT, default 2980 (number)
|
|
192
|
+
env.routePrefix // GS_ROUTE_PREFIX, default ''
|
|
193
|
+
env.apiHeader // GS_API_HEADER, default 'x-api-key'
|
|
194
|
+
env.apiKey // GS_API_KEY, default 'test'
|
|
195
|
+
env.logLevel // GS_LOG_LEVEL, default per environment
|
|
196
|
+
env.appEnv // GS_APP_ENV, undefined by default
|
|
197
|
+
env.sentryDsn // GS_SENTRY_DSN, undefined by default
|
|
198
|
+
env.sentryRate // GS_SENTRY_RATE, default 0.01 (number)
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Each property re-reads `process.env` on access — useful for tests that mutate `process.env` at runtime. For your own, non-`GS_`-prefixed environment variables, use the lower-level `getenv(name, def)` / `variation(dev, release, master)` helpers, also exported from the package root.
|
|
202
|
+
|
|
203
|
+
`.env` is loaded automatically from the process working directory (`dotenv.config()` runs at import time).
|
|
204
|
+
|
|
205
|
+
To load a specific `.env` **with priority** — independent of the working directory and early enough to affect `GS_LOG_LEVEL` — pass the `--env` flag as an application argument:
|
|
206
|
+
|
|
207
|
+
```sh
|
|
208
|
+
node ./dist/index.js --env ./path/to/.env # or --env=./path/to/.env
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
The file is applied with `override: true` (it wins over the cwd `.env` and any already-set `process.env`), a relative path resolves against the process cwd, and a missing file only logs a `console.warn` without crashing. This is useful when the process starts outside the workspace root, e.g. pm2 with a custom `--cwd`:
|
|
212
|
+
|
|
213
|
+
```sh
|
|
214
|
+
pm2 start ./server/dist/index.js --name <proc> --cwd ${FOLDER_PATH} -- --env ./server/.env
|
|
215
|
+
```
|
|
185
216
|
|
|
186
217
|
## Swagger
|
|
187
218
|
|
|
188
|
-
Swagger UI is enabled for `
|
|
219
|
+
Swagger UI is enabled only for `GS_APP_ENV=dev`.
|
|
189
220
|
|
|
190
221
|
- `GET /` redirects to `/docs`
|
|
191
222
|
- `GET /docs` serves Swagger UI
|
|
192
223
|
|
|
193
|
-
`master` (production)
|
|
224
|
+
`release` (staging) and `master` (production) disable Swagger UI.
|
|
194
225
|
|
|
195
226
|
## Advanced Validation
|
|
196
227
|
|
|
@@ -199,7 +230,7 @@ The package validates both requests and replies via TypeBox schemas and runs gam
|
|
|
199
230
|
- `/config` checks stake modes, the `hasChoice ⇒ hasMeta` invariant, the `hasVariableLevels ⇔ {variableLevels, defaultLevel}` pair, and `hasMultiStake=true ⇒ freeroundsAllowed=false` and `hasValidate=true`.
|
|
200
231
|
- `/play` checks stakes (uniqueness, qty, level in `variableLevels`, parametric/params), `stepIndex` consistency (opening vs continuation), `choice`/`meta` presence per flags, and reply shape (`finished`, `choices`, `meta`, `hasMaxWin`).
|
|
201
232
|
- `/validate` is available only when `hasValidate=true`. Returns `{ valid: boolean, reason?: string }`.
|
|
202
|
-
- `test` field is rejected on production (`
|
|
233
|
+
- `test` field is rejected on production (`GS_APP_ENV=master` or unset).
|
|
203
234
|
|
|
204
235
|
## Money-value precision
|
|
205
236
|
|
package/dist/application.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { FastifyTypebox } from './helpers/fastify.helper';
|
|
2
|
-
export type TApplicationOptions = {
|
|
3
|
-
/** Optional env file to load (overriding the default ./.env), e.g. a per-version file at deploy time */
|
|
4
|
-
envPath?: string;
|
|
5
|
-
};
|
|
6
2
|
export default class Application {
|
|
7
3
|
server: FastifyTypebox;
|
|
8
|
-
constructor(
|
|
4
|
+
constructor();
|
|
9
5
|
build(): Promise<FastifyTypebox>;
|
|
10
6
|
}
|
|
11
7
|
//# sourceMappingURL=application.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../application.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../application.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAkB,MAAM,0BAA0B,CAAA;AAGzE,MAAM,CAAC,OAAO,OAAO,WAAW;IAC5B,MAAM,EAAE,cAAc,CAAA;;IAchB,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;CAuBzC"}
|
package/dist/application.js
CHANGED
|
@@ -6,12 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const autoload_1 = __importDefault(require("@fastify/autoload"));
|
|
7
7
|
const fastify_1 = __importDefault(require("fastify"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const env_helper_1 = require("./helpers/env.helper");
|
|
10
9
|
const fastify_helper_1 = require("./helpers/fastify.helper");
|
|
11
10
|
const logger_helper_1 = require("./helpers/logger.helper");
|
|
12
11
|
class Application {
|
|
13
|
-
constructor(
|
|
14
|
-
(0, env_helper_1.loadEnv)(options.envPath);
|
|
12
|
+
constructor() {
|
|
15
13
|
this.server = (0, fastify_1.default)({
|
|
16
14
|
ajv: {
|
|
17
15
|
customOptions: {
|
package/dist/application.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../application.ts"],"names":[],"mappings":";;;;;AAAA,iEAA+C;AAE/C,sDAA6B;AAC7B,gDAAuB;AAEvB,
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../application.ts"],"names":[],"mappings":";;;;;AAAA,iEAA+C;AAE/C,sDAA6B;AAC7B,gDAAuB;AAEvB,6DAAyE;AACzE,2DAAuD;AAEvD,MAAqB,WAAW;IAG5B;QACI,IAAI,CAAC,MAAM,GAAG,IAAA,iBAAO,EAAC;YAClB,GAAG,EAAE;gBACD,aAAa,EAAE;oBACX,QAAQ,EAAE,CAAC,YAAY,CAAC;iBAC3B;aACJ;YACD,MAAM,EAAE,6BAAa;YACrB,qBAAqB,EAAE,IAAI;SAC9B,CAAC,CAAC,gBAAgB,EAAuB,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAe,EAAE;YACxC,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;SACvC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAA,+BAAc,GAAE,CAAA;QAE/B,wCAAwC;QACxC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAe,EAAE;YACxC,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;YAC1C,OAAO,EAAE,EAAE,MAAM,EAAE;YACnB,kBAAkB,EAAE,KAAK;SAC5B,CAAC,CAAA;QAEF,mEAAmE;QACnE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAe,EAAE;YACxC,GAAG,EAAE,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE;YAC5C,kBAAkB,EAAE,KAAK;SAC5B,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,MAAM,CAAA;IACtB,CAAC;CACJ;AAtCD,8BAsCC"}
|
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
/** Load an additional env file, overriding already-defined vars. */
|
|
2
|
-
export declare function loadEnv(path?: string): void;
|
|
3
1
|
export declare function getenv<T = string>(name: string, def: T): T;
|
|
4
2
|
/** Вариации значений в зависимости от окружения */
|
|
5
3
|
export declare function variation<T>(devBranch: T, releaseBranch: T, masterBranch: T): T;
|
|
4
|
+
/**
|
|
5
|
+
* Типизированный доступ ко всем env-переменным пакета (префикс `GS_`) с уже прописанными
|
|
6
|
+
* дефолтами. Геттеры читают `process.env` при каждом обращении (не кешируют) — так значение
|
|
7
|
+
* можно переопределить в рантайме (актуально для тестов).
|
|
8
|
+
*/
|
|
9
|
+
export declare const env: {
|
|
10
|
+
readonly host: string;
|
|
11
|
+
readonly port: number;
|
|
12
|
+
readonly routePrefix: string;
|
|
13
|
+
readonly apiHeader: string;
|
|
14
|
+
readonly apiKey: string;
|
|
15
|
+
readonly logLevel: "debug" | "info";
|
|
16
|
+
readonly appEnv: string;
|
|
17
|
+
readonly sentryDsn: string;
|
|
18
|
+
readonly sentryRate: number;
|
|
19
|
+
};
|
|
6
20
|
//# sourceMappingURL=env.helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.helper.d.ts","sourceRoot":"","sources":["../../helpers/env.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.helper.d.ts","sourceRoot":"","sources":["../../helpers/env.helper.ts"],"names":[],"mappings":"AAsBA,wBAAgB,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAY1D;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAY/E;AAED;;;;GAIG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;CAUf,CAAA"}
|
|
@@ -3,17 +3,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.env = void 0;
|
|
7
7
|
exports.getenv = getenv;
|
|
8
8
|
exports.variation = variation;
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
10
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
10
|
-
|
|
11
|
-
//
|
|
11
|
+
const minimist_1 = __importDefault(require("minimist"));
|
|
12
|
+
// 1) Default: load ./.env relative to the process cwd (unchanged behaviour).
|
|
12
13
|
dotenv_1.default.config();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
// 2) Priority override via the CLI flag `--env <path>` | `--env=<path>`.
|
|
15
|
+
// Applied HERE, on module import — before logger.helper reads LOG_LEVEL. This is intentionally
|
|
16
|
+
// an app-level flag parsed from process.argv (not Node's `--env-file`), which gives us control
|
|
17
|
+
// over both the timing and `override` across all supported Node versions.
|
|
18
|
+
const cliEnvPath = (0, minimist_1.default)(process.argv.slice(2)).env;
|
|
19
|
+
if (typeof cliEnvPath === 'string' && cliEnvPath) {
|
|
20
|
+
// Relative paths resolve against the process cwd; absolute paths are used as-is.
|
|
21
|
+
const { error } = dotenv_1.default.config({ path: node_path_1.default.resolve(cliEnvPath), override: true });
|
|
22
|
+
if (error) {
|
|
23
|
+
// The logger is not created yet — write straight to stderr.
|
|
24
|
+
console.warn(`[trueserver] --env "${cliEnvPath}" not loaded: ${error.message}`);
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
27
|
function getenv(name, def) {
|
|
@@ -34,9 +42,25 @@ function variation(devBranch, releaseBranch, masterBranch) {
|
|
|
34
42
|
release: releaseBranch,
|
|
35
43
|
master: masterBranch,
|
|
36
44
|
};
|
|
37
|
-
if (process.env.
|
|
38
|
-
return variations[process.env.
|
|
45
|
+
if (process.env.GS_APP_ENV && process.env.GS_APP_ENV in variations) {
|
|
46
|
+
return variations[process.env.GS_APP_ENV];
|
|
39
47
|
}
|
|
40
48
|
return masterBranch;
|
|
41
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Типизированный доступ ко всем env-переменным пакета (префикс `GS_`) с уже прописанными
|
|
52
|
+
* дефолтами. Геттеры читают `process.env` при каждом обращении (не кешируют) — так значение
|
|
53
|
+
* можно переопределить в рантайме (актуально для тестов).
|
|
54
|
+
*/
|
|
55
|
+
exports.env = {
|
|
56
|
+
get host() { return getenv('GS_HOST', 'localhost'); },
|
|
57
|
+
get port() { return Number.parseInt(getenv('GS_PORT', '2980'), 10); },
|
|
58
|
+
get routePrefix() { return getenv('GS_ROUTE_PREFIX', ''); },
|
|
59
|
+
get apiHeader() { return getenv('GS_API_HEADER', 'x-api-key'); },
|
|
60
|
+
get apiKey() { return getenv('GS_API_KEY', 'test'); },
|
|
61
|
+
get logLevel() { return getenv('GS_LOG_LEVEL', variation('debug', 'info', 'info')); },
|
|
62
|
+
get appEnv() { return getenv('GS_APP_ENV', undefined); },
|
|
63
|
+
get sentryDsn() { return getenv('GS_SENTRY_DSN', undefined); },
|
|
64
|
+
get sentryRate() { return parseFloat(getenv('GS_SENTRY_RATE', '0.01')); },
|
|
65
|
+
};
|
|
42
66
|
//# sourceMappingURL=env.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.helper.js","sourceRoot":"","sources":["../../helpers/env.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.helper.js","sourceRoot":"","sources":["../../helpers/env.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ function registerPlugin(callback) {
|
|
|
18
18
|
return (0, fastify_plugin_1.default)(callback);
|
|
19
19
|
}
|
|
20
20
|
function getRoutePrefix() {
|
|
21
|
-
return
|
|
21
|
+
return env_helper_1.env.routePrefix;
|
|
22
22
|
}
|
|
23
23
|
/** Public Swagger UI mount point — shared by the swagger plugin and the apikey allowlist */
|
|
24
24
|
exports.DOCS_ROUTE_PREFIX = '/docs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.helper.js","sourceRoot":"","sources":["../../helpers/fastify.helper.ts"],"names":[],"mappings":";;;;;;AAoBA,sCAEC;AAED,wCAEC;AAED,wCAEC;AAMD,8BAUC;AAzCD,oEAA0C;AAE1C,
|
|
1
|
+
{"version":3,"file":"fastify.helper.js","sourceRoot":"","sources":["../../helpers/fastify.helper.ts"],"names":[],"mappings":";;;;;;AAoBA,sCAEC;AAED,wCAEC;AAED,wCAEC;AAMD,8BAUC;AAzCD,oEAA0C;AAE1C,6CAAkC;AAClC,mDAAwD;AAYxD,SAAgB,aAAa,CAAC,QAAqD;IAC/E,OAAO,QAAQ,CAAA;AACnB,CAAC;AAED,SAAgB,cAAc,CAAC,QAAqD;IAChF,OAAO,IAAA,wBAAa,EAAC,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,SAAgB,cAAc;IAC1B,OAAO,gBAAG,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED,4FAA4F;AAC/E,QAAA,iBAAiB,GAAG,OAAO,CAAA;AAExC,yCAAyC;AACzC,SAAgB,SAAS,CACrB,OAAe,EACf,aAAqB,GAAG,EACxB,OAAmB,0BAAU,CAAC,SAAS;IAEvC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAuB,CAAA;IACtD,KAAK,CAAC,UAAU,GAAG,UAAU,CAAA;IAC7B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAA;IAEtB,OAAO,KAAK,CAAA;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.helper.d.ts","sourceRoot":"","sources":["../../helpers/logger.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"logger.helper.d.ts","sourceRoot":"","sources":["../../helpers/logger.helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAc3E,eAAO,MAAM,aAAa,EAC1B,OAAO,GACP,oBAAoB,CAAC,aAAa,CAAC,GAAG,iBAAiB,GACvD,iBA6BC,CAAA;AAED,eAAO,MAAM,MAAM,8BAA6B,CAAA"}
|
|
@@ -6,16 +6,42 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.logger = exports.loggerOptions = void 0;
|
|
7
7
|
const pino_1 = __importDefault(require("pino"));
|
|
8
8
|
const env_helper_1 = require("./env.helper");
|
|
9
|
+
// Pretty-печать только для локальной разработки (GS_APP_ENV=dev). В release/master
|
|
10
|
+
// (staging/production) логгер пишет сырой NDJSON в stdout — это быстрее (без воркер-треда
|
|
11
|
+
// pino-pretty) и корректно парсится агрегаторами логов (Loki/ELK/Datadog/CloudWatch).
|
|
12
|
+
const isDev = (0, env_helper_1.variation)(true, false, false);
|
|
13
|
+
// Единый уровень по умолчанию, зависящий от окружения; всегда переопределяем через GS_LOG_LEVEL.
|
|
14
|
+
// dev → debug (шумно, но удобно локально), release/master → info.
|
|
15
|
+
const level = env_helper_1.env.logLevel;
|
|
9
16
|
exports.loggerOptions = {
|
|
10
|
-
level
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
level,
|
|
18
|
+
// Скрываем секреты из логов (заголовки авторизации, cookie, токены/подписи в payload).
|
|
19
|
+
// Структуру не удаляем — заменяем значение, чтобы не ломать форму записей.
|
|
20
|
+
redact: {
|
|
21
|
+
paths: [
|
|
22
|
+
'req.headers.authorization',
|
|
23
|
+
'req.headers.cookie',
|
|
24
|
+
'headers.authorization',
|
|
25
|
+
'headers.cookie',
|
|
26
|
+
'token',
|
|
27
|
+
'password',
|
|
28
|
+
'signature',
|
|
29
|
+
'*.token',
|
|
30
|
+
'*.password',
|
|
31
|
+
'*.signature',
|
|
32
|
+
],
|
|
33
|
+
censor: '[redacted]',
|
|
18
34
|
},
|
|
35
|
+
...(isDev && {
|
|
36
|
+
transport: {
|
|
37
|
+
target: 'pino-pretty',
|
|
38
|
+
options: {
|
|
39
|
+
translateTime: 'UTC:yyyy-mm-dd HH:MM:ss.l',
|
|
40
|
+
colorize: true,
|
|
41
|
+
singleLine: true,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
19
45
|
};
|
|
20
46
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
47
|
exports.logger = (0, pino_1.default)(exports.loggerOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.helper.js","sourceRoot":"","sources":["../../helpers/logger.helper.ts"],"names":[],"mappings":";;;;;;AAEA,gDAAuB;AAEvB,
|
|
1
|
+
{"version":3,"file":"logger.helper.js","sourceRoot":"","sources":["../../helpers/logger.helper.ts"],"names":[],"mappings":";;;;;;AAEA,gDAAuB;AAEvB,6CAA6C;AAE7C,mFAAmF;AACnF,0FAA0F;AAC1F,sFAAsF;AACtF,MAAM,KAAK,GAAG,IAAA,sBAAS,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAE3C,iGAAiG;AACjG,kEAAkE;AAClE,MAAM,KAAK,GAAG,gBAAG,CAAC,QAAQ,CAAA;AAEb,QAAA,aAAa,GAGN;IAChB,KAAK;IACL,uFAAuF;IACvF,2EAA2E;IAC3E,MAAM,EAAE;QACJ,KAAK,EAAE;YACH,2BAA2B;YAC3B,oBAAoB;YACpB,uBAAuB;YACvB,gBAAgB;YAChB,OAAO;YACP,UAAU;YACV,WAAW;YACX,SAAS;YACT,YAAY;YACZ,aAAa;SAChB;QACD,MAAM,EAAE,YAAY;KACvB;IACD,GAAG,CAAC,KAAK,IAAI;QACT,SAAS,EAAE;YACP,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACL,aAAa,EAAE,2BAA2B;gBAC1C,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;aACnB;SACJ;KACJ,CAAC;CACL,CAAA;AACD,8DAA8D;AACjD,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC,qBAAoB,CAAC,CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Schema, ValidateFunction } from 'ajv';
|
|
2
|
+
import { env } from './env.helper';
|
|
2
3
|
import { FastifyTypebox } from './fastify.helper';
|
|
3
4
|
export declare function testBuild(): FastifyTypebox;
|
|
4
5
|
export declare const testHeaders: {
|
|
5
|
-
|
|
6
|
+
[env.apiHeader]: string;
|
|
6
7
|
};
|
|
7
8
|
export declare function validator(schema: Schema): ValidateFunction;
|
|
8
9
|
export declare function checkSchemaPropertyDescriptions(props: Record<string, any>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tests.helper.d.ts","sourceRoot":"","sources":["../../helpers/tests.helper.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"tests.helper.d.ts","sourceRoot":"","sources":["../../helpers/tests.helper.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,CAAA;AAGnD,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,wBAAgB,SAAS,IAAI,cAAc,CAQ1C;AAED,eAAO,MAAM,WAAW;IACpB,CAAC,GAAG,CAAC,SAAS,CAAC,SAAY;CAC9B,CAAA;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAK1D;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAgBzE"}
|
|
@@ -20,7 +20,7 @@ function testBuild() {
|
|
|
20
20
|
}).withTypeProvider();
|
|
21
21
|
}
|
|
22
22
|
exports.testHeaders = {
|
|
23
|
-
[
|
|
23
|
+
[env_helper_1.env.apiHeader]: env_helper_1.env.apiKey,
|
|
24
24
|
};
|
|
25
25
|
function validator(schema) {
|
|
26
26
|
const ajv = new ajv_1.default({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tests.helper.js","sourceRoot":"","sources":["../../helpers/tests.helper.ts"],"names":[],"mappings":";;;;;;AAOA,8BAQC;AAMD,8BAKC;AAED,0EAgBC;AA3CD,8CAAmD;AACnD,sDAA6B;AAE7B,
|
|
1
|
+
{"version":3,"file":"tests.helper.js","sourceRoot":"","sources":["../../helpers/tests.helper.ts"],"names":[],"mappings":";;;;;;AAOA,8BAQC;AAMD,8BAKC;AAED,0EAgBC;AA3CD,8CAAmD;AACnD,sDAA6B;AAE7B,6CAAkC;AAGlC,SAAgB,SAAS;IACrB,OAAO,IAAA,iBAAO,EAAC;QACX,GAAG,EAAE;YACD,aAAa,EAAE;gBACX,QAAQ,EAAE,CAAC,YAAY,CAAC;aAC3B;SACJ;KACJ,CAAC,CAAC,gBAAgB,EAAuB,CAAA;AAC9C,CAAC;AAEY,QAAA,WAAW,GAAG;IACvB,CAAC,gBAAG,CAAC,SAAS,CAAC,EAAE,gBAAG,CAAC,MAAM;CAC9B,CAAA;AAED,SAAgB,SAAS,CAAC,MAAc;IACpC,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC;QAChB,QAAQ,EAAE,CAAC,YAAY,CAAC;KAC3B,CAAC,CAAA;IACF,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC;AAED,SAAgB,+BAA+B,CAAC,KAA0B;IACtE,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,aAAa,GAAa,EAAE,CAAA;IAElC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE;QACjD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnB,IAAI,UAAU,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5B,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,+BAA+B,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;QAC1D,CAAC;IACL,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;AAC3C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { default as Application } from './application';
|
|
2
2
|
export { getGameConfig, registerGameConfig, type TGameConfig, } from './helpers/config.helper';
|
|
3
|
-
export { getenv, variation } from './helpers/env.helper';
|
|
3
|
+
export { env, getenv, variation } from './helpers/env.helper';
|
|
4
4
|
export { EErrorCode, type TErrorCode, } from './helpers/errors.helper';
|
|
5
5
|
export { type FastifyTypebox, type FastifyError$Coded, getRoutePrefix, httpError, registerPlugin, registerRoute, } from './helpers/fastify.helper';
|
|
6
6
|
export { type RouteHandler, type TRtpParams, HandlersHelper, handlers, } from './helpers/handlers.helper';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,KAAK,WAAW,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,KAAK,WAAW,GACnB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EACH,UAAU,EACV,KAAK,UAAU,GAClB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,GAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,cAAc,EACd,QAAQ,GACX,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAEvE,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACxB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,GACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,GACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACH,sBAAsB,EACtB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GAC3B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,GACpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,UAAU,GAClB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACxB,MAAM,2BAA2B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -3,13 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ValidateRequestSchema = exports.ValidateReplySchema = exports.StakeSchema = exports.StakeModeSchema = exports.RequestErrorSchema = exports.MetaSchema = exports.InternalErrorSchema = exports.HeadersSchema = exports.EStakeType = exports.EEnvironment = exports.AccessErrorSchema = exports.PlayRequestSchema = exports.PlayReplySchema = exports.HealthcheckRequestSchema = exports.HealthcheckReplySchema = exports.ConfigRequestSchema = exports.ConfigReplySchema = exports.ClientRequestSchema = exports.ClientReplySchema = exports.ChecksumRequestSchema = exports.ChecksumReplySchema = exports.randomOf = exports.random = exports.getByChance = exports.isExactDecimal = exports.roundMoney = exports.Big = exports.loggerOptions = exports.logger = exports.handlers = exports.HandlersHelper = exports.registerRoute = exports.registerPlugin = exports.httpError = exports.getRoutePrefix = exports.EErrorCode = exports.variation = exports.getenv = exports.registerGameConfig = exports.getGameConfig = exports.Application = void 0;
|
|
6
|
+
exports.ValidateRequestSchema = exports.ValidateReplySchema = exports.StakeSchema = exports.StakeModeSchema = exports.RequestErrorSchema = exports.MetaSchema = exports.InternalErrorSchema = exports.HeadersSchema = exports.EStakeType = exports.EEnvironment = exports.AccessErrorSchema = exports.PlayRequestSchema = exports.PlayReplySchema = exports.HealthcheckRequestSchema = exports.HealthcheckReplySchema = exports.ConfigRequestSchema = exports.ConfigReplySchema = exports.ClientRequestSchema = exports.ClientReplySchema = exports.ChecksumRequestSchema = exports.ChecksumReplySchema = exports.randomOf = exports.random = exports.getByChance = exports.isExactDecimal = exports.roundMoney = exports.Big = exports.loggerOptions = exports.logger = exports.handlers = exports.HandlersHelper = exports.registerRoute = exports.registerPlugin = exports.httpError = exports.getRoutePrefix = exports.EErrorCode = exports.variation = exports.getenv = exports.env = exports.registerGameConfig = exports.getGameConfig = exports.Application = void 0;
|
|
7
7
|
var application_1 = require("./application");
|
|
8
8
|
Object.defineProperty(exports, "Application", { enumerable: true, get: function () { return __importDefault(application_1).default; } });
|
|
9
9
|
var config_helper_1 = require("./helpers/config.helper");
|
|
10
10
|
Object.defineProperty(exports, "getGameConfig", { enumerable: true, get: function () { return config_helper_1.getGameConfig; } });
|
|
11
11
|
Object.defineProperty(exports, "registerGameConfig", { enumerable: true, get: function () { return config_helper_1.registerGameConfig; } });
|
|
12
12
|
var env_helper_1 = require("./helpers/env.helper");
|
|
13
|
+
Object.defineProperty(exports, "env", { enumerable: true, get: function () { return env_helper_1.env; } });
|
|
13
14
|
Object.defineProperty(exports, "getenv", { enumerable: true, get: function () { return env_helper_1.getenv; } });
|
|
14
15
|
Object.defineProperty(exports, "variation", { enumerable: true, get: function () { return env_helper_1.variation; } });
|
|
15
16
|
var errors_helper_1 = require("./helpers/errors.helper");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,yDAIgC;AAH5B,8GAAA,aAAa,OAAA;AACb,mHAAA,kBAAkB,OAAA;AAGtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,yDAIgC;AAH5B,8GAAA,aAAa,OAAA;AACb,mHAAA,kBAAkB,OAAA;AAGtB,mDAA6D;AAApD,iGAAA,GAAG,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,uGAAA,SAAS,OAAA;AAC/B,yDAGgC;AAF5B,2GAAA,UAAU,OAAA;AAGd,2DAOiC;AAJ7B,gHAAA,cAAc,OAAA;AACd,2GAAA,SAAS,OAAA;AACT,gHAAA,cAAc,OAAA;AACd,+GAAA,aAAa,OAAA;AAEjB,6DAKkC;AAF9B,iHAAA,cAAc,OAAA;AACd,2GAAA,QAAQ,OAAA;AAEZ,yDAA+D;AAAtD,uGAAA,MAAM,OAAA;AAAE,8GAAA,aAAa,OAAA;AAC9B,uDAAwE;AAA/D,mGAAA,GAAG,OAAA;AAAE,0GAAA,UAAU,OAAA;AAAE,8GAAA,cAAc,OAAA;AACxC,yDAAuE;AAA9D,4GAAA,WAAW,OAAA;AAAE,uGAAA,MAAM,OAAA;AAAE,yGAAA,QAAQ,OAAA;AAEtC,6DAKkC;AAJ9B,sHAAA,mBAAmB,OAAA;AACnB,wHAAA,qBAAqB,OAAA;AAIzB,yDAKgC;AAJ5B,kHAAA,iBAAiB,OAAA;AACjB,oHAAA,mBAAmB,OAAA;AAIvB,yDAKgC;AAJ5B,kHAAA,iBAAiB,OAAA;AACjB,oHAAA,mBAAmB,OAAA;AAIvB,mEAKqC;AAJjC,4HAAA,sBAAsB,OAAA;AACtB,8HAAA,wBAAwB,OAAA;AAI5B,qDAK8B;AAJ1B,8GAAA,eAAe,OAAA;AACf,gHAAA,iBAAiB,OAAA;AAIrB,2CAiByB;AAhBrB,2GAAA,iBAAiB,OAAA;AACjB,sGAAA,YAAY,OAAA;AACZ,oGAAA,UAAU,OAAA;AACV,uGAAA,aAAa,OAAA;AACb,6GAAA,mBAAmB,OAAA;AACnB,oGAAA,UAAU,OAAA;AACV,4GAAA,kBAAkB,OAAA;AAClB,yGAAA,eAAe,OAAA;AACf,qGAAA,WAAW,OAAA;AASf,6DAKkC;AAJ9B,sHAAA,mBAAmB,OAAA;AACnB,wHAAA,qBAAqB,OAAA"}
|
|
@@ -12,8 +12,8 @@ const apikeyPlugin = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
|
12
12
|
done();
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
|
-
const currentKey = request.headers[
|
|
16
|
-
const expectedKey =
|
|
15
|
+
const currentKey = request.headers[env_helper_1.env.apiHeader];
|
|
16
|
+
const expectedKey = env_helper_1.env.apiKey;
|
|
17
17
|
if (currentKey !== expectedKey) {
|
|
18
18
|
throw (0, fastify_helper_1.httpError)("API_KEY doesn't match", 403, errors_helper_1.EErrorCode.ApiKey);
|
|
19
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apikey.plugin.js","sourceRoot":"","sources":["../../plugins/apikey.plugin.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"apikey.plugin.js","sourceRoot":"","sources":["../../plugins/apikey.plugin.ts"],"names":[],"mappings":";;AAAA,sDAA2C;AAC3C,4DAAqD;AACrD,8DAAwF;AAExF,MAAM,YAAY,GAAG,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAClD,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;QACpD,6FAA6F;QAC7F,wEAAwE;QACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;QACxD,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,kCAAiB,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,kCAAiB,GAAG,CAAC,EAAE,CAAC;YACrG,IAAI,EAAE,CAAA;YACN,OAAM;QACV,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAG,CAAC,SAAS,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,gBAAG,CAAC,MAAM,CAAA;QAE9B,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC7B,MAAM,IAAA,0BAAS,EAAC,uBAAuB,EAAE,GAAG,EAAE,0BAAU,CAAC,MAAM,CAAC,CAAA;QACpE,CAAC;QAED,IAAI,EAAE,CAAA;IACV,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,kBAAe,YAAY,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.plugin.d.ts","sourceRoot":"","sources":["../../plugins/logger.plugin.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"logger.plugin.d.ts","sourceRoot":"","sources":["../../plugins/logger.plugin.ts"],"names":[],"mappings":";AAIA,wBAkDE"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const pino_1 = require("pino");
|
|
4
|
-
const env_helper_1 = require("../helpers/env.helper");
|
|
5
4
|
const fastify_helper_1 = require("../helpers/fastify.helper");
|
|
6
|
-
const level = (0, env_helper_1.getenv)('LOG_LEVEL', 'error');
|
|
7
5
|
exports.default = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
6
|
+
// Единый источник истины — реальный уровень уже сконфигурированного логгера,
|
|
7
|
+
// а не повторное чтение GS_LOG_LEVEL (иначе гейтинг хуков может разъехаться с логгером).
|
|
8
|
+
// Невалидный уровень трактуем как info.
|
|
9
|
+
const level = pino_1.levels.values[fastify.log.level] ?? pino_1.levels.values.info;
|
|
8
10
|
// Override due to {"disableRequestLogging": true}
|
|
9
|
-
if (
|
|
11
|
+
if (level <= pino_1.levels.values.info) {
|
|
10
12
|
fastify.addHook('onRequest', (request, _reply, done) => {
|
|
11
13
|
request.log.info({
|
|
12
14
|
url: request.raw.url,
|
|
@@ -15,7 +17,7 @@ exports.default = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
|
15
17
|
});
|
|
16
18
|
}
|
|
17
19
|
// Override due to {"disableRequestLogging": true}
|
|
18
|
-
if (
|
|
20
|
+
if (level <= pino_1.levels.values.info) {
|
|
19
21
|
fastify.addHook('onResponse', (request, reply, done) => {
|
|
20
22
|
request.log.info({
|
|
21
23
|
statusCode: reply.raw.statusCode,
|
|
@@ -24,7 +26,7 @@ exports.default = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
|
24
26
|
done();
|
|
25
27
|
});
|
|
26
28
|
}
|
|
27
|
-
if (
|
|
29
|
+
if (level <= pino_1.levels.values.trace) {
|
|
28
30
|
fastify.addHook('preHandler', (request, _reply, done) => {
|
|
29
31
|
request.log.trace({
|
|
30
32
|
payload: request.body,
|
|
@@ -32,7 +34,7 @@ exports.default = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
|
32
34
|
done();
|
|
33
35
|
});
|
|
34
36
|
}
|
|
35
|
-
if (
|
|
37
|
+
if (level <= pino_1.levels.values.trace) {
|
|
36
38
|
fastify.addHook('preSerialization', (request, _reply, payload, done) => {
|
|
37
39
|
try {
|
|
38
40
|
request.log.trace({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.plugin.js","sourceRoot":"","sources":["../../plugins/logger.plugin.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAE7B,
|
|
1
|
+
{"version":3,"file":"logger.plugin.js","sourceRoot":"","sources":["../../plugins/logger.plugin.ts"],"names":[],"mappings":";;AAAA,+BAA6B;AAE7B,8DAA0D;AAE1D,kBAAe,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAC5C,6EAA6E;IAC7E,yFAAyF;IACzF,wCAAwC;IACxC,MAAM,KAAK,GAAG,aAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,aAAM,CAAC,MAAM,CAAC,IAAI,CAAA;IAEpE,kDAAkD;IAClD,IAAI,KAAK,IAAI,aAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACb,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG;aACvB,EAAE,kBAAkB,CAAC,CAAA;YACtB,IAAI,EAAE,CAAA;QACV,CAAC,CAAC,CAAA;IACN,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAK,IAAI,aAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBACb,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU;gBAChC,YAAY,EAAE,KAAK,CAAC,WAAW;aAClC,EAAE,mBAAmB,CAAC,CAAA;YACvB,IAAI,EAAE,CAAA;QACV,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI,KAAK,IAAI,aAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACd,OAAO,EAAE,OAAO,CAAC,IAAI;aACxB,EAAE,iBAAiB,CAAC,CAAA;YACrB,IAAI,EAAE,CAAA;QACV,CAAC,CAAC,CAAA;IACN,CAAC;IAED,IAAI,KAAK,IAAI,aAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YACnE,IAAI,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBACd,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAiB,CAAC;iBACzC,EAAE,eAAe,CAAC,CAAA;YACvB,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBACd,OAAO;iBACV,EAAE,eAAe,CAAC,CAAA;YACvB,CAAC;YACD,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACN,CAAC;AACL,CAAC,CAAC,CAAA"}
|
|
@@ -10,9 +10,9 @@ const fastify_helper_1 = require("../helpers/fastify.helper");
|
|
|
10
10
|
const sentryPlugin = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
11
11
|
const gameConfig = (0, config_helper_1.getGameConfig)();
|
|
12
12
|
fastify.register(fastify_sentry_1.default, {
|
|
13
|
-
dsn:
|
|
13
|
+
dsn: env_helper_1.env.sentryDsn,
|
|
14
14
|
environment: (0, env_helper_1.variation)('development', 'staging', 'production'),
|
|
15
|
-
tracesSampleRate:
|
|
15
|
+
tracesSampleRate: env_helper_1.env.sentryRate, // 1% by default
|
|
16
16
|
setErrorHandler: false,
|
|
17
17
|
});
|
|
18
18
|
fastify.addHook('onReady', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentry.plugin.js","sourceRoot":"","sources":["../../plugins/sentry.plugin.ts"],"names":[],"mappings":";;;;;AAAA,qFAA2D;AAE3D,4DAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"sentry.plugin.js","sourceRoot":"","sources":["../../plugins/sentry.plugin.ts"],"names":[],"mappings":";;;;;AAAA,qFAA2D;AAE3D,4DAAwD;AACxD,sDAAsD;AACtD,8DAA0D;AAE1D,MAAM,YAAY,GAAG,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IAClD,MAAM,UAAU,GAAG,IAAA,6BAAa,GAAE,CAAA;IAElC,OAAO,CAAC,QAAQ,CAAC,wBAAa,EAAE;QAC5B,GAAG,EAAE,gBAAG,CAAC,SAAS;QAClB,WAAW,EAAE,IAAA,sBAAS,EAAC,aAAa,EAAE,SAAS,EAAE,YAAY,CAAC;QAC9D,gBAAgB,EAAE,gBAAG,CAAC,UAAU,EAAE,gBAAgB;QAClD,eAAe,EAAE,KAAK;KACzB,CAAC,CAAA;IAEF,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE;QAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,kBAAe,YAAY,CAAA"}
|
|
@@ -16,7 +16,7 @@ const play_schema_1 = require("../schemas/play.schema");
|
|
|
16
16
|
const shared_1 = require("../schemas/shared");
|
|
17
17
|
const validate_schema_1 = require("../schemas/validate.schema");
|
|
18
18
|
const swaggerPlugin = (0, fastify_helper_1.registerPlugin)(async (fastify) => {
|
|
19
|
-
if ((0, env_helper_1.variation)(false,
|
|
19
|
+
if ((0, env_helper_1.variation)(false, true, true))
|
|
20
20
|
return;
|
|
21
21
|
const gameConfig = (0, config_helper_1.getGameConfig)();
|
|
22
22
|
const routePrefix = fastify_helper_1.DOCS_ROUTE_PREFIX;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger.plugin.js","sourceRoot":"","sources":["../../plugins/swagger.plugin.ts"],"names":[],"mappings":";;;;;AAAA,+DAA6C;AAC7C,qEAAkD;AAElD,4DAAwD;AACxD,sDAAiD;AACjD,8DAA6E;AAC7E,sEAAiE;AACjE,gEAAuF;AACvF,4DAAiF;AACjF,4DAAiF;AACjF,wDAA2E;AAC3E,8CAE0B;AAC1B,gEAAuF;AAEvF,MAAM,aAAa,GAAG,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACnD,IAAI,IAAA,sBAAS,EAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"swagger.plugin.js","sourceRoot":"","sources":["../../plugins/swagger.plugin.ts"],"names":[],"mappings":";;;;;AAAA,+DAA6C;AAC7C,qEAAkD;AAElD,4DAAwD;AACxD,sDAAiD;AACjD,8DAA6E;AAC7E,sEAAiE;AACjE,gEAAuF;AACvF,4DAAiF;AACjF,4DAAiF;AACjF,wDAA2E;AAC3E,8CAE0B;AAC1B,gEAAuF;AAEvF,MAAM,aAAa,GAAG,IAAA,+BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACnD,IAAI,IAAA,sBAAS,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC;QAAE,OAAM;IAExC,MAAM,UAAU,GAAG,IAAA,6BAAa,GAAE,CAAA;IAClC,MAAM,WAAW,GAAG,kCAAiB,CAAA;IAErC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACjC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,CAAC,iBAAc,EAAE;QAC7B,OAAO,EAAE;YACL,IAAI,EAAE;gBACF,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,IAAA,sCAAiB,GAAE;aAC/B;SACJ;KACJ,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,CAAC,oBAAgB,EAAE;QAC/B,WAAW;QACX,QAAQ,EAAE;YACN,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,KAAK;SACrB;QACD,KAAK,EAAE;YACH,KAAK,EAAE,aAAa,UAAU,CAAC,MAAM,EAAE;SAC1C;KACJ,CAAC,CAAA;IAEF,OAAO,CAAC,SAAS,CAAC,oBAAW,CAAC,CAAA;IAC9B,OAAO,CAAC,SAAS,CAAC,wBAAe,CAAC,CAAA;IAClC,OAAO,CAAC,SAAS,CAAC,mBAAU,CAAC,CAAA;IAC7B,OAAO,CAAC,SAAS,CAAC,2BAAkB,CAAC,CAAA;IACrC,OAAO,CAAC,SAAS,CAAC,0BAAiB,CAAC,CAAA;IACpC,OAAO,CAAC,SAAS,CAAC,4BAAmB,CAAC,CAAA;IACtC,OAAO,CAAC,SAAS,CAAC,+BAAiB,CAAC,CAAA;IACpC,OAAO,CAAC,SAAS,CAAC,6BAAe,CAAC,CAAA;IAClC,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAA;IACxC,OAAO,CAAC,SAAS,CAAC,qCAAmB,CAAC,CAAA;IACtC,OAAO,CAAC,SAAS,CAAC,mCAAmB,CAAC,CAAA;IACtC,OAAO,CAAC,SAAS,CAAC,iCAAiB,CAAC,CAAA;IACpC,OAAO,CAAC,SAAS,CAAC,mCAAmB,CAAC,CAAA;IACtC,OAAO,CAAC,SAAS,CAAC,iCAAiB,CAAC,CAAA;IACpC,OAAO,CAAC,SAAS,CAAC,uCAAqB,CAAC,CAAA;IACxC,OAAO,CAAC,SAAS,CAAC,qCAAmB,CAAC,CAAA;AAC1C,CAAC,CAAC,CAAA;AAEF,kBAAe,aAAa,CAAA"}
|
package/dist/schemas/shared.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Static } from '@sinclair/typebox';
|
|
2
|
+
import { env } from '../helpers/env.helper';
|
|
2
3
|
export declare enum EStakeType {
|
|
3
4
|
default = "default",
|
|
4
5
|
buy = "buy",
|
|
@@ -37,7 +38,7 @@ export declare const MetaSchema: import("@sinclair/typebox").TObject<{
|
|
|
37
38
|
private: import("@sinclair/typebox").TAny;
|
|
38
39
|
}>;
|
|
39
40
|
export declare const HeadersSchema: import("@sinclair/typebox").TObject<{
|
|
40
|
-
|
|
41
|
+
[env.apiHeader]: import("@sinclair/typebox").TString;
|
|
41
42
|
}>;
|
|
42
43
|
export declare const InternalErrorSchema: import("@sinclair/typebox").TObject<{
|
|
43
44
|
status: import("@sinclair/typebox").TLiteral<false>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../schemas/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../schemas/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AAE3C,oBAAY,UAAU;IAClB,OAAO,YAAY;IACnB,GAAG,QAAQ;IACX,QAAQ,aAAa;CACxB;AAED,oBAAY,YAAY;IACpB,WAAW,gBAAgB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;CAC5B;AAED,MAAM,MAAM,SAAS,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG;QACX,KAAK,EAAE,GAAG,CAAC;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;CACJ,CAAA;AAED,eAAO,MAAM,WAAW;;;;;;;EA2BtB,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;EAyB1B,CAAA;AAEF,eAAO,MAAM,UAAU;;;EAWrB,CAAA;AAEF,eAAO,MAAM,aAAa;IACtB,CAAC,GAAG,CAAC,SAAS,CAAC,sCAGb;EACJ,CAAA;AAcF,eAAO,MAAM,mBAAmB;;;;EAS9B,CAAA;AAEF,eAAO,MAAM,kBAAkB;;;;EAS7B,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;EAS5B,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAA;AACvD,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA;AAC7C,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAC7D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
|
package/dist/schemas/shared.js
CHANGED
|
@@ -82,7 +82,7 @@ exports.MetaSchema = typebox_1.Type.Object({
|
|
|
82
82
|
additionalProperties: false,
|
|
83
83
|
});
|
|
84
84
|
exports.HeadersSchema = typebox_1.Type.Object({
|
|
85
|
-
[
|
|
85
|
+
[env_helper_1.env.apiHeader]: typebox_1.Type.String({
|
|
86
86
|
description: 'Shared API key used to authenticate all RGS → Game Server calls',
|
|
87
87
|
examples: ['test'],
|
|
88
88
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../schemas/shared.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEhD,
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../schemas/shared.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truelab/trueserver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "TrueLab Fastify server package: routes, schemas, and plugins for TrueLab game backends",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -74,11 +74,13 @@
|
|
|
74
74
|
"dotenv": "^16.6.1",
|
|
75
75
|
"fastify": "^4.29.1",
|
|
76
76
|
"fastify-plugin": "^4.5.1",
|
|
77
|
+
"minimist": "^1.2.8",
|
|
77
78
|
"pino": "^8.21.0",
|
|
78
79
|
"pino-pretty": "^10.3.1"
|
|
79
80
|
},
|
|
80
81
|
"devDependencies": {
|
|
81
82
|
"@types/big.js": "^6.2.2",
|
|
83
|
+
"@types/minimist": "^1.2.5",
|
|
82
84
|
"@types/node": "^16.18.126",
|
|
83
85
|
"typescript": "^5.9.3",
|
|
84
86
|
"vitest": "^4.1.9"
|