mega-framework 0.1.6 → 0.1.7

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 (233) hide show
  1. package/bin/mega-ws-hub.js +2 -2
  2. package/package.json +32 -8
  3. package/sample/crud/.env +1 -1
  4. package/sample/crud/.env.example +1 -1
  5. package/sample/crud/.mega/journal/history/20260612092543-create-users.json +261 -0
  6. package/sample/crud/.mega/journal/snapshot.json +261 -0
  7. package/sample/crud/apps/main/controllers/auth-controller.js +22 -14
  8. package/sample/crud/apps/main/controllers/web-controller.js +7 -5
  9. package/sample/crud/apps/main/migrations/20260606000001-create-users.js +91 -13
  10. package/sample/crud/apps/main/migrations/20260606000002-create-boards.js +165 -0
  11. package/sample/crud/apps/main/migrations/20260606000003-create-logs.js +107 -0
  12. package/sample/crud/apps/main/models/log-partition-model.js +105 -0
  13. package/sample/crud/apps/main/models/note-model.js +79 -0
  14. package/sample/crud/apps/main/models/user-level-model.js +24 -0
  15. package/sample/crud/apps/main/models/user-model.js +146 -0
  16. package/sample/crud/apps/main/models/user-type-model.js +21 -0
  17. package/sample/crud/apps/main/models/wallet-model.js +24 -0
  18. package/sample/crud/apps/main/routes/users.js +55 -10
  19. package/sample/crud/apps/main/schedules/log-partition-schedule.js +33 -0
  20. package/sample/crud/apps/main/services/auth-service.js +39 -24
  21. package/sample/crud/apps/main/services/log-partition-service.js +101 -0
  22. package/sample/crud/apps/main/services/note-service.js +6 -6
  23. package/sample/crud/apps/main/services/redis-demo-service.js +3 -3
  24. package/sample/crud/apps/main/services/user-service.js +62 -21
  25. package/sample/crud/apps/main/views/auth/login.ejs +6 -6
  26. package/sample/crud/apps/main/views/auth/register.ejs +46 -5
  27. package/sample/crud/apps/main/views/users/edit.ejs +42 -5
  28. package/sample/crud/apps/main/views/users/list.ejs +6 -2
  29. package/sample/crud/apps/main/views/users/new.ejs +56 -4
  30. package/sample/crud/docs/log_partition_design.mm.md +23 -0
  31. package/sample/crud/mega.config.js +3 -2
  32. package/sample/crud/package.json +1 -1
  33. package/sample/crud/scripts/start-ws-hub.sh +2 -2
  34. package/sample/simple/package.json +2 -2
  35. package/src/adapters/adapter-manager.js +2 -1
  36. package/src/adapters/adapter-options.js +30 -0
  37. package/src/adapters/maria-adapter.js +26 -3
  38. package/src/adapters/mega-db-adapter.js +7 -1
  39. package/src/adapters/mongo-adapter.js +19 -1
  40. package/src/adapters/postgres-adapter.js +25 -2
  41. package/src/adapters/sqlite-adapter.js +20 -1
  42. package/src/cli/commands/new.js +13 -3
  43. package/src/cli/commands/scaffold.js +137 -33
  44. package/src/cli/generators/index.js +82 -2
  45. package/src/cli/index.js +353 -100
  46. package/src/core/ajv-mapper.js +27 -2
  47. package/src/core/boot.js +464 -245
  48. package/src/core/cluster-metrics.js +13 -4
  49. package/src/core/ctx-builder.js +6 -2
  50. package/src/core/envelope.js +112 -12
  51. package/src/core/hub-link.js +65 -4
  52. package/src/core/i18n.js +11 -1
  53. package/src/core/index.js +6 -2
  54. package/src/core/mega-app.js +201 -463
  55. package/src/core/mega-cluster.js +4 -1
  56. package/src/core/mega-server.js +40 -9
  57. package/src/core/migration/dialect-registry.js +107 -0
  58. package/src/core/migration/dialects/README.md +62 -0
  59. package/src/core/migration/dialects/maria.js +496 -0
  60. package/src/core/migration/dialects/mongo.js +824 -0
  61. package/src/core/migration/dialects/postgres.js +563 -0
  62. package/src/core/migration/dialects/sqlite.js +476 -0
  63. package/src/core/migration/differ.js +456 -0
  64. package/src/core/migration/generate.js +508 -0
  65. package/src/core/migration/journal.js +167 -0
  66. package/src/core/migration/model-scan.js +84 -0
  67. package/src/core/migration/mongo-migration-db.js +97 -0
  68. package/src/core/migration/schema-builder.js +400 -0
  69. package/src/core/migration/schema-validator.js +315 -0
  70. package/src/core/migration-lock.js +205 -0
  71. package/src/core/migration-runner.js +166 -38
  72. package/src/core/multipart.js +28 -5
  73. package/src/core/pipeline.js +129 -0
  74. package/src/core/router.js +70 -65
  75. package/src/core/security.js +67 -9
  76. package/src/core/workers-manager.js +12 -1
  77. package/src/core/ws-cluster.js +10 -3
  78. package/src/core/ws-message.js +48 -4
  79. package/src/core/ws-presence.js +624 -0
  80. package/src/core/ws-roster.js +4 -1
  81. package/src/core/ws-upgrade.js +118 -12
  82. package/src/index.js +1 -1
  83. package/src/lib/hub-protocol.js +29 -0
  84. package/src/lib/mega-health.js +25 -4
  85. package/src/lib/mega-job-queue.js +98 -21
  86. package/src/lib/mega-job.js +29 -0
  87. package/src/lib/mega-metrics.js +3 -12
  88. package/src/lib/mega-plugin.js +34 -3
  89. package/src/lib/mega-schedule.js +40 -22
  90. package/src/lib/mega-shutdown.js +114 -39
  91. package/src/lib/mega-tracing.js +66 -19
  92. package/src/lib/mega-worker.js +5 -1
  93. package/src/lib/otel-resource.js +36 -0
  94. package/src/{cli → lib}/ws-hub.js +51 -8
  95. package/src/models/crud-sql-builder.js +133 -0
  96. package/src/models/mega-model.js +82 -2
  97. package/src/models/model-crud.js +483 -0
  98. package/src/models/mongo-crud.js +285 -0
  99. package/templates/model/code-mongo.tpl +35 -0
  100. package/templates/model/code.tpl +15 -1
  101. package/templates/model/test-mongo.tpl +38 -0
  102. package/templates/model/test.tpl +4 -0
  103. package/types/adapters/adapter-manager.d.ts +95 -0
  104. package/types/adapters/adapter-options.d.ts +91 -0
  105. package/types/adapters/file-adapter.d.ts +94 -0
  106. package/types/adapters/file-session-adapter.d.ts +101 -0
  107. package/types/adapters/index.d.ts +20 -0
  108. package/types/adapters/maria-adapter.d.ts +115 -0
  109. package/types/adapters/mega-adapter.d.ts +215 -0
  110. package/types/adapters/mega-bus-adapter.d.ts +45 -0
  111. package/types/adapters/mega-cache-adapter.d.ts +47 -0
  112. package/types/adapters/mega-db-adapter.d.ts +47 -0
  113. package/types/adapters/mega-lock-adapter.d.ts +62 -0
  114. package/types/adapters/mega-log-sink-adapter.d.ts +15 -0
  115. package/types/adapters/mega-session-adapter.d.ts +32 -0
  116. package/types/adapters/mongo-adapter.d.ts +139 -0
  117. package/types/adapters/nats-adapter.d.ts +108 -0
  118. package/types/adapters/postgres-adapter.d.ts +139 -0
  119. package/types/adapters/redis-adapter.d.ts +70 -0
  120. package/types/adapters/redis-session-adapter.d.ts +82 -0
  121. package/types/adapters/redlock-adapter.d.ts +149 -0
  122. package/types/adapters/registry.d.ts +46 -0
  123. package/types/adapters/sqlite-adapter.d.ts +106 -0
  124. package/types/auth/index.d.ts +24 -0
  125. package/types/cli/commands/console-cmd.d.ts +37 -0
  126. package/types/cli/commands/new.d.ts +16 -0
  127. package/types/cli/commands/routes.d.ts +36 -0
  128. package/types/cli/commands/scaffold.d.ts +78 -0
  129. package/types/cli/commands/test-cmd.d.ts +14 -0
  130. package/types/cli/generators/index.d.ts +112 -0
  131. package/types/cli/index.d.ts +249 -0
  132. package/types/cli/template-engine.d.ts +40 -0
  133. package/types/core/ajv-mapper.d.ts +27 -0
  134. package/types/core/boot.d.ts +233 -0
  135. package/types/core/cluster-metrics.d.ts +52 -0
  136. package/types/core/config-loader.d.ts +13 -0
  137. package/types/core/config-validator.d.ts +30 -0
  138. package/types/core/ctx-builder.d.ts +80 -0
  139. package/types/core/envelope.d.ts +79 -0
  140. package/types/core/error-mapper.d.ts +17 -0
  141. package/types/core/formbody.d.ts +41 -0
  142. package/types/core/hub-link.d.ts +264 -0
  143. package/types/core/i18n.d.ts +178 -0
  144. package/types/core/index.d.ts +28 -0
  145. package/types/core/mega-app.d.ts +529 -0
  146. package/types/core/mega-cluster.d.ts +104 -0
  147. package/types/core/mega-server.d.ts +91 -0
  148. package/types/core/mega-service.d.ts +31 -0
  149. package/types/core/migration/dialect-registry.d.ts +22 -0
  150. package/types/core/migration/dialects/maria.d.ts +99 -0
  151. package/types/core/migration/dialects/mongo.d.ts +89 -0
  152. package/types/core/migration/dialects/postgres.d.ts +117 -0
  153. package/types/core/migration/dialects/sqlite.d.ts +111 -0
  154. package/types/core/migration/differ.d.ts +47 -0
  155. package/types/core/migration/generate.d.ts +56 -0
  156. package/types/core/migration/journal.d.ts +52 -0
  157. package/types/core/migration/model-scan.d.ts +19 -0
  158. package/types/core/migration/mongo-migration-db.d.ts +7 -0
  159. package/types/core/migration/schema-builder.d.ts +197 -0
  160. package/types/core/migration/schema-validator.d.ts +20 -0
  161. package/types/core/migration-lock.d.ts +33 -0
  162. package/types/core/migration-runner.d.ts +101 -0
  163. package/types/core/multipart.d.ts +86 -0
  164. package/types/core/openapi.d.ts +62 -0
  165. package/types/core/pipeline.d.ts +92 -0
  166. package/types/core/router.d.ts +159 -0
  167. package/types/core/routes-loader.d.ts +21 -0
  168. package/types/core/scope-registry.d.ts +14 -0
  169. package/types/core/security.d.ts +77 -0
  170. package/types/core/services-loader.d.ts +27 -0
  171. package/types/core/session-cleanup-schedule.d.ts +19 -0
  172. package/types/core/session-store.d.ts +18 -0
  173. package/types/core/session.d.ts +77 -0
  174. package/types/core/static-assets.d.ts +73 -0
  175. package/types/core/template.d.ts +106 -0
  176. package/types/core/workers-manager.d.ts +79 -0
  177. package/types/core/ws-cluster.d.ts +208 -0
  178. package/types/core/ws-compression.d.ts +112 -0
  179. package/types/core/ws-controller.d.ts +65 -0
  180. package/types/core/ws-message.d.ts +106 -0
  181. package/types/core/ws-presence.d.ts +273 -0
  182. package/types/core/ws-roster.d.ts +96 -0
  183. package/types/core/ws-upgrade.d.ts +231 -0
  184. package/types/errors/config-error.d.ts +10 -0
  185. package/types/errors/http-errors.d.ts +120 -0
  186. package/types/errors/index.d.ts +3 -0
  187. package/types/errors/mega-error.d.ts +32 -0
  188. package/types/index.d.ts +39 -0
  189. package/types/lib/asp/config.d.ts +49 -0
  190. package/types/lib/asp/crypto.d.ts +43 -0
  191. package/types/lib/asp/errors.d.ts +30 -0
  192. package/types/lib/asp/nonce-cache.d.ts +52 -0
  193. package/types/lib/asp/plugin.d.ts +30 -0
  194. package/types/lib/asp/ws-terminator.d.ts +45 -0
  195. package/types/lib/env-mapper.d.ts +14 -0
  196. package/types/lib/hub-protocol.d.ts +106 -0
  197. package/types/lib/index.d.ts +22 -0
  198. package/types/lib/logger/telegram-core.d.ts +104 -0
  199. package/types/lib/logger/telegram-transport.d.ts +45 -0
  200. package/types/lib/mega-brute-force.d.ts +66 -0
  201. package/types/lib/mega-circuit-breaker.d.ts +241 -0
  202. package/types/lib/mega-cron.d.ts +66 -0
  203. package/types/lib/mega-hash.d.ts +32 -0
  204. package/types/lib/mega-health.d.ts +41 -0
  205. package/types/lib/mega-job-queue.d.ts +176 -0
  206. package/types/lib/mega-job-worker.d.ts +130 -0
  207. package/types/lib/mega-job.d.ts +138 -0
  208. package/types/lib/mega-logger.d.ts +45 -0
  209. package/types/lib/mega-metrics.d.ts +285 -0
  210. package/types/lib/mega-plugin.d.ts +245 -0
  211. package/types/lib/mega-retry.d.ts +85 -0
  212. package/types/lib/mega-schedule.d.ts +260 -0
  213. package/types/lib/mega-shutdown.d.ts +135 -0
  214. package/types/lib/mega-tracing.d.ts +224 -0
  215. package/types/lib/mega-worker.d.ts +127 -0
  216. package/types/lib/otel-resource.d.ts +16 -0
  217. package/types/lib/worker-runner/process-entry.d.ts +1 -0
  218. package/types/lib/worker-runner/task-dispatch.d.ts +28 -0
  219. package/types/lib/worker-runner/thread-entry.d.ts +1 -0
  220. package/types/lib/ws-hub.d.ts +234 -0
  221. package/types/models/crud-sql-builder.d.ts +48 -0
  222. package/types/models/index.d.ts +1 -0
  223. package/types/models/mega-model.d.ts +138 -0
  224. package/types/models/model-crud.d.ts +82 -0
  225. package/types/models/mongo-crud.d.ts +59 -0
  226. package/types/test/index.d.ts +84 -0
  227. package/.env +0 -127
  228. package/sample/crud/apps/main/migrations/20260606000002-add-auth-to-users.js +0 -30
  229. package/sample/crud/apps/main/models/note.js +0 -71
  230. package/sample/crud/apps/main/models/user.js +0 -86
  231. package/sample/crud/package-lock.json +0 -5665
  232. package/sample/crud/yarn.lock +0 -2142
  233. package/sample/simple/package-lock.json +0 -1851
@@ -0,0 +1,120 @@
1
+ /**
2
+ * HTTP 표준 status 와 envelope code 를 가진 베이스. 모든 HTTP 에러는 이걸 상속.
3
+ *
4
+ * envelope 변환 시 status → response status, code → error.code, message → error.message,
5
+ * details → error.details (object | array, ADR-075).
6
+ *
7
+ * 코드 컨벤션: `domain.error` (ADR-016). 예: 'user.not_found', 'auth.required'.
8
+ */
9
+ export class MegaHttpError extends MegaError {
10
+ /**
11
+ * @param {number} status - HTTP status code (4xx/5xx).
12
+ * @param {string} code - 'domain.error' 형식 envelope 코드 (ADR-016).
13
+ * @param {string} message - 사람이 읽는 에러 메시지.
14
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
15
+ * - details: 구조화된 부가 정보 (object | array — ADR-075).
16
+ * - cause: 원인 에러 (전파용).
17
+ */
18
+ constructor(status: number, code: string, message: string, opts?: {
19
+ details?: object | unknown[];
20
+ cause?: unknown;
21
+ });
22
+ status: number;
23
+ }
24
+ /** 400 — 클라이언트 검증 실패. AJV 자동 매핑 대상 (ADR-090). */
25
+ export class MegaValidationError extends MegaHttpError {
26
+ /**
27
+ * @param {string} [code]
28
+ * @param {string} [message]
29
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
30
+ */
31
+ constructor(code?: string, message?: string, opts?: {
32
+ details?: object | unknown[];
33
+ cause?: unknown;
34
+ });
35
+ }
36
+ /** 401 — 인증 누락 / 무효. */
37
+ export class MegaAuthError extends MegaHttpError {
38
+ /**
39
+ * @param {string} [code]
40
+ * @param {string} [message]
41
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
42
+ */
43
+ constructor(code?: string, message?: string, opts?: {
44
+ details?: object | unknown[];
45
+ cause?: unknown;
46
+ });
47
+ }
48
+ /** 403 — 인증은 했으나 권한 없음. */
49
+ export class MegaForbiddenError extends MegaHttpError {
50
+ /**
51
+ * @param {string} [code]
52
+ * @param {string} [message]
53
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
54
+ */
55
+ constructor(code?: string, message?: string, opts?: {
56
+ details?: object | unknown[];
57
+ cause?: unknown;
58
+ });
59
+ }
60
+ /** 404 — 리소스 없음. */
61
+ export class MegaNotFoundError extends MegaHttpError {
62
+ /**
63
+ * @param {string} [code]
64
+ * @param {string} [message]
65
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
66
+ */
67
+ constructor(code?: string, message?: string, opts?: {
68
+ details?: object | unknown[];
69
+ cause?: unknown;
70
+ });
71
+ }
72
+ /** 409 — 충돌 (예: email 중복). */
73
+ export class MegaConflictError extends MegaHttpError {
74
+ /**
75
+ * @param {string} [code]
76
+ * @param {string} [message]
77
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
78
+ */
79
+ constructor(code?: string, message?: string, opts?: {
80
+ details?: object | unknown[];
81
+ cause?: unknown;
82
+ });
83
+ }
84
+ /** 413 — 페이로드 과대 (업로드 크기·개수 초과). @fastify/multipart 네이티브 413 과 정합. */
85
+ export class MegaPayloadTooLargeError extends MegaHttpError {
86
+ /**
87
+ * @param {string} [code]
88
+ * @param {string} [message]
89
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
90
+ */
91
+ constructor(code?: string, message?: string, opts?: {
92
+ details?: object | unknown[];
93
+ cause?: unknown;
94
+ });
95
+ }
96
+ /** 415 — 지원하지 않는 미디어 타입 (업로드 MIME 화이트리스트 위반). */
97
+ export class MegaUnsupportedMediaTypeError extends MegaHttpError {
98
+ /**
99
+ * @param {string} [code]
100
+ * @param {string} [message]
101
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
102
+ */
103
+ constructor(code?: string, message?: string, opts?: {
104
+ details?: object | unknown[];
105
+ cause?: unknown;
106
+ });
107
+ }
108
+ /** 500 — 내부 오류. 기본 code `server.internal` (H-6). */
109
+ export class MegaInternalError extends MegaHttpError {
110
+ /**
111
+ * @param {string} [code]
112
+ * @param {string} [message]
113
+ * @param {{ details?: object | unknown[], cause?: unknown }} [opts]
114
+ */
115
+ constructor(code?: string, message?: string, opts?: {
116
+ details?: object | unknown[];
117
+ cause?: unknown;
118
+ });
119
+ }
120
+ import { MegaError } from './mega-error.js';
@@ -0,0 +1,3 @@
1
+ export { MegaError } from "./mega-error.js";
2
+ export { MegaConfigError } from "./config-error.js";
3
+ export { MegaHttpError, MegaValidationError, MegaAuthError, MegaForbiddenError, MegaNotFoundError, MegaConflictError, MegaPayloadTooLargeError, MegaUnsupportedMediaTypeError, MegaInternalError } from "./http-errors.js";
@@ -0,0 +1,32 @@
1
+ /**
2
+ * MEGA-FRAMEWORK 모든 에러의 베이스.
3
+ * - code: 'domain.error' 컨벤션 (ADR-016)
4
+ * - details: object | array (ADR-075)
5
+ * - cause: Error 전파
6
+ *
7
+ * @module errors/mega-error
8
+ */
9
+ /**
10
+ * 프레임워크 공통 에러 베이스 클래스.
11
+ *
12
+ * @example
13
+ * throw new MegaError('user.not_found', 'User 42 not found', {
14
+ * details: { userId: 42 },
15
+ * })
16
+ */
17
+ export class MegaError extends Error {
18
+ /**
19
+ * @param {string} code - 'domain.error' 형식 에러 코드 (ADR-016).
20
+ * @param {string} message - 사람이 읽는 에러 메시지.
21
+ * @param {{ details?: object | unknown[], cause?: unknown }} [options]
22
+ * - details: 구조화된 부가 정보 (object | array — ADR-075).
23
+ * - cause: 원인 에러 (전파용).
24
+ */
25
+ constructor(code: string, message: string, { details, cause }?: {
26
+ details?: object | unknown[];
27
+ cause?: unknown;
28
+ });
29
+ code: string;
30
+ details: object;
31
+ cause: unknown;
32
+ }
@@ -0,0 +1,39 @@
1
+ export { MegaError } from "./errors/mega-error.js";
2
+ export { MegaConfigError } from "./errors/config-error.js";
3
+ export { MegaRouteError } from "./core/router.js";
4
+ export * as MegaHealth from "./lib/mega-health.js";
5
+ export { MegaShutdown } from "./lib/mega-shutdown.js";
6
+ export { MegaCron } from "./lib/mega-cron.js";
7
+ export { MegaJobQueue } from "./lib/mega-job-queue.js";
8
+ export { MegaJobWorker } from "./lib/mega-job-worker.js";
9
+ export { MegaWorker } from "./lib/mega-worker.js";
10
+ export { MegaHash } from "./lib/mega-hash.js";
11
+ export { MegaBruteForce } from "./lib/mega-brute-force.js";
12
+ export { MegaTemplate } from "./core/template.js";
13
+ export { buildAdapterEnvConfig } from "./lib/env-mapper.js";
14
+ export * as MegaTracing from "./lib/mega-tracing.js";
15
+ export * as MegaMetrics from "./lib/mega-metrics.js";
16
+ export { MegaModel } from "./models/index.js";
17
+ export { registerAspPlugin } from "./lib/asp/plugin.js";
18
+ export { MegaAspTerminator } from "./lib/asp/ws-terminator.js";
19
+ export { normalizeAspConfig } from "./lib/asp/config.js";
20
+ export { MegaHubLink } from "./core/hub-link.js";
21
+ export { MegaApp, MegaServer, Router, loadAndValidateConfig, loadRoutes, bootApp, buildBootContext, MegaService, MegaCluster, wrapEnvelope, errorEnvelope, buildErrorHandler, ajvErrorToValidationError, MegaWebSocketController, createWsMessage, validateWsMessage, parseWsMessage, generateMessageId, WS_MESSAGE_SCHEMA, WS_PROTOCOL_VERSION, WS_TYPE_PATTERN, buildHttpCtx, buildAdapterAccessors, registerSession, generateSid, readSession, createSessionStore, SESSION_STORE_DRIVERS, createSessionCleanupSchedule } from "./core/index.js";
22
+ export { runCli, parseArgs, runWorkerHost, runSchedulerHost, dispatchPluginCommand, USAGE } from "./cli/index.js";
23
+ export { MegaHttpError, MegaValidationError, MegaAuthError, MegaForbiddenError, MegaNotFoundError, MegaConflictError, MegaInternalError } from "./errors/http-errors.js";
24
+ export { buildLogger, buildLoggerOptions, buildTargets } from "./lib/mega-logger.js";
25
+ export { MegaRetry, withRetry, RetryAbortError } from "./lib/mega-retry.js";
26
+ export { MegaCircuitBreaker, wrap as wrapCircuitBreaker, OPEN_CIRCUIT_ERROR_CODE, TIMEOUT_ERROR_CODE, CAPACITY_ERROR_CODE } from "./lib/mega-circuit-breaker.js";
27
+ export { MegaSchedule, MegaScheduler } from "./lib/mega-schedule.js";
28
+ export { MegaJob, resolveJobRetryConfig, JOB_RETRY_DEFAULTS } from "./lib/mega-job.js";
29
+ export { registerStaticAssets, normalizeStaticAssets } from "./core/static-assets.js";
30
+ export { registerOpenapi, normalizeOpenapi } from "./core/openapi.js";
31
+ export { MegaPluginHost, loadPlugins, CORE_API_VERSION } from "./lib/mega-plugin.js";
32
+ export { collectCluster, mergeExposition } from "./core/cluster-metrics.js";
33
+ export { MegaAdapter, MegaDbAdapter, MegaCacheAdapter, MegaBusAdapter, MegaLockAdapter, MegaLogSinkAdapter, MegaSessionAdapter, MegaAdapterRegistry, BUILTIN_DRIVERS, MegaAdapterManager, MegaSqliteAdapter, MegaPostgresAdapter, MegaMariaAdapter, MegaMongoAdapter, MegaRedisAdapter, MegaFileAdapter, MegaNatsAdapter, MegaRedlockAdapter, MegaFileSessionAdapter, MegaRedisSessionAdapter } from "./adapters/index.js";
34
+ export { registerSecurityPlugins, DEFAULT_RATE_LIMIT } from "./core/security.js";
35
+ export { MegaAspNonceCache, MegaMemoryNonceStore } from "./lib/asp/nonce-cache.js";
36
+ export { MegaAspDecryptError, ASP_RULES } from "./lib/asp/errors.js";
37
+ export { MegaWsHub, DEFAULT_HEARTBEAT_MS, runWsHubCli } from "./lib/ws-hub.js";
38
+ export { buildPerMessageDeflate, checkCompressionConfig, COMPRESSION_DEFAULTS } from "./core/ws-compression.js";
39
+ export { HUB_MESSAGE_TYPES, HUB_TYPE_SET, HUB_PAYLOAD_SCHEMAS, HUB_CLOSE_CODES, CLOSE_CODE_DRAIN, validateHubMessage, createHubMessage, parseHubMessage } from "./lib/hub-protocol.js";
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @typedef {Object} NormalizedAspConfig
3
+ * @property {string} masterSecret
4
+ * @property {string[]} enabledPaths - glob 패턴 (예: '/api/*')
5
+ * @property {string} headerSignal - 암호화 시그널 헤더명 (디폴트 'X-Mega-Encrypted')
6
+ * @property {string} timestampHeader - 타임스탬프 헤더명 (디폴트 'X-Timestamp')
7
+ * @property {number} driftMs - 허용 timestamp drift (디폴트 60000)
8
+ * @property {false} failOpen - 항상 false (강제)
9
+ * @property {MegaAspNonceCache | null} nonceCache
10
+ */
11
+ /**
12
+ * 원시 ASP config → 정규화 + 검증.
13
+ *
14
+ * @param {Record<string, any>} asp - { masterSecret, enabledPaths?, headerSignal?, timestampHeader?,
15
+ * driftMs?, failOpen?, nonceCache? }
16
+ * @param {{ logger?: { warn: Function } }} [opts]
17
+ * @returns {NormalizedAspConfig}
18
+ * @throws {Error} masterSecret 누락 / nonceCache 잘못된 형태.
19
+ */
20
+ export function normalizeAspConfig(asp: Record<string, any>, { logger }?: {
21
+ logger?: {
22
+ warn: Function;
23
+ };
24
+ }): NormalizedAspConfig;
25
+ export type NormalizedAspConfig = {
26
+ masterSecret: string;
27
+ /**
28
+ * - glob 패턴 (예: '/api/*')
29
+ */
30
+ enabledPaths: string[];
31
+ /**
32
+ * - 암호화 시그널 헤더명 (디폴트 'X-Mega-Encrypted')
33
+ */
34
+ headerSignal: string;
35
+ /**
36
+ * - 타임스탬프 헤더명 (디폴트 'X-Timestamp')
37
+ */
38
+ timestampHeader: string;
39
+ /**
40
+ * - 허용 timestamp drift (디폴트 60000)
41
+ */
42
+ driftMs: number;
43
+ /**
44
+ * - 항상 false (강제)
45
+ */
46
+ failOpen: false;
47
+ nonceCache: MegaAspNonceCache | null;
48
+ };
49
+ import { MegaAspNonceCache } from './nonce-cache.js';
@@ -0,0 +1,43 @@
1
+ /**
2
+ * SHA256(hex(HMAC-SHA256(masterSecret, "domain:path:uaSlice:timestamp"))) → 32 bytes Buffer.
3
+ */
4
+ export function deriveKey(masterSecret: any, domain: any, path: any, uaSlice: any, timestamp: any): NonSharedBuffer;
5
+ /**
6
+ * timestamp mod UA 길이 위치에서 4 byte 순환 슬라이스. UA 비어 있으면 "0000".
7
+ * 비-ASCII byte 도 char.fromCharCode(byte) 로 매핑 — Rust char::from_u32(b as u32) 와 동일.
8
+ */
9
+ export function getUaSlice(ua: any, timestamp: any): string;
10
+ /**
11
+ * AES-256-GCM 암호화 → nibble-swap → base64.
12
+ * @param {Buffer} key — 32 bytes
13
+ * @param {Buffer|string} plain
14
+ * @returns {string} base64
15
+ */
16
+ export function encryptTransport(key: Buffer, plain: Buffer | string): string;
17
+ /**
18
+ * base64 → deobfuscate → AES-256-GCM 복호화. Buffer 반환.
19
+ * @returns {Buffer}
20
+ * @throws Error
21
+ */
22
+ export function decryptTransport(key: any, encryptedB64: any): Buffer;
23
+ /**
24
+ * 암호문(base64)에서 AES-GCM nonce(앞 12 byte) 만 추출 — replay 방어용 (ADR-058).
25
+ *
26
+ * deobfuscate 후 앞 12 byte 가 nonce. **복호화하지 않고** nonce 만 뽑아 nonce_cache 의
27
+ * SETNX 키로 쓴다. GCM nonce 는 암호화마다 random 이라 동일 nonce 재등장 = replay.
28
+ *
29
+ * @param {string} encryptedB64 — encryptTransport 가 만든 base64 (URL-safe 아님 — STANDARD)
30
+ * @returns {Buffer} 12-byte nonce
31
+ * @throws {Error} blob 이 nonce+tag 보다 짧으면.
32
+ */
33
+ export function extractNonce(encryptedB64: string): Buffer;
34
+ /**
35
+ * WS 프레임 암호화 — bare "<ts>:<base64>" 반환.
36
+ * P:/E: prefix 부착은 MegaAspTerminator 책임 (ADR-083).
37
+ */
38
+ export function wsEncrypt(masterSecret: any, domain: any, path: any, ua: any, plain: any): string;
39
+ /**
40
+ * WS 프레임 복호화 — bare "<ts>:<base64>" 입력. 평문 string 반환.
41
+ */
42
+ export function wsDecrypt(masterSecret: any, domain: any, path: any, ua: any, frame: any): string;
43
+ import { Buffer } from 'node:buffer';
@@ -0,0 +1,30 @@
1
+ /** ASP rule 종류 (envelope details 의 `rule` 필드). */
2
+ export const ASP_RULES: Readonly<{
3
+ KEY_MISMATCH: "key_mismatch";
4
+ INVALID_PAYLOAD: "invalid_payload";
5
+ DRIFT: "drift";
6
+ REPLAY: "replay";
7
+ MISSING_TIMESTAMP: "missing_timestamp";
8
+ SIGNAL_REQUIRED: "signal_required";
9
+ }>;
10
+ /**
11
+ * ASP 요청 복호화/검증 실패 — 403. fail-closed (ADR-057): 평문 통과 금지.
12
+ *
13
+ * `details` 는 배열 표준(ADR-075): `[{ field, rule, value? }]`. 여러 ASP 실패를
14
+ * 한 응답으로 표현 가능. 단일 실패도 1-원소 배열로 통일.
15
+ */
16
+ export class MegaAspDecryptError extends MegaHttpError {
17
+ /**
18
+ * @param {string} rule - ASP_RULES 중 하나.
19
+ * @param {string} [message] - 사람이 읽는 메시지 (디버그용 — 시크릿 금지).
20
+ * @param {{ field?: string, value?: unknown, cause?: unknown }} [opts]
21
+ */
22
+ constructor(rule: string, message?: string, opts?: {
23
+ field?: string;
24
+ value?: unknown;
25
+ cause?: unknown;
26
+ });
27
+ /** @type {string} 실패 종류 (close code / 로깅 분기용). */
28
+ rule: string;
29
+ }
30
+ import { MegaHttpError } from '../../errors/http-errors.js';
@@ -0,0 +1,52 @@
1
+ /**
2
+ * MegaAspNonceCache — nonce SETNX 래퍼.
3
+ */
4
+ export class MegaAspNonceCache {
5
+ /**
6
+ * @param {Object} [opts]
7
+ * @param {{ setIfNotExists: (key: string, ttlSec: number) => Promise<boolean> }} [opts.cache] - 누락 시 throw.
8
+ * @param {number} [opts.ttlSec=120]
9
+ */
10
+ constructor({ cache, ttlSec }?: {
11
+ cache?: {
12
+ setIfNotExists: (key: string, ttlSec: number) => Promise<boolean>;
13
+ };
14
+ ttlSec?: number;
15
+ });
16
+ _cache: {
17
+ setIfNotExists: (key: string, ttlSec: number) => Promise<boolean>;
18
+ };
19
+ _ttlSec: number;
20
+ /**
21
+ * nonce 가 처음 등장하면 기록 후 true, 이미 봤으면(=replay) false.
22
+ *
23
+ * @param {string} nonceHex - {@link import('./crypto.js').extractNonce} 결과의 hex.
24
+ * @returns {Promise<boolean>} fresh 면 true, replay 면 false.
25
+ */
26
+ isFresh(nonceHex: string): Promise<boolean>;
27
+ }
28
+ /**
29
+ * 인메모리 nonce 저장소 — dev / 단일 인스턴스 / 테스트용.
30
+ *
31
+ * Map<key, 만료 epoch ms>. setIfNotExists 시 만료된 항목은 자동으로 덮어쓴다.
32
+ * 멀티 인스턴스에서는 프로세스별로 분리되므로 Redis 권장 (ADR-058).
33
+ */
34
+ export class MegaMemoryNonceStore {
35
+ /** @type {Map<string, number>} key → 만료 epoch ms */
36
+ _store: Map<string, number>;
37
+ /** @type {number} 마지막 sweep 이후 insert 횟수 — SWEEP_EVERY_OPS 마다 만료 일괄 제거. */
38
+ _opsSinceSweep: number;
39
+ /**
40
+ * @param {string} key
41
+ * @param {number} ttlSec
42
+ * @returns {Promise<boolean>} 새로 set 했으면 true, 유효한 기존 항목 있으면 false.
43
+ */
44
+ setIfNotExists(key: string, ttlSec: number): Promise<boolean>;
45
+ /**
46
+ * 만료 항목 제거 (주기 cleanup 용 — 현재는 수동/테스트 호출).
47
+ * @param {number} [now=Date.now()]
48
+ */
49
+ evictExpired(now?: number): void;
50
+ /** 현재 저장된 항목 수 (테스트·디버그용). */
51
+ get size(): number;
52
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * per-request ASP 상태. `req[ASP_STATE]` 에 보관 (Fastify 타입에 없는 symbol 키).
3
+ * `multipart` 는 body 평문 통과 마커(02-architecture §1625).
4
+ * @typedef {{ intent: boolean, ok: boolean, ts: number, key: Buffer, multipart?: boolean }} AspState
5
+ */
6
+ /**
7
+ * Fastify 인스턴스에 ASP HTTP terminator 등록.
8
+ *
9
+ * @param {import('fastify').FastifyInstance} fastify
10
+ * @param {Object} aspConfigRaw - { masterSecret, enabledPaths, headerSignal?, timestampHeader?, driftMs?, failOpen?, nonceCache? }
11
+ * @param {{ logger?: { warn: Function, debug?: Function } }} [opts]
12
+ * @returns {import('./config.js').NormalizedAspConfig} 정규화된 config (테스트·디버그용)
13
+ */
14
+ export function registerAspPlugin(fastify: import("fastify").FastifyInstance, aspConfigRaw: Object, opts?: {
15
+ logger?: {
16
+ warn: Function;
17
+ debug?: Function;
18
+ };
19
+ }): import("./config.js").NormalizedAspConfig;
20
+ /**
21
+ * per-request ASP 상태. `req[ASP_STATE]` 에 보관 (Fastify 타입에 없는 symbol 키).
22
+ * `multipart` 는 body 평문 통과 마커(02-architecture §1625).
23
+ */
24
+ export type AspState = {
25
+ intent: boolean;
26
+ ok: boolean;
27
+ ts: number;
28
+ key: Buffer;
29
+ multipart?: boolean;
30
+ };
@@ -0,0 +1,45 @@
1
+ export class MegaAspTerminator {
2
+ /**
3
+ * @param {Object} opts
4
+ * @param {string} opts.masterSecret
5
+ * @param {string} opts.domain - Host (키 유도, 클라 location.hostname 과 일치)
6
+ * @param {string} opts.wsPath - WS 경로 (키 유도, 클라 URL path 와 일치)
7
+ * @param {string} opts.ua - User-Agent (키 유도)
8
+ * @param {boolean} [opts.encrypt=true] - 송신 기본 암호화 (ADR-086)
9
+ */
10
+ constructor({ masterSecret, domain, wsPath, ua, encrypt }: {
11
+ masterSecret: string;
12
+ domain: string;
13
+ wsPath: string;
14
+ ua: string;
15
+ encrypt?: boolean;
16
+ });
17
+ _secret: string;
18
+ _domain: string;
19
+ _wsPath: string;
20
+ _ua: string;
21
+ _encrypt: boolean;
22
+ /** 이 terminator 가 기본 암호화 송신인지. */
23
+ get isEncrypted(): boolean;
24
+ /**
25
+ * 송신 프레임 생성. `plain=true` 또는 `encrypt=false` 면 `P:` 평문, 아니면 `E:` 암호화.
26
+ *
27
+ * @param {Object|string} message - 객체면 JSON.stringify, 문자열이면 그대로 (이미 JSON 가정).
28
+ * @param {{ plain?: boolean }} [opts]
29
+ * @returns {string} wire 프레임 (`E:` 또는 `P:` prefix 포함)
30
+ */
31
+ encodeFrame(message: Object | string, { plain }?: {
32
+ plain?: boolean;
33
+ }): string;
34
+ /**
35
+ * 수신 프레임 디코드. prefix 권위 (ADR-083). `E:` 복호화 실패 → throw (ADR-084).
36
+ *
37
+ * @param {string} frame - wire 프레임.
38
+ * @returns {{ encrypted: boolean, plain: string }} plain = 평문 JSON 문자열.
39
+ * @throws {MegaAspDecryptError} prefix 누락 / 복호화 실패.
40
+ */
41
+ decodeFrame(frame: string): {
42
+ encrypted: boolean;
43
+ plain: string;
44
+ };
45
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `MEGA_<SERVICE>_*` 환경변수를 표준 어댑터 옵션 객체로 변환한다. OPTIONS_* 의 키 표기는 `driver`
3
+ * 별로 변환된다(camel/snake, {@link DRIVER_KEY_STYLE}).
4
+ *
5
+ * @param {string} service - 서비스 prefix(대소문자 무관, 예: 'pg' / 'PG' / 'maria' / 'mongo').
6
+ * @param {Record<string, string | undefined>} [env] - 환경변수 맵(기본 `process.env`).
7
+ * @param {{ driver?: string }} [opts] - `driver`(예 'redis'/'postgres') — OPTIONS_* 키 표기 변환 + redis db 특례에 사용.
8
+ * 미지정이면 snake(레거시 디폴트), 미상 driver 면 snake + warn 1회(fail-safe).
9
+ * @returns {Record<string, any>} 어댑터 옵션 partial (`{ url?, host?, …, db?, pool?, options? }`). 매칭 없으면 빈 객체.
10
+ * @throws {MegaValidationError} `adapter.env_invalid_value` - PORT/redis DB 가 정수가 아님.
11
+ */
12
+ export function buildAdapterEnvConfig(service: string, env?: Record<string, string | undefined>, { driver }?: {
13
+ driver?: string;
14
+ }): Record<string, any>;
@@ -0,0 +1,106 @@
1
+ /**
2
+ * bridge 가 REGISTER 로 보낸 최대 지원 버전과 hub 지원 버전의 상호 최고 버전을 고른다.
3
+ * 선형 누적 계약(vN 지원 = v1..vN 지원)이라 `min(bridgeMax, hubMax)` 가 항상 유효한 상호 버전이다
4
+ * (v1 이 바닥이라 협상이 실패할 수 없다 — 부재/무효 입력은 v1).
5
+ *
6
+ * @param {unknown} requestedMax - bridge 의 `protocolVersion`(최대 지원 버전).
7
+ * @param {ReadonlyArray<number>} [supported] - 이 측 지원 버전 목록.
8
+ * @returns {number} 협상된 버전(>= 1).
9
+ */
10
+ export function negotiateHubProtocolVersion(requestedMax: unknown, supported?: ReadonlyArray<number>): number;
11
+ /**
12
+ * hub 메시지 전체 검증 — envelope(§6.2) + type 소속(12 종) + payload/error 스키마.
13
+ *
14
+ * 던지지 않고 위반 사유 배열을 돌려준다(빈 배열 = 유효). 호출부(hub/link)가 사유를 그대로
15
+ * `hub.error` envelope 의 `details` 로 실어 보낼 수 있도록 한다(ADR-075 배열 표준).
16
+ *
17
+ * @param {any} msg - 파싱된 envelope 객체.
18
+ * @returns {string[]} 위반 사유 목록(없으면 빈 배열).
19
+ */
20
+ export function validateHubMessage(msg: any): string[];
21
+ /**
22
+ * hub 메시지 envelope 생성. {@link createWsMessage} 위임 — v/id/ts 자동.
23
+ * wire `type` 은 반드시 {@link HUB_MESSAGE_TYPES} 의 값(`hub.*`) 이어야 한다.
24
+ *
25
+ * @param {Object} fields
26
+ * @param {string} fields.type - wire type(`hub.*`). 12 종 아님 → throw.
27
+ * @param {string} [fields.ns]
28
+ * @param {Object} [fields.payload]
29
+ * @param {Object} [fields.error] - hub.error 의 §6.3 ErrorObject.
30
+ * @param {string} [fields.ref]
31
+ * @param {{ id?: string, ts?: number }} [opts] - 테스트 주입용.
32
+ * @returns {{ v: number, id: string, type: string, ts: number }}
33
+ * @throws {Error} type 이 12 종 hub 타입이 아님.
34
+ */
35
+ export function createHubMessage(fields: {
36
+ type: string;
37
+ ns?: string;
38
+ payload?: Object;
39
+ error?: Object;
40
+ ref?: string;
41
+ }, opts?: {
42
+ id?: string;
43
+ ts?: number;
44
+ }): {
45
+ v: number;
46
+ id: string;
47
+ type: string;
48
+ ts: number;
49
+ };
50
+ /**
51
+ * JSON 문자열 → 검증된 hub 메시지 envelope. 파싱/검증 실패 시 throw(silent 금지).
52
+ *
53
+ * @param {string} json - hub link 평문 JSON.
54
+ * @returns {HubEnvelope} 검증 통과한 envelope.
55
+ * @throws {Error} JSON 파싱 실패 또는 hub 프로토콜 위반(메시지에 사유 포함).
56
+ */
57
+ export function parseHubMessage(json: string): HubEnvelope;
58
+ /**
59
+ * 논리명(04 §7 UPPERCASE) → wire `type`(`hub.<lower>`, ADR-097) 매핑.
60
+ * 키는 04-data-models §7 표의 타입명과 1:1. 값은 §6.2 패턴을 통과하는 소문자-점 형식.
61
+ * @type {Readonly<Record<string, string>>}
62
+ */
63
+ export const HUB_MESSAGE_TYPES: Readonly<Record<string, string>>;
64
+ /** 12 개 wire `type` 문자열 집합 (빠른 소속 판별용). @type {ReadonlySet<string>} */
65
+ export const HUB_TYPE_SET: ReadonlySet<string>;
66
+ /** bridge↔hub 프로토콜 현 버전. REGISTER/REGISTER_OK 의 `protocolVersion` 협상 기준(부재 = v1). */
67
+ export const HUB_PROTOCOL_VERSION: 1;
68
+ /**
69
+ * 이 측이 지원하는 bridge↔hub 프로토콜 버전 목록. 버전은 선형 누적 계약 — vN 지원 = v1..vN 전부 지원.
70
+ * @type {ReadonlyArray<number>}
71
+ */
72
+ export const SUPPORTED_HUB_PROTOCOL_VERSIONS: ReadonlyArray<number>;
73
+ /**
74
+ * bridge↔hub WebSocket close code 카탈로그 (ADR-098).
75
+ *
76
+ * 클라↔bridge 의 close code(4500 decrypt / 1011 internal, {@link import('../core/ws-upgrade.js')})
77
+ * 와 **다른 평면**이다 — 이쪽은 bridge↔hub 전송계층(plaintext+Bearer, ADR-059) 전용.
78
+ *
79
+ * - `1001` GOING_AWAY — 일반 graceful shutdown(테스트/명시 stop). 재연결 의무 없음.
80
+ * - `1008` UNAUTHORIZED — REGISTER Bearer 불일치(RFC 6455 policy violation, ADR-097).
81
+ * - `4503` DRAIN — hub 가 의도적으로 비우는 중. bridge 는 **다른 hub 인스턴스로 재연결**해야 한다
82
+ * (LB/mesh 회전). ADR-097 카탈로그가 예약했던 코드를 활성화.
83
+ * @type {Readonly<Record<string, number>>}
84
+ */
85
+ export const HUB_CLOSE_CODES: Readonly<Record<string, number>>;
86
+ /** hub drain close code(4503). bridge 가 이 코드를 받으면 재연결 대상으로 간주(ADR-098). */
87
+ export const CLOSE_CODE_DRAIN: number;
88
+ /**
89
+ * 타입별 payload JSON Schema (04-data-models §7 그대로). AJV 컴파일 대상.
90
+ * `hub.error` 는 payload 가 아니라 envelope `error` 로 검증하므로 여기엔 없다(아래 별도 처리).
91
+ * @type {Readonly<Record<string, Object>>}
92
+ */
93
+ export const HUB_PAYLOAD_SCHEMAS: Readonly<Record<string, Object>>;
94
+ /**
95
+ * hub 메시지 envelope (§6.2 + hub 타입). payload/error 는 타입별로 다르므로 any 로 둔다.
96
+ */
97
+ export type HubEnvelope = {
98
+ v: number;
99
+ id: string;
100
+ type: string;
101
+ ts: number;
102
+ ns?: string;
103
+ payload?: any;
104
+ error?: any;
105
+ ref?: string;
106
+ };
@@ -0,0 +1,22 @@
1
+ export * as MegaHealth from "./mega-health.js";
2
+ export { MegaShutdown } from "./mega-shutdown.js";
3
+ export { MegaCron } from "./mega-cron.js";
4
+ export { MegaJobQueue } from "./mega-job-queue.js";
5
+ export { MegaJobWorker } from "./mega-job-worker.js";
6
+ export { MegaWorker } from "./mega-worker.js";
7
+ export { MegaHash } from "./mega-hash.js";
8
+ export { MegaBruteForce } from "./mega-brute-force.js";
9
+ export { buildAdapterEnvConfig } from "./env-mapper.js";
10
+ export * as MegaTracing from "./mega-tracing.js";
11
+ export * as MegaMetrics from "./mega-metrics.js";
12
+ export * as MegaAspCrypto from "./asp/crypto.js";
13
+ export { registerAspPlugin } from "./asp/plugin.js";
14
+ export { MegaAspTerminator } from "./asp/ws-terminator.js";
15
+ export { normalizeAspConfig } from "./asp/config.js";
16
+ export { MegaRetry, withRetry, RetryAbortError } from "./mega-retry.js";
17
+ export { MegaCircuitBreaker, wrap as wrapCircuitBreaker, OPEN_CIRCUIT_ERROR_CODE, TIMEOUT_ERROR_CODE, CAPACITY_ERROR_CODE } from "./mega-circuit-breaker.js";
18
+ export { MegaSchedule, MegaScheduler } from "./mega-schedule.js";
19
+ export { MegaJob, resolveJobRetryConfig, JOB_RETRY_DEFAULTS } from "./mega-job.js";
20
+ export { MegaPluginHost, loadPlugins, CORE_API_VERSION } from "./mega-plugin.js";
21
+ export { MegaAspNonceCache, MegaMemoryNonceStore } from "./asp/nonce-cache.js";
22
+ export { MegaAspDecryptError, ASP_RULES } from "./asp/errors.js";