mega-framework 0.1.6 โ†’ 0.1.8

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 (248) hide show
  1. package/README.md +9 -0
  2. package/bin/mega-ws-hub.js +2 -2
  3. package/package.json +33 -9
  4. package/sample/crud/.env +10 -1
  5. package/sample/crud/.env.example +10 -1
  6. package/sample/crud/.mega/journal/history/20260612092543-create-users.json +261 -0
  7. package/sample/crud/.mega/journal/snapshot.json +261 -0
  8. package/sample/crud/apps/main/controllers/auth-controller.js +22 -14
  9. package/sample/crud/apps/main/controllers/web-controller.js +7 -5
  10. package/sample/crud/apps/main/locales/server/en.json +12 -1
  11. package/sample/crud/apps/main/locales/server/ko.json +12 -1
  12. package/sample/crud/apps/main/migrations/20260606000001-create-users.js +91 -13
  13. package/sample/crud/apps/main/migrations/20260606000002-create-boards.js +165 -0
  14. package/sample/crud/apps/main/migrations/20260606000003-create-logs.js +107 -0
  15. package/sample/crud/apps/main/models/log-partition-model.js +105 -0
  16. package/sample/crud/apps/main/models/note-model.js +79 -0
  17. package/sample/crud/apps/main/models/user-level-model.js +24 -0
  18. package/sample/crud/apps/main/models/user-model.js +146 -0
  19. package/sample/crud/apps/main/models/user-type-model.js +21 -0
  20. package/sample/crud/apps/main/models/wallet-model.js +24 -0
  21. package/sample/crud/apps/main/routes/users.js +55 -10
  22. package/sample/crud/apps/main/schedules/log-partition-schedule.js +33 -0
  23. package/sample/crud/apps/main/services/auth-service.js +39 -24
  24. package/sample/crud/apps/main/services/log-partition-service.js +101 -0
  25. package/sample/crud/apps/main/services/note-service.js +6 -6
  26. package/sample/crud/apps/main/services/redis-demo-service.js +3 -3
  27. package/sample/crud/apps/main/services/user-service.js +62 -21
  28. package/sample/crud/apps/main/views/auth/login.ejs +6 -6
  29. package/sample/crud/apps/main/views/auth/register.ejs +46 -5
  30. package/sample/crud/apps/main/views/users/edit.ejs +42 -5
  31. package/sample/crud/apps/main/views/users/list.ejs +6 -2
  32. package/sample/crud/apps/main/views/users/new.ejs +56 -4
  33. package/sample/crud/docs/log_partition_design.mm.md +23 -0
  34. package/sample/crud/mega.config.js +10 -2
  35. package/sample/crud/package.json +3 -3
  36. package/sample/crud/scripts/start-ws-hub.sh +20 -6
  37. package/sample/simple/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  38. package/sample/simple/package.json +2 -2
  39. package/src/adapters/adapter-manager.js +2 -1
  40. package/src/adapters/adapter-options.js +44 -3
  41. package/src/adapters/file-adapter.js +9 -5
  42. package/src/adapters/file-session-adapter.js +4 -3
  43. package/src/adapters/maria-adapter.js +33 -7
  44. package/src/adapters/mega-cache-adapter.js +83 -6
  45. package/src/adapters/mega-db-adapter.js +10 -1
  46. package/src/adapters/mongo-adapter.js +40 -8
  47. package/src/adapters/postgres-adapter.js +33 -6
  48. package/src/adapters/redis-adapter.js +7 -3
  49. package/src/adapters/sqlite-adapter.js +26 -3
  50. package/src/cli/commands/console-cmd.js +3 -1
  51. package/src/cli/commands/new.js +13 -3
  52. package/src/cli/commands/scaffold.js +173 -33
  53. package/src/cli/generators/index.js +140 -3
  54. package/src/cli/index.js +437 -155
  55. package/src/cli/watch.js +188 -0
  56. package/src/core/ajv-mapper.js +30 -3
  57. package/src/core/boot.js +464 -245
  58. package/src/core/cluster-metrics.js +13 -4
  59. package/src/core/ctx-builder.js +65 -3
  60. package/src/core/envelope.js +119 -12
  61. package/src/core/hub-link.js +89 -18
  62. package/src/core/i18n.js +11 -1
  63. package/src/core/index.js +7 -3
  64. package/src/core/mega-app.js +253 -505
  65. package/src/core/mega-cluster.js +4 -1
  66. package/src/core/mega-server.js +40 -9
  67. package/src/core/migration/dialect-registry.js +107 -0
  68. package/src/core/migration/dialects/README.md +62 -0
  69. package/src/core/migration/dialects/maria.js +496 -0
  70. package/src/core/migration/dialects/mongo.js +824 -0
  71. package/src/core/migration/dialects/postgres.js +563 -0
  72. package/src/core/migration/dialects/sqlite.js +476 -0
  73. package/src/core/migration/differ.js +456 -0
  74. package/src/core/migration/generate.js +508 -0
  75. package/src/core/migration/journal.js +167 -0
  76. package/src/core/migration/model-scan.js +84 -0
  77. package/src/core/migration/mongo-migration-db.js +97 -0
  78. package/src/core/migration/schema-builder.js +400 -0
  79. package/src/core/migration/schema-validator.js +315 -0
  80. package/src/core/migration-lock.js +205 -0
  81. package/src/core/migration-runner.js +166 -38
  82. package/src/core/multipart.js +28 -5
  83. package/src/core/pipeline.js +131 -0
  84. package/src/core/router.js +70 -65
  85. package/src/core/scope-registry.js +1 -0
  86. package/src/core/security.js +70 -12
  87. package/src/core/session-store.js +14 -1
  88. package/src/core/workers-manager.js +12 -1
  89. package/src/core/ws-cluster.js +10 -3
  90. package/src/core/ws-message.js +48 -4
  91. package/src/core/ws-presence.js +636 -0
  92. package/src/core/ws-roster.js +50 -8
  93. package/src/core/ws-upgrade.js +223 -12
  94. package/src/index.js +1 -1
  95. package/src/lib/hub-protocol.js +29 -0
  96. package/src/lib/mega-circuit-breaker.js +5 -3
  97. package/src/lib/mega-health.js +35 -4
  98. package/src/lib/mega-job-queue.js +151 -34
  99. package/src/lib/mega-job.js +37 -1
  100. package/src/lib/mega-metrics.js +31 -13
  101. package/src/lib/mega-plugin.js +34 -3
  102. package/src/lib/mega-schedule.js +40 -22
  103. package/src/lib/mega-shutdown.js +114 -39
  104. package/src/lib/mega-tracing.js +66 -19
  105. package/src/lib/mega-worker.js +33 -6
  106. package/src/lib/otel-resource.js +36 -0
  107. package/src/{cli โ†’ lib}/ws-hub.js +139 -15
  108. package/src/models/crud-sql-builder.js +133 -0
  109. package/src/models/mega-model.js +82 -2
  110. package/src/models/model-crud.js +483 -0
  111. package/src/models/mongo-crud.js +285 -0
  112. package/templates/adr/code.tpl +23 -0
  113. package/templates/model/code-mongo.tpl +35 -0
  114. package/templates/model/code.tpl +15 -1
  115. package/templates/model/test-mongo.tpl +38 -0
  116. package/templates/model/test.tpl +4 -0
  117. package/types/adapters/adapter-manager.d.ts +95 -0
  118. package/types/adapters/adapter-options.d.ts +93 -0
  119. package/types/adapters/file-adapter.d.ts +105 -0
  120. package/types/adapters/file-session-adapter.d.ts +103 -0
  121. package/types/adapters/index.d.ts +20 -0
  122. package/types/adapters/maria-adapter.d.ts +117 -0
  123. package/types/adapters/mega-adapter.d.ts +215 -0
  124. package/types/adapters/mega-bus-adapter.d.ts +45 -0
  125. package/types/adapters/mega-cache-adapter.d.ts +73 -0
  126. package/types/adapters/mega-db-adapter.d.ts +50 -0
  127. package/types/adapters/mega-lock-adapter.d.ts +62 -0
  128. package/types/adapters/mega-log-sink-adapter.d.ts +15 -0
  129. package/types/adapters/mega-session-adapter.d.ts +32 -0
  130. package/types/adapters/mongo-adapter.d.ts +150 -0
  131. package/types/adapters/nats-adapter.d.ts +108 -0
  132. package/types/adapters/postgres-adapter.d.ts +141 -0
  133. package/types/adapters/redis-adapter.d.ts +78 -0
  134. package/types/adapters/redis-session-adapter.d.ts +82 -0
  135. package/types/adapters/redlock-adapter.d.ts +149 -0
  136. package/types/adapters/registry.d.ts +46 -0
  137. package/types/adapters/sqlite-adapter.d.ts +112 -0
  138. package/types/auth/index.d.ts +24 -0
  139. package/types/cli/commands/console-cmd.d.ts +37 -0
  140. package/types/cli/commands/new.d.ts +16 -0
  141. package/types/cli/commands/routes.d.ts +36 -0
  142. package/types/cli/commands/scaffold.d.ts +78 -0
  143. package/types/cli/commands/test-cmd.d.ts +14 -0
  144. package/types/cli/generators/index.d.ts +122 -0
  145. package/types/cli/index.d.ts +234 -0
  146. package/types/cli/template-engine.d.ts +40 -0
  147. package/types/cli/watch.d.ts +59 -0
  148. package/types/core/ajv-mapper.d.ts +27 -0
  149. package/types/core/boot.d.ts +233 -0
  150. package/types/core/cluster-metrics.d.ts +52 -0
  151. package/types/core/config-loader.d.ts +13 -0
  152. package/types/core/config-validator.d.ts +30 -0
  153. package/types/core/ctx-builder.d.ts +103 -0
  154. package/types/core/envelope.d.ts +79 -0
  155. package/types/core/error-mapper.d.ts +17 -0
  156. package/types/core/formbody.d.ts +41 -0
  157. package/types/core/hub-link.d.ts +266 -0
  158. package/types/core/i18n.d.ts +178 -0
  159. package/types/core/index.d.ts +28 -0
  160. package/types/core/mega-app.d.ts +529 -0
  161. package/types/core/mega-cluster.d.ts +104 -0
  162. package/types/core/mega-server.d.ts +91 -0
  163. package/types/core/mega-service.d.ts +31 -0
  164. package/types/core/migration/dialect-registry.d.ts +22 -0
  165. package/types/core/migration/dialects/maria.d.ts +99 -0
  166. package/types/core/migration/dialects/mongo.d.ts +89 -0
  167. package/types/core/migration/dialects/postgres.d.ts +117 -0
  168. package/types/core/migration/dialects/sqlite.d.ts +111 -0
  169. package/types/core/migration/differ.d.ts +47 -0
  170. package/types/core/migration/generate.d.ts +56 -0
  171. package/types/core/migration/journal.d.ts +52 -0
  172. package/types/core/migration/model-scan.d.ts +19 -0
  173. package/types/core/migration/mongo-migration-db.d.ts +7 -0
  174. package/types/core/migration/schema-builder.d.ts +197 -0
  175. package/types/core/migration/schema-validator.d.ts +20 -0
  176. package/types/core/migration-lock.d.ts +33 -0
  177. package/types/core/migration-runner.d.ts +101 -0
  178. package/types/core/multipart.d.ts +86 -0
  179. package/types/core/openapi.d.ts +62 -0
  180. package/types/core/pipeline.d.ts +93 -0
  181. package/types/core/router.d.ts +159 -0
  182. package/types/core/routes-loader.d.ts +21 -0
  183. package/types/core/scope-registry.d.ts +14 -0
  184. package/types/core/security.d.ts +77 -0
  185. package/types/core/services-loader.d.ts +27 -0
  186. package/types/core/session-cleanup-schedule.d.ts +19 -0
  187. package/types/core/session-store.d.ts +25 -0
  188. package/types/core/session.d.ts +77 -0
  189. package/types/core/static-assets.d.ts +73 -0
  190. package/types/core/template.d.ts +106 -0
  191. package/types/core/workers-manager.d.ts +79 -0
  192. package/types/core/ws-cluster.d.ts +208 -0
  193. package/types/core/ws-compression.d.ts +112 -0
  194. package/types/core/ws-controller.d.ts +65 -0
  195. package/types/core/ws-message.d.ts +106 -0
  196. package/types/core/ws-presence.d.ts +273 -0
  197. package/types/core/ws-roster.d.ts +108 -0
  198. package/types/core/ws-upgrade.d.ts +260 -0
  199. package/types/errors/config-error.d.ts +10 -0
  200. package/types/errors/http-errors.d.ts +120 -0
  201. package/types/errors/index.d.ts +3 -0
  202. package/types/errors/mega-error.d.ts +32 -0
  203. package/types/index.d.ts +39 -0
  204. package/types/lib/asp/config.d.ts +49 -0
  205. package/types/lib/asp/crypto.d.ts +43 -0
  206. package/types/lib/asp/errors.d.ts +30 -0
  207. package/types/lib/asp/nonce-cache.d.ts +52 -0
  208. package/types/lib/asp/plugin.d.ts +30 -0
  209. package/types/lib/asp/ws-terminator.d.ts +45 -0
  210. package/types/lib/env-mapper.d.ts +14 -0
  211. package/types/lib/hub-protocol.d.ts +106 -0
  212. package/types/lib/index.d.ts +22 -0
  213. package/types/lib/logger/telegram-core.d.ts +104 -0
  214. package/types/lib/logger/telegram-transport.d.ts +45 -0
  215. package/types/lib/mega-brute-force.d.ts +66 -0
  216. package/types/lib/mega-circuit-breaker.d.ts +243 -0
  217. package/types/lib/mega-cron.d.ts +66 -0
  218. package/types/lib/mega-hash.d.ts +32 -0
  219. package/types/lib/mega-health.d.ts +48 -0
  220. package/types/lib/mega-job-queue.d.ts +188 -0
  221. package/types/lib/mega-job-worker.d.ts +130 -0
  222. package/types/lib/mega-job.d.ts +145 -0
  223. package/types/lib/mega-logger.d.ts +45 -0
  224. package/types/lib/mega-metrics.d.ts +285 -0
  225. package/types/lib/mega-plugin.d.ts +245 -0
  226. package/types/lib/mega-retry.d.ts +85 -0
  227. package/types/lib/mega-schedule.d.ts +260 -0
  228. package/types/lib/mega-shutdown.d.ts +135 -0
  229. package/types/lib/mega-tracing.d.ts +224 -0
  230. package/types/lib/mega-worker.d.ts +129 -0
  231. package/types/lib/otel-resource.d.ts +16 -0
  232. package/types/lib/worker-runner/process-entry.d.ts +1 -0
  233. package/types/lib/worker-runner/task-dispatch.d.ts +28 -0
  234. package/types/lib/worker-runner/thread-entry.d.ts +1 -0
  235. package/types/lib/ws-hub.d.ts +259 -0
  236. package/types/models/crud-sql-builder.d.ts +48 -0
  237. package/types/models/index.d.ts +1 -0
  238. package/types/models/mega-model.d.ts +138 -0
  239. package/types/models/model-crud.d.ts +82 -0
  240. package/types/models/mongo-crud.d.ts +59 -0
  241. package/types/test/index.d.ts +84 -0
  242. package/.env +0 -127
  243. package/sample/crud/apps/main/migrations/20260606000002-add-auth-to-users.js +0 -30
  244. package/sample/crud/apps/main/models/note.js +0 -71
  245. package/sample/crud/apps/main/models/user.js +0 -86
  246. package/sample/crud/package-lock.json +0 -5665
  247. package/sample/crud/yarn.lock +0 -2142
  248. package/sample/simple/package-lock.json +0 -1851
@@ -0,0 +1,260 @@
1
+ /**
2
+ * ์Šค์ผ€์ค„ ๋ถ„์‚ฐ ๋ฝ ์„ค์ •. **lock ๋„๋ฉ”์ธ์€ cache ์™€ ๋ณ„๊ฐœ**(ADR-113) โ€” `ctx.lock(alias)`.
3
+ *
4
+ * @typedef {Object} MegaScheduleLock
5
+ * @property {string} lock - lock ์–ด๋Œ‘ํ„ฐ ๋ณ„๋ช…(`ctx.lock(alias)` ๋กœ ํ•ด์„). 03-api-spec ์˜ ์˜› `cache` ํ•„๋“œ๋ฅผ
6
+ * ๋Œ€์ฒดํ•œ๋‹ค(lock ์ด ๋…๋ฆฝ ๋„๋ฉ”์ธ์ด ๋œ ๋’ค ์ •ํ•ฉ โ€” ADR-118).
7
+ * @property {number} ttl - ๋ฝ ๋ณด์œ  ์‹œ๊ฐ„(**๋ฐ€๋ฆฌ์ดˆ**, ์–‘์˜ ์ •์ˆ˜). ์ž„๊ณ„๊ตฌ์—ญ ๋™์•ˆ **์ž๋™ ์—ฐ์žฅ**๋˜๋ฏ€๋กœ
8
+ * (redlock `using`) ์ž‘์—…์ด ttl ์„ ๋„˜๊ฒจ๋„ ์ค‘๋ณต ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค โ€” ttl ์€ "์—ฐ์žฅ 1ํšŒ๋ถ„ ์œˆ๋„์šฐ"๋‹ค.
9
+ * โš ๏ธ redlock ์€ `ttl โ‰ฅ automaticExtensionThreshold(๊ธฐ๋ณธ 500ms) + 100ms` ๋ฅผ ์š”๊ตฌํ•œ๋‹ค(๊ธฐ๋ณธ ์„ค์ • ๊ธฐ์ค€
10
+ * **600ms ์ด์ƒ**) โ€” ๋ฏธ๋‹ฌ์ด๋ฉด fire ์‹œ skip(error ๋™๋ด‰)์œผ๋กœ ํ‘œ๋ฉดํ™”๋œ๋‹ค.
11
+ * @property {string} [key] - ๋ฝ ์ž์› ํ‚ค. ๋ฏธ์ง€์ • ์‹œ `mega:schedule:<ํด๋ž˜์Šค๋ช…>`.
12
+ */
13
+ /**
14
+ * ์Šค์ผ€์ค„ ์ž‘์—… ๋ฒ ์ด์Šค ํด๋ž˜์Šค. ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ static ์„ค์ •๊ณผ `run(ctx)` ๋ฅผ ์ •์˜ํ•œ๋‹ค.
15
+ *
16
+ * @example
17
+ * export class DailyCleanup extends MegaSchedule {
18
+ * static cron = '0 3 * * *'
19
+ * static timezone = 'Asia/Seoul'
20
+ * static lock = { lock: 'main', ttl: 60_000 } // ๋ถ„์‚ฐ ์ค‘๋ณต๋ฐฉ์ง€ (ms!)
21
+ * async run(ctx) {
22
+ * await ctx.db('main').native.query('DELETE FROM tmp WHERE ...')
23
+ * }
24
+ * }
25
+ */
26
+ export class MegaSchedule {
27
+ /** @type {string|undefined} cron ํ‘œํ˜„์‹(ํ•„์ˆ˜ โ€” ๋ฏธ์ •์˜ ์‹œ register ์—์„œ throw). */
28
+ static cron: string | undefined;
29
+ /** @type {string|undefined} IANA ํƒ€์ž„์กด(์˜ˆ: 'Asia/Seoul'). ๋ฏธ์ง€์ • ์‹œ ํ˜ธ์ŠคํŠธ ๋กœ์ปฌ. */
30
+ static timezone: string | undefined;
31
+ /** @type {MegaScheduleLock|undefined} ๋ถ„์‚ฐ ์ค‘๋ณต๋ฐฉ์ง€ ๋ฝ ์„ค์ •. ๋ฏธ์ง€์ • ์‹œ ์ค‘๋ณต๋ฐฉ์ง€ ์—†์ด ์‹คํ–‰. */
32
+ static lock: MegaScheduleLock | undefined;
33
+ /**
34
+ * ์Šค์ผ€์ค„ ์‹œ๊ฐ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ณธ๋ฌธ. ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ **๋ฐ˜๋“œ์‹œ** ๊ตฌํ˜„ํ•œ๋‹ค.
35
+ * @param {Record<string, any>} _ctx - ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(`db/cache/bus/lock` ์ ‘๊ทผ์ž ๋“ฑ, ctx-builder ์ฐธ์กฐ).
36
+ * @returns {Promise<any>}
37
+ * @throws {Error} ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด.
38
+ */
39
+ run(_ctx: Record<string, any>): Promise<any>;
40
+ }
41
+ /**
42
+ * @typedef {Object} MegaScheduleFireResult - {@link MegaScheduler#runNow} / ๋‚ด๋ถ€ fire ์˜ ๊ฒฐ๊ณผ.
43
+ * @property {string} name - ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ช….
44
+ * @property {boolean} ran - ์‹ค์ œ๋กœ run(ctx) ๊ฐ€ ํ˜ธ์ถœ๋๋Š”์ง€(skip ์ด๋ฉด false).
45
+ * @property {boolean} skipped - ๋ฝ ๋ฏธํš๋“์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋Š”์ง€.
46
+ * @property {boolean} ok - run(ctx) ๊ฐ€ ์—๋Ÿฌ ์—†์ด ๋๋‚ฌ๋Š”์ง€(skip ์ด๋ฉด false).
47
+ * @property {any} [result] - run(ctx) ๋ฐ˜ํ™˜๊ฐ’(์„ฑ๊ณต ์‹œ).
48
+ * @property {Error} [error] - ์‹คํŒจ/skip ์‚ฌ์œ .
49
+ */
50
+ /**
51
+ * @typedef {Object} ScheduleEntry - ๋“ฑ๋ก๋œ ์Šค์ผ€์ค„ 1๊ฑด์˜ ๋‚ด๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ.
52
+ * @property {string} name - ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ช…(= ๋“ฑ๋ก ํ‚ค).
53
+ * @property {typeof MegaSchedule} ScheduleClass - ๋“ฑ๋ก๋œ ํด๋ž˜์Šค.
54
+ * @property {MegaSchedule} instance - ์ธ์Šคํ„ด์Šค(run ํ˜ธ์ถœ ๋Œ€์ƒ).
55
+ * @property {string} cron - cron ํ‘œํ˜„์‹.
56
+ * @property {string|undefined} timezone - IANA ํƒ€์ž„์กด.
57
+ * @property {MegaScheduleLock|undefined} lock - ๋ถ„์‚ฐ ๋ฝ ์„ค์ •.
58
+ * @property {Cron|null} job - start() ๊ฐ€ ๋งŒ๋“  croner ํ•ธ๋“ค(๋ฏธ start ๋ฉด null).
59
+ */
60
+ /**
61
+ * ๋“ฑ๋ก๋œ ์Šค์ผ€์ค„๋“ค์„ cron ์‹œ๊ฐ์— ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐํƒ€์ž„. ์‹œ๊ฐ/ํƒ€์ด๋จธ๋Š” croner, ๋ถ„์‚ฐ ์ค‘๋ณต๋ฐฉ์ง€๋Š” lock ์–ด๋Œ‘ํ„ฐ์— ์œ„์ž„.
62
+ *
63
+ * @example
64
+ * const scheduler = new MegaScheduler({ ctx }) // ctx ๋Š” lock ์‚ฌ์šฉ ์‹œ ctx.lock(alias) ํ•„์š”
65
+ * scheduler.on('skip', (e) => log.debug(e, 'schedule skipped'))
66
+ * scheduler.on('fail', (e) => log.error(e, 'schedule failed'))
67
+ * scheduler.register(DailyCleanup).start()
68
+ * // graceful shutdown
69
+ * scheduler.stop()
70
+ */
71
+ export class MegaScheduler extends EventEmitter<any> {
72
+ /**
73
+ * @param {object} [args]
74
+ * @param {Record<string, any>} [args.ctx] - ์‹คํ–‰ ์ปจํ…์ŠคํŠธ. ์Šค์ผ€์ค„์ด `static lock` ์„ ์“ฐ๋ฉด `ctx.lock`
75
+ * (ํ•จ์ˆ˜)์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค(์—†์œผ๋ฉด fire ์‹œ throw). lock ๋ฏธ์‚ฌ์šฉ์ด๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ.
76
+ */
77
+ constructor({ ctx }?: {
78
+ ctx?: Record<string, any>;
79
+ });
80
+ /**
81
+ * ์ด๋ฒคํŠธ ๊ตฌ๋…. ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์€ ์˜คํƒ€๋กœ ๋ณด๊ณ  throw(MegaCircuitBreaker ์™€ ๋™์ผ).
82
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
83
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
84
+ */
85
+ on(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
86
+ /**
87
+ * {@link MegaScheduler#on} ์œผ๋กœ ๋“ฑ๋กํ•œ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ. ๋™์ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ. (`removeListener` ๋ณ„์นญ๋„ ๋ณดํ˜ธ.)
88
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
89
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
90
+ */
91
+ off(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
92
+ /**
93
+ * 1ํšŒ์„ฑ ๊ตฌ๋…(EventEmitter `once`). on() ๊ณผ ๋™์ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ(L-1).
94
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
95
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
96
+ */
97
+ once(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
98
+ /**
99
+ * `on` ์˜ EventEmitter ๋ณ„์นญ. ์šฐํšŒ๋กœ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋ฅผ ๋น„๊ปด๊ฐ€์ง€ ์•Š๋„๋ก ๋™์ผ ๊ฒ€์ฆ(L-1).
100
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
101
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
102
+ */
103
+ addListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
104
+ /**
105
+ * `off` ์˜ EventEmitter ๋ณ„์นญ. ๋™์ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ(L-1).
106
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
107
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
108
+ */
109
+ removeListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
110
+ /**
111
+ * ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ ์•ž์— ์ถ”๊ฐ€(EventEmitter `prependListener`). ๋™์ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ(L-1).
112
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
113
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
114
+ */
115
+ prependListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
116
+ /**
117
+ * 1ํšŒ์„ฑ ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ ์•ž์— ์ถ”๊ฐ€(EventEmitter `prependOnceListener`). ๋™์ผ ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ(L-1).
118
+ * @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
119
+ * @throws {RangeError} ์•Œ ์ˆ˜ ์—†๋Š” ์ด๋ฒคํŠธ๋ช…์ผ ๋•Œ.
120
+ */
121
+ prependOnceListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
122
+ /**
123
+ * ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•œ๋‹ค(์•„์ง ์‹คํ–‰ ์•ˆ ํ•จ โ€” {@link MegaScheduler#start} ๊ฐ€ ํƒ€์ด๋จธ๋ฅผ ๊ฑด๋‹ค).
124
+ * cron ํ‘œํ˜„์‹ยทlock ์„ค์ •์„ ์ฆ‰์‹œ ๊ฒ€์ฆํ•ด ์ž˜๋ชป๋œ ๋“ฑ๋ก์€ ๋ถ€ํŒ… ์‹œ์ ์— ๋“œ๋Ÿฌ๋‚ธ๋‹ค(์ถ”์ธก ์ง„ํ–‰ ๊ธˆ์ง€).
125
+ *
126
+ * @param {typeof MegaSchedule} ScheduleClass - `MegaSchedule` ๋ฅผ ์ƒ์†ํ•œ ํด๋ž˜์Šค.
127
+ * @returns {this} ์ฒด์ด๋‹์šฉ.
128
+ * @throws {TypeError} MegaSchedule ์„œ๋ธŒํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ cron ์ด ๋น„์—ˆ์„ ๋•Œ.
129
+ * @throws {Error} cron ํ‘œํ˜„์‹ ๋ฌดํšจ, ์ด๋ฆ„ ์ค‘๋ณต, lock ์„ค์ • ํ˜•์‹ ์˜ค๋ฅ˜ ์‹œ.
130
+ */
131
+ register(ScheduleClass: typeof MegaSchedule): this;
132
+ /**
133
+ * ๋“ฑ๋ก๋œ ๋ชจ๋“  ์Šค์ผ€์ค„์— croner ํƒ€์ด๋จธ๋ฅผ ๊ฑธ์–ด cron ์‹œ๊ฐ๋งˆ๋‹ค ์ž๋™ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋ฏธ start ๋œ ์Šค์ผ€์ค„์€ ๊ฑด๋„ˆ๋›ด๋‹ค.
134
+ *
135
+ * croner ์˜ต์…˜: `protect`(๊ฐ™์€ ์ธ์Šคํ„ด์Šค์—์„œ ์ด์ „ ์‹คํ–‰์ด ์•ˆ ๋๋‚ฌ์œผ๋ฉด ์ƒˆ ํŠธ๋ฆฌ๊ฑฐ ์ฐจ๋‹จ โ€” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค overrun
136
+ * ๋ฐฉ์ง€), `unref`(ํƒ€์ด๋จธ๊ฐ€ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ๋ง‰์ง€ ์•Š์Œ โ€” graceful/ํ…Œ์ŠคํŠธ), `catch`(ํƒ€์ด๋จธ ์ฝœ๋ฐฑ์˜ ๋ฏธ์ฒ˜๋ฆฌ
137
+ * ์—๋Ÿฌ๋ฅผ `fail` ์ด๋ฒคํŠธ๋กœ ๋ผ์šฐํŒ… โ€” unhandled rejection ๋ฐฉ์ง€).
138
+ *
139
+ * @returns {this} ์ฒด์ด๋‹์šฉ.
140
+ */
141
+ start(): this;
142
+ /**
143
+ * ๋ชจ๋“  ์Šค์ผ€์ค„ ํƒ€์ด๋จธ๋ฅผ ์˜๊ตฌ ์ค‘๋‹จํ•œ๋‹ค(graceful shutdown ํ•„์ˆ˜ โ€” ์•ˆ ๋ถ€๋ฅด๋ฉด ํƒ€์ด๋จธ๊ฐ€ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ
144
+ * ๋Šฆ์ถœ ์ˆ˜ ์žˆ๋‹ค). croner `stop()` ํ›„์—” ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ resume ํ•  ์ˆ˜ ์—†์–ด, job ํ•ธ๋“ค์„ ๋น„์šฐ๊ณ  ์žฌ start ์‹œ
145
+ * ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ run(ctx) ์€ ์ค‘๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค(์™„๋ฃŒ๊นŒ์ง€ ๋Œ€๊ธฐ๋Š” ํ˜ธ์ถœ๋ถ€ ์ฑ…์ž„).
146
+ * @returns {this} ์ฒด์ด๋‹์šฉ.
147
+ */
148
+ stop(): this;
149
+ /**
150
+ * ์Šค์ผ€์ค„์„ **์ง€๊ธˆ ์ฆ‰์‹œ** ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค(cron ์‹œ๊ฐ ๋ฌด์‹œ). ๋ถ„์‚ฐ ์ค‘๋ณต๋ฐฉ์ง€ ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค โ€”
151
+ * ํ…Œ์ŠคํŠธยท์šด์˜ ์ˆ˜๋™ ํŠธ๋ฆฌ๊ฑฐยทCLI ์šฉ.
152
+ *
153
+ * โš ๏ธ overlap: lock ๋ฏธ์‚ฌ์šฉ ์Šค์ผ€์ค„์€ `runNow` ํ˜ธ์ถœ ์‹œ croner ์˜ ์ž๋™ ํŠธ๋ฆฌ๊ฑฐ์™€ **๋™์ผ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ
154
+ * overlap** ํ•  ์ˆ˜ ์žˆ๋‹ค(croner `protect` ๋Š” ํƒ€์ด๋จธ ํŠธ๋ฆฌ๊ฑฐ๋ผ๋ฆฌ๋งŒ ๋ง‰๊ณ  ์ˆ˜๋™ `runNow` ๋Š” ๋ง‰์ง€ ์•Š๋Š”๋‹ค).
155
+ * ๋ถ„์‚ฐ/๋™์ผํ”„๋กœ์„ธ์Šค ์ค‘๋ณต๋ฐฉ์ง€๊ฐ€ ํ•„์š”ํ•œ ์ž‘์—…์€ `static lock` ์„ ์„ ์–ธํ•˜๋ผ(L-2).
156
+ * @param {string} name - ๋“ฑ๋ก๋œ ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ช….
157
+ * @returns {Promise<MegaScheduleFireResult>}
158
+ * @throws {Error} ๋“ฑ๋ก๋˜์ง€ ์•Š์€ name ์ผ ๋•Œ.
159
+ */
160
+ runNow(name: string): Promise<MegaScheduleFireResult>;
161
+ /**
162
+ * ๋“ฑ๋ก๋œ ์Šค์ผ€์ค„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชฉ๋ก. ๋ชจ๋‹ˆํ„ฐ๋ง/CLI ์šฉ.
163
+ * @returns {Array<{ name: string, cron: string, timezone: string|undefined, hasLock: boolean, nextRun: Date }>}
164
+ */
165
+ list(): Array<{
166
+ name: string;
167
+ cron: string;
168
+ timezone: string | undefined;
169
+ hasLock: boolean;
170
+ nextRun: Date;
171
+ }>;
172
+ /** @returns {boolean} start() ๋œ ์ƒํƒœ๋ฉด true. */
173
+ get isStarted(): boolean;
174
+ #private;
175
+ }
176
+ /**
177
+ * ์Šค์ผ€์ค„ ๋ถ„์‚ฐ ๋ฝ ์„ค์ •. **lock ๋„๋ฉ”์ธ์€ cache ์™€ ๋ณ„๊ฐœ**(ADR-113) โ€” `ctx.lock(alias)`.
178
+ */
179
+ export type MegaScheduleLock = {
180
+ /**
181
+ * - lock ์–ด๋Œ‘ํ„ฐ ๋ณ„๋ช…(`ctx.lock(alias)` ๋กœ ํ•ด์„). 03-api-spec ์˜ ์˜› `cache` ํ•„๋“œ๋ฅผ
182
+ * ๋Œ€์ฒดํ•œ๋‹ค(lock ์ด ๋…๋ฆฝ ๋„๋ฉ”์ธ์ด ๋œ ๋’ค ์ •ํ•ฉ โ€” ADR-118).
183
+ */
184
+ lock: string;
185
+ /**
186
+ * - ๋ฝ ๋ณด์œ  ์‹œ๊ฐ„(**๋ฐ€๋ฆฌ์ดˆ**, ์–‘์˜ ์ •์ˆ˜). ์ž„๊ณ„๊ตฌ์—ญ ๋™์•ˆ **์ž๋™ ์—ฐ์žฅ**๋˜๋ฏ€๋กœ
187
+ * (redlock `using`) ์ž‘์—…์ด ttl ์„ ๋„˜๊ฒจ๋„ ์ค‘๋ณต ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค โ€” ttl ์€ "์—ฐ์žฅ 1ํšŒ๋ถ„ ์œˆ๋„์šฐ"๋‹ค.
188
+ * โš ๏ธ redlock ์€ `ttl โ‰ฅ automaticExtensionThreshold(๊ธฐ๋ณธ 500ms) + 100ms` ๋ฅผ ์š”๊ตฌํ•œ๋‹ค(๊ธฐ๋ณธ ์„ค์ • ๊ธฐ์ค€
189
+ * **600ms ์ด์ƒ**) โ€” ๋ฏธ๋‹ฌ์ด๋ฉด fire ์‹œ skip(error ๋™๋ด‰)์œผ๋กœ ํ‘œ๋ฉดํ™”๋œ๋‹ค.
190
+ */
191
+ ttl: number;
192
+ /**
193
+ * - ๋ฝ ์ž์› ํ‚ค. ๋ฏธ์ง€์ • ์‹œ `mega:schedule:<ํด๋ž˜์Šค๋ช…>`.
194
+ */
195
+ key?: string;
196
+ };
197
+ /**
198
+ * - {@link MegaScheduler#runNow} / ๋‚ด๋ถ€ fire ์˜ ๊ฒฐ๊ณผ.
199
+ */
200
+ export type MegaScheduleFireResult = {
201
+ /**
202
+ * - ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ช….
203
+ */
204
+ name: string;
205
+ /**
206
+ * - ์‹ค์ œ๋กœ run(ctx) ๊ฐ€ ํ˜ธ์ถœ๋๋Š”์ง€(skip ์ด๋ฉด false).
207
+ */
208
+ ran: boolean;
209
+ /**
210
+ * - ๋ฝ ๋ฏธํš๋“์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ์—ˆ๋Š”์ง€.
211
+ */
212
+ skipped: boolean;
213
+ /**
214
+ * - run(ctx) ๊ฐ€ ์—๋Ÿฌ ์—†์ด ๋๋‚ฌ๋Š”์ง€(skip ์ด๋ฉด false).
215
+ */
216
+ ok: boolean;
217
+ /**
218
+ * - run(ctx) ๋ฐ˜ํ™˜๊ฐ’(์„ฑ๊ณต ์‹œ).
219
+ */
220
+ result?: any;
221
+ /**
222
+ * - ์‹คํŒจ/skip ์‚ฌ์œ .
223
+ */
224
+ error?: Error;
225
+ };
226
+ /**
227
+ * - ๋“ฑ๋ก๋œ ์Šค์ผ€์ค„ 1๊ฑด์˜ ๋‚ด๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ.
228
+ */
229
+ export type ScheduleEntry = {
230
+ /**
231
+ * - ์Šค์ผ€์ค„ ํด๋ž˜์Šค๋ช…(= ๋“ฑ๋ก ํ‚ค).
232
+ */
233
+ name: string;
234
+ /**
235
+ * - ๋“ฑ๋ก๋œ ํด๋ž˜์Šค.
236
+ */
237
+ ScheduleClass: typeof MegaSchedule;
238
+ /**
239
+ * - ์ธ์Šคํ„ด์Šค(run ํ˜ธ์ถœ ๋Œ€์ƒ).
240
+ */
241
+ instance: MegaSchedule;
242
+ /**
243
+ * - cron ํ‘œํ˜„์‹.
244
+ */
245
+ cron: string;
246
+ /**
247
+ * - IANA ํƒ€์ž„์กด.
248
+ */
249
+ timezone: string | undefined;
250
+ /**
251
+ * - ๋ถ„์‚ฐ ๋ฝ ์„ค์ •.
252
+ */
253
+ lock: MegaScheduleLock | undefined;
254
+ /**
255
+ * - start() ๊ฐ€ ๋งŒ๋“  croner ํ•ธ๋“ค(๋ฏธ start ๋ฉด null).
256
+ */
257
+ job: Cron | null;
258
+ };
259
+ import { EventEmitter } from 'node:events';
260
+ import { Cron } from 'croner';
@@ -0,0 +1,135 @@
1
+ /**
2
+ * MegaShutdown โ€” graceful shutdown ์‹œํ€€์Šค + ์‚ฌ์šฉ์ž cleanup hook ๋ฌถ์Œ.
3
+ *
4
+ * ์‹œํ€€์Šค (docs/10 ยง3) โ€” ๋ช…์‹œ stage ๋กœ ์ฝ”๋“œํ™”({@link SHUTDOWN_STAGES}):
5
+ * Running โ†’ [server โ†’ jobs โ†’ app โ†’ workers โ†’ adapters โ†’ telemetry โ†’ logs] โ†’ Exited (process.exit)
6
+ *
7
+ * SIGTERM/SIGINT ์บ์น˜ + stage ์ˆœ์„œ ์‹คํ–‰(stage ์•ˆ์€ ๋“ฑ๋ก ์—ญ์ˆœ LIFO) + hook ๋ณ„ grace + hardKill ๋ฐ๋“œ๋ผ์ธ.
8
+ * readiness 503 ์ „ํ™˜(DrainingReady)์€ isShuttingDown() ์„ MegaHealth.checkAll ์ด ์ฝ์–ด ์ฆ‰์‹œ ๋ฐ˜์˜๋œ๋‹ค.
9
+ *
10
+ * API ๋Š” docs/10ยท07 ์‹œํ€€์Šค์— ๋งž์ถฐ `MegaShutdown` ๊ฐ์ฒด๋กœ ํ†ต์ผ (ADR โ€” M-4).
11
+ *
12
+ * ์‚ฌ์šฉ ์˜ˆ:
13
+ * MegaShutdown.register('my-queue', async () => consumer.stop()) // ๊ธฐ๋ณธ stage 'app'
14
+ * MegaShutdown.register('db', async () => pool.end(), { stage: 'adapters' }) // ๋ช…์‹œ stage
15
+ * MegaShutdown.setupSignals({ gracePeriodMs: 30_000, hardKillMs: 60_000 })
16
+ * await MegaShutdown.now() // ์ˆ˜๋™ ํŠธ๋ฆฌ๊ฑฐ
17
+ */
18
+ /**
19
+ * ์ข…๋ฃŒ stage ์ •๋ณธ ์ˆœ์„œ (docs/10 ยง3 ์˜ ๋‹จ๊ณ„๋ฅผ ์ฝ”๋“œ๋กœ ๋ช…์‹œ) โ€” `register(name, fn, { stage })` ๊ฐ€ ์ด ์ค‘
20
+ * ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•˜๊ณ , `now()` ๋Š” ์ด ๋ฐฐ์—ด ์ˆœ์„œ๋Œ€๋กœ stage ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค(stage ์•ˆ์—์„œ๋Š” ๋“ฑ๋ก ์—ญ์ˆœ LIFO).
21
+ *
22
+ * server โ€” HTTP/WS ์ˆ˜์šฉ ์ข…๋ฃŒ(์„œ๋ฒ„ close, ์ง„ํ–‰ ์ค‘ ์š”์ฒญ drain). ClosingHttp/ClosingWs.
23
+ * jobs โ€” ์žก ์ปจ์Šˆ๋จธยท์Šค์ผ€์ค„๋Ÿฌ ์ •์ง€(์ƒˆ ์žก ์ˆ˜์‹  ์ค‘๋‹จ, ์ง„ํ–‰ ์ค‘ ์žก ์™„๋ฃŒ). ClosingJobs/ClosingScheduler.
24
+ * app โ€” ์•ฑ ๋ ˆ๋ฒจ ์ •๋ฆฌ(ํ”Œ๋Ÿฌ๊ทธ์ธ beforeShutdownยท์„ธ์…˜ storeยทWS cluster/roster ๋“ฑ ์–ด๋Œ‘ํ„ฐ๋ฅผ **์“ฐ๋Š”** ์ •๋ฆฌ).
25
+ * `stage` ๋ฏธ์ง€์ • ๊ธฐ๋ณธ๊ฐ’ โ€” ์‚ฌ์šฉ์ž cleanup ์€ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์‚ด์•„ ์žˆ๋Š” ์ด ๋‹จ๊ณ„์—์„œ ๋ˆ๋‹ค.
26
+ * workers โ€” CPU ์›Œ์ปค ํ’€ยทembedded wsHub ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰๊ธฐ ์ •์ง€.
27
+ * adapters โ€” ๊ณต์œ  ์–ด๋Œ‘ํ„ฐ disconnect(DisconnectingAdapters, stage ์•ˆ LIFO = connect ์—ญ์ˆœ).
28
+ * telemetry โ€” ๋ฉ”ํŠธ๋ฆญยทํŠธ๋ ˆ์ด์‹ฑ SDK flush/shutdown. ์–ด๋Œ‘ํ„ฐ **๋’ค** โ€” disconnect ๊นŒ์ง€์˜ span/๋ฉ”ํŠธ๋ฆญ์„ ๋‚ด๋ณด๋‚ธ๋‹ค.
29
+ * logs โ€” ๋กœ๊ฑฐ flush(FlushingLogs). ํ•ญ์ƒ ๋งˆ์ง€๋ง‰ โ€” ์ข…๋ฃŒ ์‹œํ€€์Šค ์ž์ฒด์˜ ๋กœ๊ทธ๊ฐ€ ์œ ์‹ค๋˜์ง€ ์•Š๊ฒŒ.
30
+ */
31
+ export const SHUTDOWN_STAGES: readonly string[];
32
+ /** hook 1๊ฐœ๋‹น grace ๊ธฐ๋ณธ๊ฐ’(ms) โ€” 30์ดˆ. `setupSignals({ gracePeriodMs })` ๋กœ ์กฐ์ •. */
33
+ export const DEFAULT_GRACE_PERIOD_MS: 30000;
34
+ /**
35
+ * graceful shutdown ์ „์ฒด ์ƒํ•œ ๊ธฐ๋ณธ๊ฐ’(ms) โ€” 60์ดˆ. ์ดˆ๊ณผ ์‹œ hardKill(exit 1). ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์˜ˆ์‚ฐ
36
+ * ์ƒํ•œ์ด๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ๋งˆ์Šคํ„ฐ์˜ grace(`MegaCluster.gracePeriodMs`)๋Š” **์ด ๊ฐ’ + ๋งˆ์ง„ ์ด์ƒ**์ด์–ด์•ผ
37
+ * ์›Œ์ปค๊ฐ€ drain ์„ ๋๋‚ด๊ธฐ ์ „์— ๋งˆ์Šคํ„ฐ๊ฐ€ SIGKILL ํ•˜๋Š” ์˜ˆ์‚ฐ ์—ญ์ „์ด ์—†๋‹ค(CLI ๊ฐ€ ์ด ์ƒ์ˆ˜๋กœ ์œ„๊ณ„ํ™”).
38
+ */
39
+ export const DEFAULT_HARD_KILL_MS: 60000;
40
+ export namespace MegaShutdown {
41
+ export { SHUTDOWN_STAGES as STAGES };
42
+ export { register };
43
+ export { unregister };
44
+ export { isShuttingDown };
45
+ export { setupSignals };
46
+ export { setupGlobalErrorHandlers };
47
+ export { setLogger };
48
+ export { now };
49
+ export { registeredCount };
50
+ export { _reset };
51
+ }
52
+ /**
53
+ * ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ fatal ๋กœ๊ทธ์— ์“ธ ๋กœ๊ฑฐ. boot ์ด pino ๊ณต์œ  ์ธ์Šคํ„ด์Šค(appLogger)๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค(setLogger).
54
+ * ๋ฏธ์„ค์ •(๋ถ€ํŒ… ์ „ ์กฐ๊ธฐ ํฌ๋ž˜์‹œยท๋กœ๊ฑฐ ๋น„ํ™œ์„ฑ ํ”„๋กœ์„ธ์Šค)์ด๋ฉด console.error ๋กœ ํด๋ฐฑํ•œ๋‹ค. process ๋ ˆ๋ฒจ ํ•ธ๋“ค๋Ÿฌ๋Š”
55
+ * bootApp ์˜ DI ๊ทธ๋ž˜ํ”„ ๋ฐ–์ด๋ผ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๋‘”๋‹ค(์ „์—ญ ์˜ค์—ผ ํšŒํ”ผ, ADR-178).
56
+ */
57
+ export type ShutdownLogger = {
58
+ info?: (...args: any[]) => void;
59
+ warn?: (...args: any[]) => void;
60
+ error?: (...args: any[]) => void;
61
+ fatal?: (...args: any[]) => void;
62
+ };
63
+ /**
64
+ * cleanup hook ๋“ฑ๋ก. ์‹คํ–‰ ์ˆœ์„œ = {@link SHUTDOWN_STAGES} ์ˆœ์„œ โ†’ ๊ฐ™์€ stage ์•ˆ์—์„œ๋Š” ๋“ฑ๋ก ์—ญ์ˆœ(LIFO).
65
+ * `stage` ๋ฏธ์ง€์ •์ด๋ฉด `'app'`(์–ด๋Œ‘ํ„ฐ ์ข…๋ฃŒ ์ „, ์‚ฌ์šฉ์ž cleanup ํ‘œ์ค€ ์œ„์น˜) โ€” ๊ธฐ์กด 2-์ธ์ž ํ˜ธ์ถœ๊ณผ ํ˜ธํ™˜.
66
+ * @param {string} name - ์‹๋ณ„์ž (๋กœ๊ทธยทunregister ์šฉ)
67
+ * @param {() => Promise<void> | void} fn
68
+ * @param {{ stage?: string }} [opts] - ์ข…๋ฃŒ stage({@link SHUTDOWN_STAGES} ์ค‘ ํ•˜๋‚˜).
69
+ */
70
+ declare function register(name: string, fn: () => Promise<void> | void, opts?: {
71
+ stage?: string;
72
+ }): void;
73
+ /**
74
+ * ๋“ฑ๋ก๋œ cleanup hook ์ œ๊ฑฐ (๊ฐ™์€ name ์ „๋ถ€). ๋Ÿฐํƒ€์ž„ ์ค‘ ๋™์ ์œผ๋กœ ๋ถ™์˜€๋‹ค ๋–ผ๋Š” hook(์˜ˆ: hub link)
75
+ * ์˜ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰๋Š”๋‹ค(L1). shutdown ์ง„ํ–‰ ์ค‘์—๋Š” ์‹คํ–‰ ์ถ”์ (exitedHandlers)๊ณผ ์ถฉ๋Œํ•˜๋ฏ€๋กœ ๋ฌด์‹œํ•œ๋‹ค.
76
+ * @param {string} name - register ์‹œ ์“ด ์‹๋ณ„์ž.
77
+ * @returns {number} ์ œ๊ฑฐ๋œ hook ์ˆ˜.
78
+ */
79
+ declare function unregister(name: string): number;
80
+ /**
81
+ * ํ˜„์žฌ shutdown ์ง„ํ–‰ ์ค‘์ธ์ง€.
82
+ * @returns {boolean}
83
+ */
84
+ declare function isShuttingDown(): boolean;
85
+ /**
86
+ * SIGTERM/SIGINT ์‹œ๊ทธ๋„ ๋“ฑ๋ก (ํ•œ ๋ฒˆ๋งŒ ๋“ฑ๋ก๋จ). ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ(unhandledRejection/uncaughtException)๋„
87
+ * ๊ธฐ๋ณธ ๋“ฑ๋กํ•œ๋‹ค โ€” `globalErrorHandlers: false` ๋กœ ๋Œ ์ˆ˜ ์žˆ๋‹ค(REPL ๋“ฑ).
88
+ * @param {{ gracePeriodMs?: number, hardKillMs?: number, signals?: string[], globalErrorHandlers?: boolean }} [opts]
89
+ */
90
+ declare function setupSignals(opts?: {
91
+ gracePeriodMs?: number;
92
+ hardKillMs?: number;
93
+ signals?: string[];
94
+ globalErrorHandlers?: boolean;
95
+ }): void;
96
+ /**
97
+ * ์ „์—ญ `unhandledRejection`/`uncaughtException` ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก (ADR-178, ๋ฉฑ๋“ฑ). floating promise reject ๋‚˜
98
+ * ๋ฏธ์ฒ˜๋ฆฌ ์˜ˆ์™ธ๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ **graceful ์—†์ด ์ฆ‰์‚ฌ**(์–ด๋Œ‘ํ„ฐ disconnectยท๋“œ๋ ˆ์ธ ๋ฏธ์‹คํ–‰ โ†’ ์ปค๋„ฅ์…˜/๋ฝ ๋ˆ„์ˆ˜, ์ง„ํ–‰ ์ค‘
99
+ * ์žก ์œ ์‹ค)ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค. ๋‘˜ ๋‹ค fatal ๋กœ๊น… ํ›„ graceful shutdown(exit 1)์„ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค โ€” uncaughtException
100
+ * ์ดํ›„์˜ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋Š” ์‹ ๋ขฐ ๋ถˆ๊ฐ€๋ผ ๋ณต๊ตฌํ•˜์ง€ ์•Š๊ณ  ์ •๋ฆฌ ํ›„ ์ข…๋ฃŒ๊ฐ€ ํ‘œ์ค€.
101
+ * @param {{ exitCode?: number }} [opts]
102
+ * @returns {void}
103
+ */
104
+ declare function setupGlobalErrorHandlers({ exitCode }?: {
105
+ exitCode?: number;
106
+ }): void;
107
+ /**
108
+ * ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ(unhandledRejection/uncaughtException)๊ฐ€ fatal ๋กœ๊ทธ์— ์“ธ ๋กœ๊ฑฐ๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค(ADR-178).
109
+ * boot ์ด pino ๊ณต์œ  ์ธ์Šคํ„ด์Šค(appLogger)๋ฅผ ๋งŒ๋“ค ๋•Œ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฏธํ˜ธ์ถœ์ด๋ฉด ํ•ธ๋“ค๋Ÿฌ๋Š” console.error ๋กœ ํด๋ฐฑํ•œ๋‹ค.
110
+ * @param {ShutdownLogger | null | undefined} logger - pino ํ˜ธํ™˜ ๋กœ๊ฑฐ(info/warn/error/fatal ์‚ฌ์šฉ) ๋˜๋Š” null.
111
+ * @returns {void}
112
+ */
113
+ declare function setLogger(logger: ShutdownLogger | null | undefined): void;
114
+ /**
115
+ * ์ฆ‰์‹œ graceful shutdown ํŠธ๋ฆฌ๊ฑฐ.
116
+ *
117
+ * ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ(์ด๋ฏธ shutdown ์ง„ํ–‰ ์ค‘)์€ "์‚ฌ์šฉ์ž๊ฐ€ ๋นจ๋ฆฌ ์ฃฝ์ด๊ณ  ์‹ถ๋‹ค" ๋Š” ์‹ ํ˜ธ๋กœ ๋ณด๊ณ 
118
+ * ์ฆ‰์‹œ ๊ฐ•์ œ ์ข…๋ฃŒํ•œ๋‹ค (docs/10 ยง3 Invariant โ€” M-3).
119
+ *
120
+ * @param {{ signal?: string, exitCode?: number }} [opts]
121
+ */
122
+ declare function now({ signal, exitCode }?: {
123
+ signal?: string;
124
+ exitCode?: number;
125
+ }): Promise<void>;
126
+ /**
127
+ * ํ…Œ์ŠคํŠธ์šฉ โ€” ๋“ฑ๋ก๋œ hook ์ˆ˜ (๋””๋ฒ„๊ทธ).
128
+ * @returns {number}
129
+ */
130
+ declare function registeredCount(): number;
131
+ /**
132
+ * ํ…Œ์ŠคํŠธ์šฉ โ€” ๋‚ด๋ถ€ ์ƒํƒœ reset (๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ๋งŒ ํ˜ธ์ถœ). ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ X.
133
+ */
134
+ declare function _reset(): void;
135
+ export {};
@@ -0,0 +1,224 @@
1
+ /**
2
+ * inbound ํ—ค๋”์˜ `traceparent`(/`tracestate`)๋ฅผ ๋ถ€๋ชจ OTel Context ๋กœ ๋ณต์›ํ•œ๋‹ค(ADR-196, W3C trace context).
3
+ *
4
+ * ๊ฒŒ์ดํŠธ์›จ์ด/์—…์ŠคํŠธ๋ฆผ์ด ๋ณด๋‚ธ trace ์— HTTP ๋ฃจํŠธ span ์„ ์ž‡๋Š” ์ž…๊ตฌ๋‹ค โ€” {@link enterHttpSpan} ์˜ `headers`
5
+ * ์˜ต์…˜์ด ์ด ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์นœ๋‹ค. ํ—ค๋”๊ฐ€ ์—†๊ฑฐ๋‚˜ ํ˜•์‹์ด ๋ฌดํšจ๋ฉด `undefined`(ํ˜ธ์ถœ๋ถ€๊ฐ€ ์ƒˆ ๋ฃจํŠธ๋กœ ์‹œ์ž‘ โ€” fail-safe,
6
+ * ์ž˜๋ชป๋œ ์™ธ๋ถ€ ์ž…๋ ฅ์ด ์ถ”์ ์„ ๊นจ์ง€ ์•Š๊ฒŒ). ์˜ตํŠธ์ธ OFF ๋ฉด `undefined`(0 ๋น„์šฉ).
7
+ *
8
+ * ๋น„์œจ ์ƒ˜ํ”Œ๋ง(`traceidratio`)์€ `ParentBasedSampler` ๋ผ ๋ณต์›๋œ ์›๊ฒฉ ๋ถ€๋ชจ์˜ sampled flag ๋ฅผ ๋”ฐ๋ฅธ๋‹ค โ€”
9
+ * ์—…์ŠคํŠธ๋ฆผ์ด ์ƒ˜ํ”Œํ•œ trace ๋Š” ์—ฌ๊ธฐ์„œ๋„ ๊ธฐ๋ก๋˜๊ณ , ๋ฒ„๋ฆฐ trace ๋Š” ์—ฌ๊ธฐ์„œ๋„ ๋ฒ„๋ ค์ ธ trace ๊ฐ€ ๋ฐ˜ํ† ๋ง‰ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
10
+ *
11
+ * @param {Record<string, string | string[] | undefined>} headers - `req.headers`(๋Œ€์†Œ๋ฌธ์ž ๋ฌด๊ด€ ํ‚ค).
12
+ * @returns {import('@opentelemetry/api').Context | undefined} ์œ ํšจํ•œ ์›๊ฒฉ ๋ถ€๋ชจ ์ปจํ…์ŠคํŠธ, ์—†์œผ๋ฉด undefined.
13
+ */
14
+ export function extractRemoteContext(headers: Record<string, string | string[] | undefined>): import("@opentelemetry/api").Context | undefined;
15
+ /**
16
+ * ํ˜„์žฌ ํ™œ์„ฑ span ์„ outbound ํ—ค๋”(`traceparent`/`tracestate`)๋กœ ์ง๋ ฌํ™”ํ•ด carrier ์— ์ฑ„์šด๋‹ค(ADR-196).
17
+ *
18
+ * ํ•˜๋ฅ˜ HTTP ํ˜ธ์ถœ์— trace ๋ฅผ ์ž‡๋Š” ์ถœ๊ตฌ๋‹ค โ€” `fetch(url, { headers: ctx.tracer.propagationHeaders() })`.
19
+ * ํ™œ์„ฑ span ์ด ์—†๊ฑฐ๋‚˜ ์˜ตํŠธ์ธ OFF ๋ฉด carrier ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜(์ฃผ์ž… ์—†์Œ โ€” ํ—ค๋” ์˜ค์—ผ ์—†์Œ).
20
+ *
21
+ * @param {Record<string, string>} [carrier={}] - ์ฑ„์šธ ํ—ค๋” ๊ฐ์ฒด(๊ธฐ์กด ํ‚ค ๋ณด์กด, traceparent/tracestate ๋งŒ ์ถ”๊ฐ€).
22
+ * @returns {Record<string, string>} carrier(์ฒด์ด๋‹์šฉ ๋™์ผ ๊ฐ์ฒด).
23
+ * @example
24
+ * const res = await fetch(downstreamUrl, { headers: MegaTracing.propagationHeaders({ accept: 'application/json' }) })
25
+ */
26
+ export function propagationHeaders(carrier?: Record<string, string>): Record<string, string>;
27
+ /**
28
+ * ํ™œ์„ฑ ์—ฌ๋ถ€ (Boolean โ€” `is*`, ADR-036). `init` ํ›„ `shutdown` ์ „์ด๋ฉด true.
29
+ * @returns {boolean}
30
+ */
31
+ export function isEnabled(): boolean;
32
+ /**
33
+ * OTel ํŠธ๋ ˆ์ด์‹ฑ ์ดˆ๊ธฐํ™”. ์˜ตํŠธ์ธ โ€” ๋ณธ ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅด์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ์–ด๋Œ‘ํ„ฐ์—๋„ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์•ˆ ๋ถ™์–ด 0 ๋น„์šฉ.
34
+ *
35
+ * @param {object} opts
36
+ * @param {string} opts.serviceName - **ํ•„์ˆ˜**. `service.name` resource ์†์„ฑ.
37
+ * @param {string} [opts.endpoint] - OTLP HTTP traces endpoint (์˜ˆ: `http://localhost:4318/v1/traces`).
38
+ * ์ง€์ • + `exporter` ๋ฏธ์ง€์ • ์‹œ ์ž๋™์œผ๋กœ `'otlp'` exporter ์„ ํƒ.
39
+ * @param {'always_on'|'always_off'|`traceidratio:${number}`|number} [opts.sampling='always_on'] -
40
+ * ์ƒ˜ํ”Œ๋Ÿฌ. ๋น„์œจ์€ `'traceidratio:0.1'` ๋˜๋Š” ์ˆซ์ž `0.1`(0~1). ๋น„์œจ ์ƒ˜ํ”Œ๋Ÿฌ๋Š” `ParentBased` ๋กœ ๊ฐ์‹ผ๋‹ค.
41
+ * @param {'console'|'otlp'|'zipkin'|'inmemory'|import('@opentelemetry/sdk-trace-base').SpanExporter} [opts.exporter] -
42
+ * exporter ์ข…๋ฅ˜ ๋ฌธ์ž์—ด ๋˜๋Š” ์ธ์Šคํ„ด์Šค ์ง์ ‘ ์ฃผ์ž…(ํ…Œ์ŠคํŠธ๋Š” `InMemorySpanExporter` ์ธ์Šคํ„ด์Šค). ๋ฏธ์ง€์ • ์‹œ
43
+ * `endpoint` ์žˆ์œผ๋ฉด `'otlp'`, ์—†์œผ๋ฉด `'console'`. `'zipkin'` ์€ Zipkin v2 JSON(ADR-126 ๋ณด๊ฐ•).
44
+ * @param {'simple'|'batch'} [opts.processor] - span processor. ๋ฏธ์ง€์ • ์‹œ otlp=`'batch'`, ๊ทธ ์™ธ=`'simple'`.
45
+ * @param {string} [opts.version] - `service.version` resource ์†์„ฑ.
46
+ * @param {string} [opts.environment] - `deployment.environment.name` resource ์†์„ฑ.
47
+ * @param {Record<string, any>} [opts.attributes] - ์ถ”๊ฐ€ resource ์†์„ฑ(๋จธ์ง€). ์‹œํฌ๋ฆฟ ๊ธˆ์ง€.
48
+ * @returns {void}
49
+ * @throws {MegaConfigError} `tracing.already_initialized` / `tracing.service_name_required` / `tracing.invalid_sampling` / `tracing.invalid_exporter`.
50
+ */
51
+ export function init(opts?: {
52
+ serviceName: string;
53
+ endpoint?: string;
54
+ sampling?: "always_on" | "always_off" | `traceidratio:${number}` | number;
55
+ exporter?: "console" | "otlp" | "zipkin" | "inmemory" | import("@opentelemetry/sdk-trace-base").SpanExporter;
56
+ processor?: "simple" | "batch";
57
+ version?: string;
58
+ environment?: string;
59
+ attributes?: Record<string, any>;
60
+ }): void;
61
+ /**
62
+ * `MEGA_OTEL_*` ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์˜ตํŠธ์ธ ์ดˆ๊ธฐํ™” (12-factor). `MEGA_OTEL_ENABLED!=='true'` ๋ฉด **no-op**
63
+ * (init ๋ฏธํ˜ธ์ถœ โ†’ 0 ๋น„์šฉ). ํ™œ์„ฑ ์‹œ `MEGA_OTEL_SERVICE_NAME` ํ•„์ˆ˜.
64
+ *
65
+ * ๋งคํ•‘:
66
+ * - `MEGA_OTEL_ENABLED` (true|false, ๋””ํดํŠธ false)
67
+ * - `MEGA_OTEL_SERVICE_NAME` โ†’ serviceName (ํ•„์ˆ˜)
68
+ * - `MEGA_OTEL_ENDPOINT` โ†’ endpoint (OTLP)
69
+ * - `MEGA_OTEL_SAMPLING_RATIO` โ†’ sampling (์ˆซ์ž ๋น„์œจ; `always_on`/`always_off` ๋ฌธ์ž์—ด๋„ ํ—ˆ์šฉ)
70
+ * - `MEGA_OTEL_EXPORTER` โ†’ exporter (otlp|console|inmemory)
71
+ * - `MEGA_OTEL_VERSION` / `MEGA_OTEL_ENVIRONMENT` โ†’ resource ์†์„ฑ
72
+ *
73
+ * @param {Record<string, string|undefined>} [env=process.env]
74
+ * @returns {boolean} ํ™œ์„ฑํ™”๋ผ init ํ–ˆ์œผ๋ฉด true, ์˜ตํŠธ์ธ OFF ๋ฉด false.
75
+ * @throws {MegaConfigError} ํ™œ์„ฑ์ธ๋ฐ serviceName ๋ˆ„๋ฝ ์‹œ `tracing.service_name_required`.
76
+ */
77
+ export function fromEnv(env?: Record<string, string | undefined>): boolean;
78
+ /**
79
+ * ๋‹จ์ผ ์–ด๋Œ‘ํ„ฐ์˜ `onCallStart`/`onCallEnd` ๋ฅผ ๊ตฌ๋…ํ•ด span ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. init ์ „์ด๋ฉด no-op(๋ฆฌ์Šค๋„ˆ ๋ฏธ๋ถ€์ฐฉ).
80
+ * ์ด๋ฏธ ๊ตฌ๋…๋œ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋‹ค์‹œ ๋ถ€๋ฅด๋ฉด ๊ธฐ์กด ๊ตฌ๋…์„ ์œ ์ง€(์ค‘๋ณต ๋ถ€์ฐฉ ๋ฐฉ์ง€).
81
+ *
82
+ * @param {import('../adapters/mega-adapter.js').MegaAdapter} adapter
83
+ * @param {{ domain?: string, driver?: string, key?: string }} [meta] - span ์†์„ฑ ๋ณด๊ฐ•์šฉ ๋ฉ”ํƒ€.
84
+ * @returns {() => void} ๊ตฌ๋… ํ•ด์ œ ํ•จ์ˆ˜.
85
+ */
86
+ export function subscribe(adapter: import("../adapters/mega-adapter.js").MegaAdapter, meta?: {
87
+ domain?: string;
88
+ driver?: string;
89
+ key?: string;
90
+ }): () => void;
91
+ /**
92
+ * ๋ถ€ํŒ…๋œ ์ „์—ญ ์–ด๋Œ‘ํ„ฐ ๋งค๋‹ˆ์ €์˜ **๋ชจ๋“  ๊ณต์œ  ์–ด๋Œ‘ํ„ฐ**์— hook ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ผ๊ด„ ๊ตฌ๋…ํ•œ๋‹ค(ADR-102 ๊ธ€๋กœ๋ฒŒ ๊ณต์œ ).
93
+ * `connectAll` ์ดํ›„ ํ˜ธ์ถœ ๊ถŒ์žฅ(์—ฐ๊ฒฐ ์•ˆ ๋œ ์–ด๋Œ‘ํ„ฐ๋„ ๊ตฌ๋…์€ ์•ˆ์ „ โ€” ์ฒซ ํ˜ธ์ถœ ๋•Œ span ๋ฐœํ™”).
94
+ *
95
+ * @param {{ entries: () => Array<{ domain: string, key: string, driver: string, adapter: import('../adapters/mega-adapter.js').MegaAdapter }> }} manager -
96
+ * `MegaAdapterManager` (entries() ๋…ธ์ถœ). ํ…Œ์ŠคํŠธ ๋”๋ธ”๋„ ๊ฐ™์€ ํ˜•ํƒœ๋ฉด ๋จ.
97
+ * @returns {number} ๊ตฌ๋…ํ•œ ์–ด๋Œ‘ํ„ฐ ์ˆ˜.
98
+ */
99
+ export function attachToManager(manager: {
100
+ entries: () => Array<{
101
+ domain: string;
102
+ key: string;
103
+ driver: string;
104
+ adapter: import("../adapters/mega-adapter.js").MegaAdapter;
105
+ }>;
106
+ }): number;
107
+ /**
108
+ * ํŠธ๋ ˆ์ด์‹ฑ ์ข…๋ฃŒ โ€” ๋ชจ๋“  ๊ตฌ๋… ํ•ด์ œ + ๋‚จ์€ span flush + provider ์ข…๋ฃŒ. init ์ „์ด๋ฉด no-op.
109
+ * @returns {Promise<void>}
110
+ */
111
+ export function shutdown(): Promise<void>;
112
+ /**
113
+ * ํ˜„์žฌ exporter ๋ฐ˜ํ™˜(ํ…Œ์ŠคํŠธยท๋””๋ฒ„๊ทธ์šฉ). `InMemorySpanExporter` ๋ฉด `.getFinishedSpans()` ๋กœ span ๊ฒ€์‚ฌ.
114
+ * @returns {import('@opentelemetry/sdk-trace-base').SpanExporter | null}
115
+ */
116
+ export function getExporter(): import("@opentelemetry/sdk-trace-base").SpanExporter | null;
117
+ /**
118
+ * ๊ฐ•์ œ flush โ€” `BatchSpanProcessor` ์‚ฌ์šฉ ์‹œ ํ…Œ์ŠคํŠธ์—์„œ span ๋ฐœํ™”๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ.
119
+ * @returns {Promise<void>}
120
+ */
121
+ export function forceFlush(): Promise<void>;
122
+ /**
123
+ * **์‚ฌ์šฉ์ž ์ง์ ‘ span** โ€” `name` span ์„ ํ˜„์žฌ ํ™œ์„ฑ span(์—†์œผ๋ฉด ๋ฃจํŠธ)์˜ ์ž์‹์œผ๋กœ ์—ด๊ณ  `fn(span)` ์„ ๊ทธ
124
+ * span ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ์‹คํ–‰ํ•œ๋‹ค(`run()` ๊ฒฉ๋ฆฌ). `fn` ์ด Promise ๋ฉด resolve/reject ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค span ์„
125
+ * ๋‹ซ๋Š”๋‹ค. ์˜ตํŠธ์ธ OFF ๋ฉด 0 ๋น„์šฉ โ€” span ์—†์ด `fn(NOOP_SPAN)` ๋งŒ ํ˜ธ์ถœํ•œ๋‹ค. `ctx.tracer.span` ์˜ ๊ตฌํ˜„๋ถ€.
126
+ *
127
+ * @template T
128
+ * @param {string} name - span ์ด๋ฆ„(์˜ˆ: `'charge.process'`).
129
+ * @param {(span: import('@opentelemetry/api').Span) => T} fn - span ์•ˆ์—์„œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜(span ์ธ์ž ๋ฐ›์Œ).
130
+ * @param {{ attributes?: Record<string, any>, kind?: import('@opentelemetry/api').SpanKind }} [opts]
131
+ * @returns {T} `fn` ์˜ ๋ฐ˜ํ™˜๊ฐ’(๊ทธ๋Œ€๋กœ โ€” ๋™๊ธฐ/Promise ๋ชจ๋‘).
132
+ * @throws {*} `fn` ์ด throw/reject ํ•˜๋ฉด span ์— ๊ธฐ๋ก(ERROR)ํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ์žฌ์ „ํŒŒ(silent ๊ธˆ์ง€).
133
+ */
134
+ export function span<T>(name: string, fn: (span: import("@opentelemetry/api").Span) => T, opts?: {
135
+ attributes?: Record<string, any>;
136
+ kind?: import("@opentelemetry/api").SpanKind;
137
+ }): T;
138
+ /**
139
+ * **์‹œ์ž‘/์ข…๋ฃŒ ๋ถ„๋ฆฌํ˜• span** โ€” HTTP `onRequest`/`onResponse` ์ฒ˜๋Ÿผ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๊ฐ€ ๋‹ค๋ฅธ ์ฝœ๋ฐฑ์ธ ๊ฒฝ์šฐ์— ์“ด๋‹ค.
140
+ * span ์„ ์—ด๊ณ  `enterWith` ๋กœ ํ˜„์žฌ ๋น„๋™๊ธฐ ํ๋ฆ„์˜ ํ™œ์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ด span ์œผ๋กœ ๋งŒ๋“  ๋’ค, `end(err)` ๋ฅผ
141
+ * ๊ฐ€์ง„ ํ•ธ๋“ค์„ ๋Œ๋ ค์ค€๋‹ค(ํ•ธ๋“ค์€ ๋ณดํ†ต `req` ์— ๋ณด๊ด€ํ–ˆ๋‹ค๊ฐ€ ์‘๋‹ต ์‹œ ๋‹ซ๋Š”๋‹ค). ์˜ตํŠธ์ธ OFF ๋ฉด no-op ํ•ธ๋“ค.
142
+ *
143
+ * โš ๏ธ `enterWith` ๋Š” **์š”์ฒญ๋ณ„๋กœ ๊ฒฉ๋ฆฌ๋œ ๋น„๋™๊ธฐ ํ๋ฆ„**์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค(HTTP ์š”์ฒญยทWS ๋ฉ”์‹œ์ง€ ์ฝœ๋ฐฑ์€ ๊ฐ๊ฐ
144
+ * ๋…๋ฆฝ async context ๋ผ ์•ˆ์ „ โ€” ์‹ค์ธก ํ™•์ธ). ๊ณต์œ  ๋™๊ธฐ ์Šค์ฝ”ํ”„์—์„œ ๋ถ€๋ฅด๋ฉด sibling ์˜ค์—ผ(ADR-114) ์œ„ํ—˜.
145
+ *
146
+ * @param {string} name
147
+ * @param {{ attributes?: Record<string, any>, kind?: import('@opentelemetry/api').SpanKind, parent?: import('@opentelemetry/api').Context }} [opts]
148
+ * @returns {{ span: import('@opentelemetry/api').Span, end: (err?: unknown, endAttributes?: Record<string, any>) => void }}
149
+ */
150
+ export function enterSpan(name: string, opts?: {
151
+ attributes?: Record<string, any>;
152
+ kind?: import("@opentelemetry/api").SpanKind;
153
+ parent?: import("@opentelemetry/api").Context;
154
+ }): {
155
+ span: import("@opentelemetry/api").Span;
156
+ end: (err?: unknown, endAttributes?: Record<string, any>) => void;
157
+ };
158
+ /**
159
+ * **HTTP ๋ฃจํŠธ span** ์ „์šฉ ํ—ฌํผ โ€” `onRequest` ์—์„œ ์—ด๊ณ (`enterWith` ๋กœ ํ™œ์„ฑํ™”), `onError` ์—์„œ ์˜ˆ์™ธ๋ฅผ
160
+ * ๊ธฐ๋ก(`setError`), `onResponse` ์—์„œ ์ƒํƒœ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋‹ซ๋Š”๋‹ค(`finish`). HTTP ์‹œ๋งจํ‹ฑ(5xx=ERROR)์„ ํ•œ๊ณณ์—
161
+ * ๋ชจ์•„ ๋ฐฐ์„  ์ฝ”๋“œ(mega-app)๊ฐ€ OTel enum ์„ ์•ˆ ๋งŒ์ง€๊ฒŒ ํ•œ๋‹ค. ์˜ตํŠธ์ธ OFF ๋ฉด no-op ํ•ธ๋“ค.
162
+ *
163
+ * `headers` ๋ฅผ ์ฃผ๋ฉด inbound `traceparent` ๋ฅผ ๋ถ€๋ชจ๋กœ ๋ณต์›ํ•ด({@link extractRemoteContext}, ADR-196) ๋ฃจํŠธ
164
+ * span ์ด ์—…์ŠคํŠธ๋ฆผ trace ์— ์ด์–ด์ง„๋‹ค โ€” ๋ฌดํšจ/๋ถ€์žฌ๋ฉด ์ข…์ „๋Œ€๋กœ ์ƒˆ ๋ฃจํŠธ.
165
+ *
166
+ * @param {{ method: string, route: string, path: string, host?: string, app: string, headers?: Record<string, string | string[] | undefined> }} info
167
+ * @returns {{ span: import('@opentelemetry/api').Span, setError: (err: unknown) => void, finish: (statusCode: number) => void }}
168
+ */
169
+ export function enterHttpSpan({ method, route, path, host, app, headers }: {
170
+ method: string;
171
+ route: string;
172
+ path: string;
173
+ host?: string;
174
+ app: string;
175
+ headers?: Record<string, string | string[] | undefined>;
176
+ }): {
177
+ span: import("@opentelemetry/api").Span;
178
+ setError: (err: unknown) => void;
179
+ finish: (statusCode: number) => void;
180
+ };
181
+ /**
182
+ * ํ˜„์žฌ ํ™œ์„ฑ span ์˜ trace/span id (๋กœ๊ทธ ์ƒ๊ด€๊ด€๊ณ„์šฉ). ํ™œ์„ฑ span ์—†๊ฑฐ๋‚˜ ์˜ตํŠธ์ธ OFF ๋ฉด null.
183
+ * @returns {{ traceId: string, spanId: string } | null}
184
+ */
185
+ export function currentTraceIds(): {
186
+ traceId: string;
187
+ spanId: string;
188
+ } | null;
189
+ /**
190
+ * **pino mixin** โ€” ํ™œ์„ฑ span ์ด ์žˆ์œผ๋ฉด ๋ชจ๋“  ๋กœ๊ทธ ๋ผ์ธ์— `{ trace_id, span_id }` ๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค(ADR-116 (d)).
191
+ * ๋กœ๊ฑฐ๊ฐ€ ์ผœ์ง„ ์•ฑ์—์„œ `logger: { mixin: MegaTracing.logMixin }` ๋กœ ๋ฐฐ์„ ํ•˜๋ฉด ์š”์ฒญ ๋กœ๊ทธ๊ฐ€ trace ์™€ ์ƒ๊ด€๋œ๋‹ค.
192
+ * ํ™œ์„ฑ span ์—†์œผ๋ฉด ๋นˆ ๊ฐ์ฒด(์ฃผ์ž… ์—†์Œ). ์˜ตํŠธ์ธ OFF ๋ฉด ํ•ญ์ƒ ๋นˆ ๊ฐ์ฒด โ†’ 0 ๋น„์šฉ.
193
+ * @returns {{ trace_id?: string, span_id?: string }}
194
+ */
195
+ export function logMixin(): {
196
+ trace_id?: string;
197
+ span_id?: string;
198
+ };
199
+ /**
200
+ * ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ์šฉ reset โ€” ๋™๊ธฐ ๊ฐ•์ œ ์ •๋ฆฌ(provider flush ์—†์ด ์ƒํƒœ๋งŒ ๋น„์›€). ๋น„๋™๊ธฐ ์ •์ƒ ์ข…๋ฃŒ๋Š” `shutdown`.
201
+ * @returns {void}
202
+ */
203
+ export function _reset(): void;
204
+ export { SpanKind } from "@opentelemetry/api";
205
+ /**
206
+ * `ctx.tracer` ๋กœ ๋…ธ์ถœํ•˜๋Š” ํŠธ๋ ˆ์ด์„œ ํ‘œ๋ฉด(ADR-077/116 canonical `ctx.tracer.span`). ๋ชจ๋“ˆ ์‹ฑ๊ธ€ํ†ค โ€” ํ™œ์„ฑ
207
+ * ์ปจํ…์ŠคํŠธ๋Š” ALS ๊ฐ€ ์š”์ฒญ๋ณ„๋กœ ๋“ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๊ฐ์ฒด 1๊ฐœ๋ฅผ ๋ชจ๋“  ์š”์ฒญ์ด ๊ณต์œ ํ•ด๋„ ์•ˆ์ „(getter ๊ฐ€ ALS ๋ฅผ ์ฝ์Œ).
208
+ */
209
+ export const tracer: Readonly<{
210
+ span: typeof span;
211
+ /** outbound ํ—ค๋”์— traceparent/tracestate ์ฃผ์ž…(ADR-196) โ€” `fetch(url, { headers: ctx.tracer.propagationHeaders() })`. */
212
+ propagationHeaders: typeof propagationHeaders;
213
+ /** @returns {import('@opentelemetry/api').Span | undefined} ํ˜„์žฌ ํ™œ์„ฑ span(์—†์œผ๋ฉด undefined โ€” 03-api-spec ยง10). */
214
+ activeSpan(): import("@opentelemetry/api").Span | undefined;
215
+ /** @returns {string|null} ํ˜„์žฌ ํ™œ์„ฑ trace id(์—†์œผ๋ฉด null). */
216
+ readonly traceId: string | null;
217
+ /** @returns {string|null} ํ˜„์žฌ ํ™œ์„ฑ span id(์—†์œผ๋ฉด null). */
218
+ readonly spanId: string | null;
219
+ }>;
220
+ export type TracingState = {
221
+ provider: import("@opentelemetry/sdk-trace-base").BasicTracerProvider;
222
+ tracer: import("@opentelemetry/api").Tracer;
223
+ exporter: import("@opentelemetry/sdk-trace-base").SpanExporter;
224
+ };