mega-framework 0.1.10 → 0.1.13

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 (91) hide show
  1. package/README.md +14 -4
  2. package/package.json +23 -21
  3. package/sample/crud/.env +10 -2
  4. package/sample/crud/.env.example +8 -0
  5. package/sample/crud/apps/main/controllers/bus-controller.js +122 -0
  6. package/sample/crud/apps/main/controllers/lock-controller.js +117 -0
  7. package/sample/crud/apps/main/locales/server/en.json +31 -1
  8. package/sample/crud/apps/main/locales/server/ko.json +31 -1
  9. package/sample/crud/apps/main/public/js/bus-demo.js +131 -0
  10. package/sample/crud/apps/main/public/js/lock-demo.js +122 -0
  11. package/sample/crud/apps/main/routes/bus.js +43 -0
  12. package/sample/crud/apps/main/routes/lock.js +35 -0
  13. package/sample/crud/apps/main/services/jobs-demo-service.js +21 -14
  14. package/sample/crud/apps/main/views/bus/index.ejs +80 -0
  15. package/sample/crud/apps/main/views/layouts/main.ejs +2 -0
  16. package/sample/crud/apps/main/views/lock/index.ejs +99 -0
  17. package/sample/crud/docs/guide/03-service-model-db.md +110 -6
  18. package/sample/crud/docs/guide/05-scheduler-job-worker.md +3 -1
  19. package/sample/crud/docs/guide/09-distributed-lock-and-bus.md +224 -0
  20. package/sample/crud/docs/guide/10-multi-app.md +74 -0
  21. package/sample/crud/mega.config.js +32 -0
  22. package/sample/crud/package.json +3 -2
  23. package/sample/multi/.env +16 -0
  24. package/sample/multi/.env.example +17 -0
  25. package/sample/multi/README.md +54 -0
  26. package/sample/multi/apps/admin/app.config.js +24 -0
  27. package/sample/multi/apps/admin/controllers/admin-controller.js +42 -0
  28. package/sample/multi/apps/admin/public/js/admin.js +31 -0
  29. package/sample/multi/apps/admin/routes/pages.js +11 -0
  30. package/sample/multi/apps/admin/views/index.ejs +33 -0
  31. package/sample/multi/apps/web/app.config.js +30 -0
  32. package/sample/multi/apps/web/controllers/web-controller.js +45 -0
  33. package/sample/multi/apps/web/public/js/web.js +24 -0
  34. package/sample/multi/apps/web/routes/pages.js +13 -0
  35. package/sample/multi/apps/web/views/index.ejs +51 -0
  36. package/sample/multi/mega.config.js +42 -0
  37. package/sample/multi/package.json +20 -0
  38. package/sample/simple/package.json +2 -2
  39. package/src/adapters/nats-adapter.js +39 -44
  40. package/src/adapters/nats-codec.js +38 -0
  41. package/src/cli/commands/scaffold.js +1 -0
  42. package/src/cli/index.js +9 -1
  43. package/src/core/app-registry.js +69 -0
  44. package/src/core/boot.js +99 -0
  45. package/src/core/bus/cluster-bus.js +190 -0
  46. package/src/core/bus/contract.js +123 -0
  47. package/src/core/bus/index.js +285 -0
  48. package/src/core/bus/memory-bus.js +103 -0
  49. package/src/core/bus/nats-bus.js +203 -0
  50. package/src/core/config-validator.js +118 -1
  51. package/src/core/ctx-builder.js +14 -1
  52. package/src/core/index.js +2 -0
  53. package/src/core/lock/cluster-lock.js +174 -0
  54. package/src/core/lock/contract.js +123 -0
  55. package/src/core/lock/fifo-waitlist.js +93 -0
  56. package/src/core/lock/index.js +292 -0
  57. package/src/core/lock/memory-lock.js +162 -0
  58. package/src/core/lock/redis-lock.js +276 -0
  59. package/src/core/mega-app.js +29 -0
  60. package/src/core/migration/generate.js +1 -1
  61. package/src/core/migration/journal.js +1 -1
  62. package/src/core/scope-registry.js +9 -0
  63. package/src/eslint-plugin/no-direct-model-import.js +2 -2
  64. package/src/index.js +2 -0
  65. package/src/lib/mega-job-queue.js +71 -47
  66. package/templates/model/code-mongo.tpl +1 -9
  67. package/templates/model/code.tpl +1 -10
  68. package/templates/model/test-mongo.tpl +1 -23
  69. package/templates/model/test.tpl +0 -17
  70. package/types/adapters/mega-adapter.d.ts +1 -1
  71. package/types/adapters/nats-adapter.d.ts +4 -4
  72. package/types/adapters/nats-codec.d.ts +13 -0
  73. package/types/adapters/redlock-adapter.d.ts +1 -1
  74. package/types/core/app-registry.d.ts +22 -0
  75. package/types/core/bus/cluster-bus.d.ts +45 -0
  76. package/types/core/bus/contract.d.ts +164 -0
  77. package/types/core/bus/index.d.ts +100 -0
  78. package/types/core/bus/memory-bus.d.ts +45 -0
  79. package/types/core/bus/nats-bus.d.ts +41 -0
  80. package/types/core/index.d.ts +1 -0
  81. package/types/core/lock/cluster-lock.d.ts +44 -0
  82. package/types/core/lock/contract.d.ts +181 -0
  83. package/types/core/lock/fifo-waitlist.d.ts +38 -0
  84. package/types/core/lock/index.d.ts +96 -0
  85. package/types/core/lock/memory-lock.d.ts +58 -0
  86. package/types/core/lock/redis-lock.d.ts +43 -0
  87. package/types/core/mega-app.d.ts +10 -0
  88. package/types/core/scope-registry.d.ts +6 -0
  89. package/types/index.d.ts +1 -1
  90. package/types/lib/mega-job-queue.d.ts +27 -4
  91. package/sample/simple/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
@@ -0,0 +1,96 @@
1
+ /** 활성 락 manager 설정(boot lock 스테이지). null 로 해제(셧다운/테스트). @param {LockManager | null} manager @returns {void} */
2
+ export function setLockManager(manager: LockManager | null): void;
3
+ /** 현재 활성 락 manager(없으면 null — `ctx.lock.with` 미부착). @returns {LockManager | null} */
4
+ export function getLockManager(): LockManager | null;
5
+ /**
6
+ * 분산 락 manager 를 만든다 — driver 자동 폴백 포함. boot 가 1회 호출해 `ctx.lock` 에 부착한다.
7
+ *
8
+ * @param {{ driver?: string, ttl?: number, waitMs?: number, fifo?: boolean, cache?: string }} [lockConfig] -
9
+ * config 의 `lock` 섹션. `cache` 는 redis driver 가 빌릴 cache 어댑터 alias(redis/auto 일 때 의미).
10
+ * @param {{ logger?: any, redisClient?: any, isClusterWorker?: boolean }} [deps] -
11
+ * - `redisClient` boot 가 cache 어댑터에서 빌려 넘긴 ioredis 클라이언트(없으면 null).
12
+ * - `isClusterWorker` 현재 프로세스가 cluster 워커인지(`cluster.isWorker`).
13
+ * @returns {LockManager}
14
+ */
15
+ export function createLockManager(lockConfig?: {
16
+ driver?: string;
17
+ ttl?: number;
18
+ waitMs?: number;
19
+ fifo?: boolean;
20
+ cache?: string;
21
+ }, deps?: {
22
+ logger?: any;
23
+ redisClient?: any;
24
+ isClusterWorker?: boolean;
25
+ }): LockManager;
26
+ /**
27
+ * `ctx.lock` 콜러블에 사용자 API 메서드를 얹는다 — `ctx.lock(alias)`(기존)와 `ctx.lock.with(...)`(신규) 공존.
28
+ * boot 가 manager 생성 후 각 앱의 lock accessor 에 1회 호출한다.
29
+ *
30
+ * @param {Function & Record<string, any>} lockAccessor - `(alias) => MegaLockAdapter` 콜러블(ctx-builder 산출).
31
+ * @param {LockManager} manager
32
+ * @returns {Function & Record<string, any>} 같은 accessor(체이닝용).
33
+ */
34
+ export function attachLockApi(lockAccessor: Function & Record<string, any>, manager: LockManager): Function & Record<string, any>;
35
+ /**
36
+ * 사용자 분산 락 API. driver 한 개를 감싸 `with/acquire/tryAcquire/forceRelease/stats` 를 제공한다.
37
+ */
38
+ export class LockManager {
39
+ /**
40
+ * @param {import('./contract.js').LockDriver} driver - 선택된 저수준 driver.
41
+ * @param {{ defaults: { ttl: number, waitMs: number, fifo: boolean }, logger?: any }} opts
42
+ */
43
+ constructor(driver: import("./contract.js").LockDriver, { defaults, logger }: {
44
+ defaults: {
45
+ ttl: number;
46
+ waitMs: number;
47
+ fifo: boolean;
48
+ };
49
+ logger?: any;
50
+ });
51
+ /** @returns {string} 활성 driver 이름('redis'|'cluster'|'memory'). */
52
+ get driverName(): string;
53
+ /**
54
+ * 락 획득(대기 후 실패 시 throw) — `try/finally` 로 직접 release 하는 용도.
55
+ * @param {string} key - 자원 키(비어있지 않은 공백 없는 문자열).
56
+ * @param {import('./contract.js').LockOpts} [opts] - ttl/waitMs/fifo/fence/extendable.
57
+ * @returns {Promise<import('./contract.js').LockHandle>}
58
+ * @throws {MegaConflictError} `lock.not_acquired` - waitMs 안에 못 잡음(자원이 잠겨있음 — 409).
59
+ * @throws {MegaValidationError} key/opts 부적합.
60
+ */
61
+ acquire(key: string, opts?: import("./contract.js").LockOpts): Promise<import("./contract.js").LockHandle>;
62
+ /**
63
+ * 락을 즉시 1회만 시도(대기 없음) — 못 잡으면 null(throw 아님).
64
+ * @param {string} key @param {import('./contract.js').LockOpts} [opts]
65
+ * @returns {Promise<import('./contract.js').LockHandle | null>}
66
+ */
67
+ tryAcquire(key: string, opts?: import("./contract.js").LockOpts): Promise<import("./contract.js").LockHandle | null>;
68
+ /**
69
+ * 락 보호 임계구역 실행 — 획득 → fn 실행 → **반드시 해제**(성공/예외 무관). 가장 권장되는 사용법.
70
+ * @template T
71
+ * @param {string} key
72
+ * @param {import('./contract.js').LockOpts | ((lock: import('./contract.js').LockHandle) => Promise<T> | T)} optsOrFn -
73
+ * 옵션, 또는 옵션을 생략하고 바로 fn(2-인자 형태 `with(key, fn)`).
74
+ * @param {(lock: import('./contract.js').LockHandle) => Promise<T> | T} [maybeFn] - 3-인자 형태의 fn.
75
+ * @returns {Promise<T>} fn 의 반환값.
76
+ */
77
+ with<T>(key: string, optsOrFn: import("./contract.js").LockOpts | ((lock: import("./contract.js").LockHandle) => Promise<T> | T), maybeFn?: (lock: import("./contract.js").LockHandle) => Promise<T> | T): Promise<T>;
78
+ /**
79
+ * 관리용 강제 해제(토큰 무관) — 운영 개입(고아 락 정리)용. 주의: 정상 보유자의 임계구역을 깰 수 있다.
80
+ * @param {string} key @returns {Promise<void>}
81
+ */
82
+ forceRelease(key: string): Promise<void>;
83
+ /** @returns {Promise<{ driver: string, active: number, waiting: number }>} 현재 보유/대기 수. */
84
+ stats(): Promise<{
85
+ driver: string;
86
+ active: number;
87
+ waiting: number;
88
+ }>;
89
+ /** 정리 — driver 자원(타이머·구독·IPC) 해제. graceful shutdown 에서 호출. @returns {Promise<void>} */
90
+ close(): Promise<void>;
91
+ #private;
92
+ }
93
+ import { MemoryLockDriver } from './memory-lock.js';
94
+ import { ClusterLockDriver } from './cluster-lock.js';
95
+ import { RedisLockDriver } from './redis-lock.js';
96
+ export { MemoryLockDriver, ClusterLockDriver, RedisLockDriver };
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @typedef {Object} HeldLock - 보유 중 락 레코드.
3
+ * @property {string} token @property {number} expiresAt @property {ReturnType<typeof setTimeout>} timer @property {number} [fence]
4
+ */
5
+ /**
6
+ * @typedef {Object} Waiter - 대기 큐 항목.
7
+ * @property {number} ttl @property {boolean} fence @property {(lock: import('./contract.js').DriverLock | null) => void} resolve
8
+ * @property {ReturnType<typeof setTimeout> | null} timer
9
+ */
10
+ export class MemoryLockDriver {
11
+ /** @type {'memory'} */
12
+ get name(): "memory";
13
+ /**
14
+ * 락 획득 — 즉시 가능하면 grant, 아니면 waitMs 안에서 FIFO 큐 대기.
15
+ * @param {string} key @param {import('./contract.js').NormalizedLockOpts} opts
16
+ * @returns {Promise<import('./contract.js').DriverLock | null>}
17
+ */
18
+ acquire(key: string, { ttl, waitMs, fence }: import("./contract.js").NormalizedLockOpts): Promise<import("./contract.js").DriverLock | null>;
19
+ /**
20
+ * 락 해제 — 토큰이 현재 보유자일 때만. 해제 후 다음 대기자 승계.
21
+ * @param {string} key @param {string} token @returns {Promise<boolean>}
22
+ */
23
+ release(key: string, token: string): Promise<boolean>;
24
+ /**
25
+ * TTL 연장 — 토큰이 보유자일 때만 만료 타이머 재설정.
26
+ * @param {string} key @param {string} token @param {number} ttl @returns {Promise<boolean>}
27
+ */
28
+ extend(key: string, token: string, ttl: number): Promise<boolean>;
29
+ /** 강제 해제(관리용, 토큰 무관) — 보유 비우고 다음 대기자 승계. @param {string} key @returns {Promise<void>} */
30
+ forceRelease(key: string): Promise<void>;
31
+ /** @returns {Promise<{ driver: string, active: number, waiting: number }>} 보유/대기 수. */
32
+ stats(): Promise<{
33
+ driver: string;
34
+ active: number;
35
+ waiting: number;
36
+ }>;
37
+ /** 정리 — 모든 만료 타이머 해제 + 대기자에 null 응답(graceful shutdown). @returns {Promise<void>} */
38
+ close(): Promise<void>;
39
+ #private;
40
+ }
41
+ /**
42
+ * - 보유 중 락 레코드.
43
+ */
44
+ export type HeldLock = {
45
+ token: string;
46
+ expiresAt: number;
47
+ timer: ReturnType<typeof setTimeout>;
48
+ fence?: number;
49
+ };
50
+ /**
51
+ * - 대기 큐 항목.
52
+ */
53
+ export type Waiter = {
54
+ ttl: number;
55
+ fence: boolean;
56
+ resolve: (lock: import("./contract.js").DriverLock | null) => void;
57
+ timer: ReturnType<typeof setTimeout> | null;
58
+ };
@@ -0,0 +1,43 @@
1
+ export class RedisLockDriver {
2
+ /**
3
+ * @param {{ client: any, createSubscriber?: () => any }} opts
4
+ * - `client` ioredis 호환 클라이언트(`set`/`eval`/`incr`/`zadd`… 보유). cache 어댑터의 `.native`.
5
+ * - `createSubscriber` Pub/Sub 구독 연결 생성자(기본 `client.duplicate()`). 테스트 주입용.
6
+ */
7
+ constructor({ client, createSubscriber }: {
8
+ client: any;
9
+ createSubscriber?: () => any;
10
+ });
11
+ /** @type {'redis'} */
12
+ get name(): "redis";
13
+ /**
14
+ * 락 획득 — fifo 면 대기열 head 일 때만, 아니면 즉시 SET 후 경합 시 Pub/Sub 대기.
15
+ * @param {string} key @param {import('./contract.js').NormalizedLockOpts} opts
16
+ * @returns {Promise<import('./contract.js').DriverLock | null>}
17
+ */
18
+ acquire(key: string, { ttl, waitMs, fifo, fence }: import("./contract.js").NormalizedLockOpts): Promise<import("./contract.js").DriverLock | null>;
19
+ /**
20
+ * 해제 — 소유 토큰일 때만 DEL + 해제 알림(Lua 원자).
21
+ * @param {string} key @param {string} token @returns {Promise<boolean>}
22
+ */
23
+ release(key: string, token: string): Promise<boolean>;
24
+ /**
25
+ * 연장 — 소유 토큰일 때만 PEXPIRE(Lua 원자).
26
+ * @param {string} key @param {string} token @param {number} ttl @returns {Promise<boolean>}
27
+ */
28
+ extend(key: string, token: string, ttl: number): Promise<boolean>;
29
+ /** 강제 해제(관리용, 토큰 무관) — DEL + 해제 알림(대기자 깨움). @param {string} key @returns {Promise<void>} */
30
+ forceRelease(key: string): Promise<void>;
31
+ /**
32
+ * 통계(best-effort) — `…:v:*`/`…:w:*` 키를 SCAN 으로 센다. O(키 수) 라 운영 관측용(고빈도 호출 비권장).
33
+ * @returns {Promise<{ driver: string, active: number, waiting: number }>}
34
+ */
35
+ stats(): Promise<{
36
+ driver: string;
37
+ active: number;
38
+ waiting: number;
39
+ }>;
40
+ /** 정리 — 구독 연결만 quit(명령 클라이언트는 cache 소유라 건드리지 않음). @returns {Promise<void>} */
41
+ close(): Promise<void>;
42
+ #private;
43
+ }
@@ -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}]]}