mega-framework 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -4
- package/package.json +23 -21
- package/sample/crud/.env +10 -2
- package/sample/crud/.env.example +8 -0
- package/sample/crud/apps/main/controllers/bus-controller.js +122 -0
- package/sample/crud/apps/main/controllers/lock-controller.js +117 -0
- package/sample/crud/apps/main/locales/server/en.json +31 -1
- package/sample/crud/apps/main/locales/server/ko.json +31 -1
- package/sample/crud/apps/main/public/js/bus-demo.js +131 -0
- package/sample/crud/apps/main/public/js/lock-demo.js +122 -0
- package/sample/crud/apps/main/routes/bus.js +43 -0
- package/sample/crud/apps/main/routes/lock.js +35 -0
- package/sample/crud/apps/main/services/jobs-demo-service.js +21 -14
- package/sample/crud/apps/main/views/bus/index.ejs +80 -0
- package/sample/crud/apps/main/views/layouts/main.ejs +2 -0
- package/sample/crud/apps/main/views/lock/index.ejs +99 -0
- package/sample/crud/docs/guide/03-service-model-db.md +48 -0
- package/sample/crud/docs/guide/05-scheduler-job-worker.md +3 -1
- package/sample/crud/docs/guide/09-distributed-lock-and-bus.md +224 -0
- package/sample/crud/docs/guide/10-multi-app.md +74 -0
- package/sample/crud/mega.config.js +32 -0
- package/sample/crud/package.json +3 -2
- package/sample/multi/.env +16 -0
- package/sample/multi/.env.example +17 -0
- package/sample/multi/README.md +54 -0
- package/sample/multi/apps/admin/app.config.js +24 -0
- package/sample/multi/apps/admin/controllers/admin-controller.js +42 -0
- package/sample/multi/apps/admin/public/js/admin.js +31 -0
- package/sample/multi/apps/admin/routes/pages.js +11 -0
- package/sample/multi/apps/admin/views/index.ejs +33 -0
- package/sample/multi/apps/web/app.config.js +30 -0
- package/sample/multi/apps/web/controllers/web-controller.js +45 -0
- package/sample/multi/apps/web/public/js/web.js +24 -0
- package/sample/multi/apps/web/routes/pages.js +13 -0
- package/sample/multi/apps/web/views/index.ejs +51 -0
- package/sample/multi/mega.config.js +42 -0
- package/sample/multi/package.json +20 -0
- package/sample/simple/package.json +2 -2
- package/src/adapters/nats-adapter.js +39 -44
- package/src/adapters/nats-codec.js +38 -0
- package/src/cli/commands/scaffold.js +1 -0
- package/src/cli/index.js +9 -1
- package/src/core/app-registry.js +69 -0
- package/src/core/boot.js +99 -0
- package/src/core/bus/cluster-bus.js +190 -0
- package/src/core/bus/contract.js +123 -0
- package/src/core/bus/index.js +285 -0
- package/src/core/bus/memory-bus.js +103 -0
- package/src/core/bus/nats-bus.js +203 -0
- package/src/core/config-validator.js +118 -1
- package/src/core/ctx-builder.js +14 -1
- package/src/core/index.js +2 -0
- package/src/core/lock/cluster-lock.js +174 -0
- package/src/core/lock/contract.js +123 -0
- package/src/core/lock/fifo-waitlist.js +93 -0
- package/src/core/lock/index.js +292 -0
- package/src/core/lock/memory-lock.js +162 -0
- package/src/core/lock/redis-lock.js +276 -0
- package/src/core/mega-app.js +29 -0
- package/src/core/migration/generate.js +1 -1
- package/src/core/migration/journal.js +1 -1
- package/src/core/scope-registry.js +9 -0
- package/src/eslint-plugin/no-direct-model-import.js +2 -2
- package/src/index.js +2 -0
- package/src/lib/mega-job-queue.js +71 -47
- package/types/adapters/mega-adapter.d.ts +1 -1
- package/types/adapters/nats-adapter.d.ts +4 -4
- package/types/adapters/nats-codec.d.ts +13 -0
- package/types/adapters/redlock-adapter.d.ts +1 -1
- package/types/core/app-registry.d.ts +22 -0
- package/types/core/bus/cluster-bus.d.ts +45 -0
- package/types/core/bus/contract.d.ts +164 -0
- package/types/core/bus/index.d.ts +100 -0
- package/types/core/bus/memory-bus.d.ts +45 -0
- package/types/core/bus/nats-bus.d.ts +41 -0
- package/types/core/index.d.ts +1 -0
- package/types/core/lock/cluster-lock.d.ts +44 -0
- package/types/core/lock/contract.d.ts +181 -0
- package/types/core/lock/fifo-waitlist.d.ts +38 -0
- package/types/core/lock/index.d.ts +96 -0
- package/types/core/lock/memory-lock.d.ts +58 -0
- package/types/core/lock/redis-lock.d.ts +43 -0
- package/types/core/mega-app.d.ts +10 -0
- package/types/core/scope-registry.d.ts +6 -0
- package/types/index.d.ts +1 -1
- package/types/lib/mega-job-queue.d.ts +27 -4
- package/sample/simple/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
package/types/core/mega-app.d.ts
CHANGED
|
@@ -309,6 +309,16 @@ export class MegaApp {
|
|
|
309
309
|
* @returns {import('./ctx-builder.js').AdapterAccessors}
|
|
310
310
|
*/
|
|
311
311
|
get adapterAccessors(): import("./ctx-builder.js").AdapterAccessors;
|
|
312
|
+
/** 분산 락 사용자 API(ADR-226) — `ctx.lock` 과 같은 process manager(콜러블 + .with/.acquire/...). @returns {any} */
|
|
313
|
+
get lock(): any;
|
|
314
|
+
/** 메시지 버스 사용자 API(ADR-227) — `ctx.bus` 와 같은 process manager(콜러블 + .emit/.on/.request/...). @returns {any} */
|
|
315
|
+
get bus(): any;
|
|
316
|
+
/** 앱 별명 → 공유 DB 어댑터(ADR-102). 미선언 별명은 throw. @param {string} alias @returns {import('../adapters/mega-adapter.js').MegaAdapter} */
|
|
317
|
+
db(alias: string): import("../adapters/mega-adapter.js").MegaAdapter;
|
|
318
|
+
/** 앱 별명 → 공유 캐시 어댑터(ADR-102). 미선언 별명은 throw. @param {string} alias @returns {import('../adapters/mega-adapter.js').MegaAdapter} */
|
|
319
|
+
cache(alias: string): import("../adapters/mega-adapter.js").MegaAdapter;
|
|
320
|
+
/** 앱 로거(pino, ADR-141) — `ctx.log` 의 요청 바인딩 없는 베이스 로거. @returns {any} */
|
|
321
|
+
get log(): any;
|
|
312
322
|
/**
|
|
313
323
|
* 이 앱의 서비스 레지스트리(name → 클래스, ADR-148). 요청 ctx 빌더가 `ctx.services.<name>` lazy DI 의
|
|
314
324
|
* 클래스 lookup 출처로 읽는다. 부팅 orchestrator 가 `setServiceRegistry` 로 채운다.
|
|
@@ -10,5 +10,11 @@ export const GLOBAL_ONLY_KEYS: readonly string[];
|
|
|
10
10
|
export const APP_ONLY_KEYS: readonly string[];
|
|
11
11
|
/** Shared-Reference 키 — 전역 services 의 키만 참조 가능 */
|
|
12
12
|
export const SHARED_REFERENCE_KEYS: readonly string[];
|
|
13
|
+
/**
|
|
14
|
+
* Dual-scope 키 — 글로벌(mega.config.js)과 앱(app.config.js) **양쪽**에 정의 가능 (ADR-229).
|
|
15
|
+
* 글로벌은 fallback, 앱별 정의가 있으면 그 앱은 자기 manager 를 쓴다(앱별 lock/bus backend 분리). GLOBAL_ONLY_KEYS
|
|
16
|
+
* 에도 그대로 남겨(글로벌 정의 허용) 두고, validateAppConfig 가 이 목록을 wrong_scope 예외로 둔다.
|
|
17
|
+
*/
|
|
18
|
+
export const DUAL_SCOPE_KEYS: readonly string[];
|
|
13
19
|
export const ALL_GLOBAL_KEYS: readonly string[];
|
|
14
20
|
export const ALL_APP_KEYS: readonly string[];
|
package/types/index.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export { registerAspPlugin } from "./lib/asp/plugin.js";
|
|
|
18
18
|
export { MegaAspTerminator } from "./lib/asp/ws-terminator.js";
|
|
19
19
|
export { normalizeAspConfig } from "./lib/asp/config.js";
|
|
20
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";
|
|
21
|
+
export { MegaApp, MegaServer, Router, loadAndValidateConfig, loadRoutes, bootApp, buildBootContext, getApp, hasApp, 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
22
|
export { runCli, parseArgs, runWorkerHost, runSchedulerHost, dispatchPluginCommand, USAGE } from "./cli/index.js";
|
|
23
23
|
export { MegaHttpError, MegaValidationError, MegaAuthError, MegaForbiddenError, MegaNotFoundError, MegaConflictError, MegaInternalError } from "./errors/http-errors.js";
|
|
24
24
|
export { buildLogger, buildLoggerOptions, buildTargets } from "./lib/mega-logger.js";
|
|
@@ -7,7 +7,7 @@ export const DEFAULT_DLQ_MAX_AGE_MS: number;
|
|
|
7
7
|
export const DEFAULT_RUN_TIMEOUT_MS: number;
|
|
8
8
|
/**
|
|
9
9
|
* @typedef {Object} MegaJobQueueOptions
|
|
10
|
-
* @property {import('nats').NatsConnection} nc - **연결된** NatsConnection(`ctx.bus(alias).native`).
|
|
10
|
+
* @property {import('@nats-io/nats-core').NatsConnection} nc - **연결된** NatsConnection(`ctx.bus(alias).native`).
|
|
11
11
|
* @property {number} [ackWaitMs=30000] - consumer ack 대기(ms). 초과 시 JetStream 재전달. `working()`
|
|
12
12
|
* 하트비트가 이 값의 절반마다 lease 를 갱신한다.
|
|
13
13
|
* @property {number} [maxDeliver=5] - JetStream 최대 전달 횟수(워커 크래시 재전달 backstop).
|
|
@@ -31,6 +31,17 @@ export const DEFAULT_RUN_TIMEOUT_MS: number;
|
|
|
31
31
|
* @property {any} [result] - run 반환값(성공 시).
|
|
32
32
|
* @property {Error} [error] - 실패 사유(실패 시).
|
|
33
33
|
*/
|
|
34
|
+
/**
|
|
35
|
+
* ensureReady 가 lazy import 로 채우는 v3 nats 심볼 묶음(ADR-225). enum·nanos·not-found 에러 클래스만
|
|
36
|
+
* 추려 보관해 잡 미사용 앱에 nats 전체 로드를 강제하지 않는다.
|
|
37
|
+
* @typedef {Object} MegaJobQueueNatsBundle
|
|
38
|
+
* @property {typeof import('@nats-io/jetstream').RetentionPolicy} RetentionPolicy
|
|
39
|
+
* @property {typeof import('@nats-io/jetstream').AckPolicy} AckPolicy
|
|
40
|
+
* @property {typeof import('@nats-io/jetstream').StorageType} StorageType
|
|
41
|
+
* @property {typeof import('@nats-io/nats-core').nanos} nanos
|
|
42
|
+
* @property {typeof import('@nats-io/jetstream').JetStreamApiError} JetStreamApiError
|
|
43
|
+
* @property {typeof import('@nats-io/jetstream').JetStreamApiCodes} JetStreamApiCodes
|
|
44
|
+
*/
|
|
34
45
|
/**
|
|
35
46
|
* JetStream 잡 큐 런타임. {@link MegaJob} 클래스를 받아 enqueue/consume·재시도·DLQ 를 처리한다.
|
|
36
47
|
*
|
|
@@ -115,19 +126,19 @@ export class MegaJobQueue extends EventEmitter<any> {
|
|
|
115
126
|
* in-flight Promise 가 reject 되지 않게 — MegaScheduler #fire 와 동일 불변식). 내부/테스트용 seam 이라
|
|
116
127
|
* `_` 접두사(어댑터 `_connect` 컨벤션).
|
|
117
128
|
*
|
|
118
|
-
* @param {MegaJob} instance @param {Record<string, any>} ctx @param {import('nats').JsMsg} msg
|
|
129
|
+
* @param {MegaJob} instance @param {Record<string, any>} ctx @param {import('@nats-io/jetstream').JsMsg} msg
|
|
119
130
|
* @param {ReturnType<typeof resolveJobRetryConfig>} retryConfig @param {string} subject
|
|
120
131
|
* @param {number} [runTimeoutMs] - run 전체(재시도 포함) 상한(ms). 미지정 시 큐 디폴트, 0 = 무제한.
|
|
121
132
|
* @returns {Promise<MegaJobHandleResult>}
|
|
122
133
|
*/
|
|
123
|
-
_handleMessage(instance: MegaJob, ctx: Record<string, any>, msg: import("nats").JsMsg, retryConfig: ReturnType<typeof resolveJobRetryConfig>, subject: string, runTimeoutMs?: number): Promise<MegaJobHandleResult>;
|
|
134
|
+
_handleMessage(instance: MegaJob, ctx: Record<string, any>, msg: import("@nats-io/jetstream").JsMsg, retryConfig: ReturnType<typeof resolveJobRetryConfig>, subject: string, runTimeoutMs?: number): Promise<MegaJobHandleResult>;
|
|
124
135
|
#private;
|
|
125
136
|
}
|
|
126
137
|
export type MegaJobQueueOptions = {
|
|
127
138
|
/**
|
|
128
139
|
* - **연결된** NatsConnection(`ctx.bus(alias).native`).
|
|
129
140
|
*/
|
|
130
|
-
nc: import("nats").NatsConnection;
|
|
141
|
+
nc: import("@nats-io/nats-core").NatsConnection;
|
|
131
142
|
/**
|
|
132
143
|
* - consumer ack 대기(ms). 초과 시 JetStream 재전달. `working()`
|
|
133
144
|
* 하트비트가 이 값의 절반마다 lease 를 갱신한다.
|
|
@@ -183,6 +194,18 @@ export type MegaJobHandleResult = {
|
|
|
183
194
|
*/
|
|
184
195
|
error?: Error;
|
|
185
196
|
};
|
|
197
|
+
/**
|
|
198
|
+
* ensureReady 가 lazy import 로 채우는 v3 nats 심볼 묶음(ADR-225). enum·nanos·not-found 에러 클래스만
|
|
199
|
+
* 추려 보관해 잡 미사용 앱에 nats 전체 로드를 강제하지 않는다.
|
|
200
|
+
*/
|
|
201
|
+
export type MegaJobQueueNatsBundle = {
|
|
202
|
+
RetentionPolicy: typeof import("@nats-io/jetstream").RetentionPolicy;
|
|
203
|
+
AckPolicy: typeof import("@nats-io/jetstream").AckPolicy;
|
|
204
|
+
StorageType: typeof import("@nats-io/jetstream").StorageType;
|
|
205
|
+
nanos: typeof import("@nats-io/nats-core").nanos;
|
|
206
|
+
JetStreamApiError: typeof import("@nats-io/jetstream").JetStreamApiError;
|
|
207
|
+
JetStreamApiCodes: typeof import("@nats-io/jetstream").JetStreamApiCodes;
|
|
208
|
+
};
|
|
186
209
|
import { EventEmitter } from 'node:events';
|
|
187
210
|
import { MegaJob } from './mega-job.js';
|
|
188
211
|
import { resolveJobRetryConfig } from './mega-job.js';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":"4.1.8","results":[[":test/apps/main/index.test.js",{"duration":1.6905000000000001,"failed":false}]]}
|