@things-factory/headless-twin 10.0.12 โ 10.0.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.
- package/dist-server/engine/canonical-ingest.d.ts +57 -2
- package/dist-server/engine/canonical-ingest.js +43 -2
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.js +1 -1
- package/dist-server/engine/command-routing.js.map +1 -1
- package/dist-server/engine/index.d.ts +3 -0
- package/dist-server/engine/index.js +4 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/ingest-health.d.ts +335 -0
- package/dist-server/engine/ingest-health.js +434 -0
- package/dist-server/engine/ingest-health.js.map +1 -0
- package/dist-server/engine/integration-coverage.d.ts +76 -0
- package/dist-server/engine/integration-coverage.js +73 -0
- package/dist-server/engine/integration-coverage.js.map +1 -0
- package/dist-server/engine/integration-probes.d.ts +65 -0
- package/dist-server/engine/integration-probes.js +100 -0
- package/dist-server/engine/integration-probes.js.map +1 -0
- package/dist-server/engine/integration-runner.d.ts +45 -0
- package/dist-server/engine/integration-runner.js +59 -0
- package/dist-server/engine/integration-runner.js.map +1 -0
- package/dist-server/engine/integration-target-profile.d.ts +57 -0
- package/dist-server/engine/integration-target-profile.js +79 -0
- package/dist-server/engine/integration-target-profile.js.map +1 -0
- package/dist-server/engine/kpi-fold.d.ts +27 -0
- package/dist-server/engine/kpi-fold.js +47 -4
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +128 -14
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/live-feed-registry.js +2 -16
- package/dist-server/engine/live-feed-registry.js.map +1 -1
- package/dist-server/engine/load-meter.d.ts +1 -1
- package/dist-server/engine/load-meter.js +12 -3
- package/dist-server/engine/load-meter.js.map +1 -1
- package/dist-server/engine/log.d.ts +18 -0
- package/dist-server/engine/log.js +80 -0
- package/dist-server/engine/log.js.map +1 -0
- package/dist-server/engine/loop-lag.d.ts +54 -0
- package/dist-server/engine/loop-lag.js +87 -0
- package/dist-server/engine/loop-lag.js.map +1 -0
- package/dist-server/engine/model-gap.d.ts +108 -0
- package/dist-server/engine/model-gap.js +95 -0
- package/dist-server/engine/model-gap.js.map +1 -0
- package/dist-server/engine/restart-policy.d.ts +3 -3
- package/dist-server/engine/restart-policy.js +4 -4
- package/dist-server/engine/restart-policy.js.map +1 -1
- package/dist-server/engine/runtime-key.js +1 -1
- package/dist-server/engine/runtime-key.js.map +1 -1
- package/dist-server/engine/stage-path.d.ts +83 -0
- package/dist-server/engine/stage-path.js +118 -0
- package/dist-server/engine/stage-path.js.map +1 -0
- package/dist-server/engine/twin-engine.d.ts +352 -16
- package/dist-server/engine/twin-engine.js +1037 -166
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/index.js +34 -2
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.d.ts +5 -0
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +58 -0
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.d.ts +5 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +55 -0
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -0
- package/dist-server/migrations/index.js +7 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/service/index.d.ts +5 -2
- package/dist-server/service/index.js +18 -7
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +1 -1
- package/dist-server/service/reference/discovery-result.js +1 -1
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/index.d.ts +4 -1
- package/dist-server/service/reference/index.js +6 -1
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +184 -3
- package/dist-server/service/reference/reference-adapter.js +28 -4
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-assessment.d.ts +68 -0
- package/dist-server/service/reference/reference-assessment.js +136 -0
- package/dist-server/service/reference/reference-assessment.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +12 -1
- package/dist-server/service/reference/reference-live.js +116 -11
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +47 -1
- package/dist-server/service/reference/reference-master.js +34 -4
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-probe.d.ts +92 -0
- package/dist-server/service/reference/reference-probe.js +186 -0
- package/dist-server/service/reference/reference-probe.js.map +1 -0
- package/dist-server/service/reference/reference-progress-subscription.d.ts +17 -0
- package/dist-server/service/reference/reference-progress-subscription.js +94 -0
- package/dist-server/service/reference/reference-progress-subscription.js.map +1 -0
- package/dist-server/service/reference/reference-progress.d.ts +38 -0
- package/dist-server/service/reference/reference-progress.js +71 -0
- package/dist-server/service/reference/reference-progress.js.map +1 -0
- package/dist-server/service/reference/reference-resolver.js +210 -43
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/twin-reference.d.ts +32 -0
- package/dist-server/service/reference/twin-reference.js +10 -0
- package/dist-server/service/reference/twin-reference.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +4 -3
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/journal-count.d.ts +21 -0
- package/dist-server/service/twin-event/journal-count.js +26 -0
- package/dist-server/service/twin-event/journal-count.js.map +1 -0
- package/dist-server/service/twin-event/twin-event-keys.d.ts +9 -0
- package/dist-server/service/twin-event/twin-event-keys.js +15 -18
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-type.d.ts +3 -1
- package/dist-server/service/twin-event/twin-event-type.js +18 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event.js +9 -1
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +2 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/index.d.ts +5 -0
- package/dist-server/service/twin-ingest-window/index.js +10 -0
- package/dist-server/service/twin-ingest-window/index.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +12 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +123 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.d.ts +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +51 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.d.ts +16 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js +108 -0
- package/dist-server/service/twin-ingest-window/twin-ingest-window.js.map +1 -0
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.js +58 -5
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +14 -0
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +72 -2
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
- package/dist-server/service/twin-metrics/twin-metrics-query.js +78 -3
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.d.ts +2 -0
- package/dist-server/service/twin-model/axis-journal-evidence.js +89 -0
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -0
- package/dist-server/service/twin-model/epcis-coverage.d.ts +1 -1
- package/dist-server/service/twin-model/epcis-coverage.js +19 -7
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.d.ts +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js +18 -7
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
- package/dist-server/service/twin-model/isa95-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/isa95-coverage.js +23 -9
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
- package/dist-server/service/twin-model/item-ref.d.ts +24 -0
- package/dist-server/service/twin-model/item-ref.js +88 -0
- package/dist-server/service/twin-model/item-ref.js.map +1 -0
- package/dist-server/service/twin-model/name-index.d.ts +36 -0
- package/dist-server/service/twin-model/name-index.js +116 -0
- package/dist-server/service/twin-model/name-index.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.js +1 -1
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/status-tally.d.ts +9 -0
- package/dist-server/service/twin-model/status-tally.js +37 -0
- package/dist-server/service/twin-model/status-tally.js.map +1 -0
- package/dist-server/service/twin-model/twin-lineage-query.js +40 -12
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +38 -39
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +156 -4
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js +7 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-readiness/index.d.ts +2 -0
- package/dist-server/service/twin-readiness/index.js +6 -0
- package/dist-server/service/twin-readiness/index.js.map +1 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.d.ts +3 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.js +103 -0
- package/dist-server/service/twin-readiness/twin-readiness-query.js.map +1 -0
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
- package/dist-server/service/twin-space/twin-space-resolver.js +5 -4
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-shared/entity-delta.d.ts +23 -3
- package/dist-shared/entity-delta.js +12 -8
- package/dist-shared/entity-delta.js.map +1 -1
- package/dist-shared/kpi-broadcast.js +1 -1
- package/dist-shared/kpi-broadcast.js.map +1 -1
- package/dist-shared/touched-items.d.ts +7 -0
- package/dist-shared/touched-items.js +80 -0
- package/dist-shared/touched-items.js.map +1 -0
- package/package.json +7 -7
- package/server/engine/canonical-ingest.ts +92 -7
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/index.ts +4 -0
- package/server/engine/ingest-health.ts +704 -0
- package/server/engine/integration-coverage.ts +147 -0
- package/server/engine/integration-probes.ts +144 -0
- package/server/engine/integration-runner.ts +95 -0
- package/server/engine/integration-target-profile.ts +103 -0
- package/server/engine/kpi-fold.ts +72 -4
- package/server/engine/kpi-query.ts +129 -15
- package/server/engine/live-feed-registry.ts +2 -1
- package/server/engine/load-meter.ts +12 -3
- package/server/engine/log.ts +72 -0
- package/server/engine/loop-lag.ts +120 -0
- package/server/engine/model-gap.ts +168 -0
- package/server/engine/restart-policy.ts +4 -4
- package/server/engine/runtime-key.ts +1 -1
- package/server/engine/stage-path.ts +172 -0
- package/server/engine/twin-engine.ts +1135 -162
- package/server/index.ts +35 -2
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +54 -0
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +53 -0
- package/server/migrations/index.ts +7 -1
- package/server/service/index.ts +11 -0
- package/server/service/reference/discovery-result.ts +1 -1
- package/server/service/reference/index.ts +6 -1
- package/server/service/reference/reference-adapter.ts +197 -5
- package/server/service/reference/reference-assessment.ts +215 -0
- package/server/service/reference/reference-live.ts +123 -11
- package/server/service/reference/reference-master.ts +64 -4
- package/server/service/reference/reference-probe.ts +264 -0
- package/server/service/reference/reference-progress-subscription.ts +73 -0
- package/server/service/reference/reference-progress.ts +95 -0
- package/server/service/reference/reference-resolver.ts +200 -12
- package/server/service/reference/twin-reference.ts +39 -1
- package/server/service/twin-control/twin-control-mutation.ts +4 -3
- package/server/service/twin-event/journal-count.ts +53 -0
- package/server/service/twin-event/twin-event-keys.ts +16 -1
- package/server/service/twin-event/twin-event-type.ts +26 -2
- package/server/service/twin-event/twin-event.ts +7 -0
- package/server/service/twin-forecast/twin-forecast-query.ts +2 -1
- package/server/service/twin-ingest-window/index.ts +7 -0
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +125 -0
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +57 -0
- package/server/service/twin-ingest-window/twin-ingest-window.ts +113 -0
- package/server/service/twin-instance/twin-instance.ts +1 -1
- package/server/service/twin-journal/twin-journal-query.ts +59 -5
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +77 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +81 -3
- package/server/service/twin-model/axis-journal-evidence.ts +57 -0
- package/server/service/twin-model/epcis-coverage.ts +2 -8
- package/server/service/twin-model/iec61850-coverage.ts +2 -8
- package/server/service/twin-model/isa95-coverage.ts +22 -9
- package/server/service/twin-model/item-ref.ts +80 -0
- package/server/service/twin-model/name-index.ts +94 -0
- package/server/service/twin-model/project-structure.ts +1 -1
- package/server/service/twin-model/status-tally.ts +37 -0
- package/server/service/twin-model/twin-lineage-query.ts +38 -9
- package/server/service/twin-model/twin-model-item-query.ts +26 -27
- package/server/service/twin-model/twin-model-query.ts +155 -4
- package/server/service/twin-model/twin-model-tree-query.ts +7 -0
- package/server/service/twin-readiness/index.ts +3 -0
- package/server/service/twin-readiness/twin-readiness-query.ts +96 -0
- package/server/service/twin-space/twin-space-resolver.ts +5 -4
- package/shared/entity-delta.ts +31 -7
- package/shared/kpi-broadcast.ts +1 -1
- package/shared/touched-items.ts +73 -0
- package/test/axis-journal-evidence.test.ts +71 -0
- package/test/axis-read.test.ts +101 -1
- package/test/boot-resume.test.ts +92 -26
- package/test/broadcast-cost-baseline.test.ts +200 -0
- package/test/broadcast-period.test.ts +58 -0
- package/test/canonical-ingest-vocabularies.test.ts +36 -1
- package/test/canonical-quantity-door.test.ts +61 -0
- package/test/command-routing.test.ts +1 -1
- package/test/declared-location-types.test.ts +89 -0
- package/test/discovery-result.test.ts +1 -1
- package/test/duration-estimators.test.ts +1 -1
- package/test/entity-delta.test.ts +2 -2
- package/test/ingest-bench.test.ts +3 -3
- package/test/ingest-health-engine.test.ts +248 -0
- package/test/ingest-health-wiring.test.ts +119 -0
- package/test/ingest-health.test.ts +306 -0
- package/test/ingest-history.test.ts +247 -0
- package/test/integration-probes.test.ts +103 -0
- package/test/integration-runner.test.ts +95 -0
- package/test/item-ref.test.ts +78 -0
- package/test/journal-read-discipline.test.ts +177 -0
- package/test/journal-retention.test.ts +133 -0
- package/test/journal-sort-axis.test.ts +142 -0
- package/test/journal-write-door.test.ts +110 -0
- package/test/journal-write-trend.test.ts +115 -0
- package/test/kernel-kind-guard.test.ts +4 -4
- package/test/kpi-fold.test.ts +90 -3
- package/test/kpi-query-bench.test.ts +2 -2
- package/test/lineage-survives-restart.test.ts +17 -1
- package/test/live-cursor-wiring.test.ts +87 -0
- package/test/live-feed-registry.test.ts +9 -1
- package/test/live-kernel-facts.test.ts +7 -7
- package/test/live-mirror-parity.test.ts +6 -0
- package/test/load-meter.test.ts +29 -15
- package/test/local-declarations.test.ts +1 -1
- package/test/log-stamp.test.ts +59 -0
- package/test/loop-lag.test.ts +82 -0
- package/test/model-gap.test.ts +153 -0
- package/test/oee-accumulator.test.ts +4 -0
- package/test/operational-vocabulary.test.ts +4 -4
- package/test/read-failure-visible.test.ts +145 -0
- package/test/reference-grounding.test.ts +70 -0
- package/test/resolve-ts-siblings.mjs +52 -0
- package/test/restart-policy.test.ts +7 -7
- package/test/revision-axis.test.ts +93 -0
- package/test/runtime-key.test.ts +2 -2
- package/test/scale-twin-bench.test.ts +2 -2
- package/test/spec-coverage.test.ts +1 -1
- package/test/stage-path.test.ts +95 -0
- package/test/standard-coverage.test.ts +15 -3
- package/test/status-tally.test.ts +55 -0
- package/test/structure-revision-db.test.ts +4 -0
- package/test/tenant-registry-db.test.ts +1 -1
- package/test/time-range.test.ts +152 -0
- package/test/touched-items.test.ts +61 -0
- package/test/twin-event-keys.test.ts +10 -2
- package/test/twin-model-item-db.test.ts +2 -0
- package/test/warm-start-seam.test.ts +4 -0
- package/test/yield-loop.test.ts +57 -2
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ํธ์ ๋ก๊ทธ์ ๋ฌธ โ **๋ชจ๋ ์ค์ ์๊ฐ์ ์ฐ๋๋ค.** ์์(ํ๋ ์์ํฌ ์์กด ์์).
|
|
4
|
+
*
|
|
5
|
+
* โโ ์ ํ์ํ๊ฐ (2026-08-22) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* ใ์๋ฒ๊ฐ ์ ๋๋ฆฐ๊ฐใ๋ฅผ ์กฐ์ฌํ๋ฉด์ ๋ฃจํ๊ฐ 55์ด ๋งํ ๊ฒ์ ๊ณ๊ธฐ๋ก ์์๋๋๋ฐ(`loop-lag.ts`),
|
|
7
|
+
* **๊ทธ ์๊ฐ์ ๋ฌด์จ ์ผ์ด ์์๋์ง ๋ก๊ทธ์์ ์ฐพ์ ์ ์์๋ค.** ํธ์์ ๋ก๊ทธ๊ฐ `console.log` ๋ก ๋๊ฐ
|
|
8
|
+
* ์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋ ์์ํฌ ๋ก๊ทธ(`2026-08-22T05:54:12+09:00 info: โฆ`)์ ์์ฌ ์์ด์, ์ด๋
|
|
9
|
+
* ์ค์ด ์ธ์ ์ฐํ๋์ง ์๋ค ํ๋ ์์ํฌ ์ค๋ก ์ง์ํด์ผ ํ๋ค.
|
|
10
|
+
*
|
|
11
|
+
* โโ ์ ํ๋ ์์ํฌ ๋ก๊ฑฐ๋ฅผ ๊ทธ๋๋ก ์ฐ์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
12
|
+
* ์ฌ๋ฐ๋ช
์ ํผํ๋ ค๊ณ `@things-factory/env` ์ `logger` ๋ฅผ ์ฐ๋ ค ํ๋๋ฐ, ์ค์ธก์ผ๋ก ๋งํ๋ค: ์ฑ **๋ฐ**์์๋
|
|
13
|
+
* ๊ทธ ๋ก๊ฑฐ์ ์ ์ก์ง๊ฐ ํ๋๋ ์๋ค(์ค์ ์ด ์ฑ์์ ์ฃผ์
๋๋ค). ๊ทธ๋์ ์ํยท๋๊ตฌ์์ ๋ถ๋ฅด๋ฉด
|
|
14
|
+
*
|
|
15
|
+
* [winston] Attempt to write logs with no transports โฆ {"message":"โฆ","level":"info"}
|
|
16
|
+
*
|
|
17
|
+
* ๊ฐ ๋์ค๊ณ **๋ฉ์์ง ์์ฒด๊ฐ ์ฌ๋ผ์ง๋ค.** ํธ์ ์์ง์ ์ํ๊ณผ CLI ๋๊ตฌ์์๋ ๋ถ๋ ค ๋ค๋๋ฏ๋ก, ๊ทธ ์กฐ๊ฑด์์
|
|
18
|
+
* ๋ก๊ทธ๊ฐ ์์ด์ง๋ ๊ฒ์ ๋ฐ๊ฟ์ ์ ๋๋ ๊ฑฐ๋์ด๋ค(๋ก๊ทธ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์ง๊ธ ๋ฌธ์ ์ ์์ธ์ด์๋ค).
|
|
19
|
+
*
|
|
20
|
+
* ๊ทธ๋์ **์ฑํฌ๋ ๊ทธ๋๋ก ๋๊ณ **(console) ๋น ์ง ์ฌ์ค ํ๋๋ง ์ฑ์ด๋ค โ ์๊ฐ. ํ์์ ํ๋ ์์ํฌ์ ๊ฐ์
|
|
21
|
+
* ๋ชจ์์ผ๋ก ๋ง์ถฐ ํ ํ์ผ์์ ์์ฌ ์ฝํ๊ฒ ํ๊ณ , **๋ฐ๋ฆฌ์ด๊น์ง** ๋จ๊ธด๋ค(๊ณ๊ธฐ์ ๊ฐ์ด epoch ms ๋ผ
|
|
22
|
+
* ์ด ๋จ์๋ก๋ ๊ฐ์ ์ด ์์ ์์๋ฅผ ๊ฐ๋ฆด ์ ์๋ค).
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.twinError = exports.twinWarn = exports.twinLog = void 0;
|
|
26
|
+
exports.stamp = stamp;
|
|
27
|
+
exports.line = line;
|
|
28
|
+
/** ๋ ์๋ฆฌยท์ธ ์๋ฆฌ 0 ์ฑ์ฐ๊ธฐ โ ํ์์ด ํ๋ค๋ฆฌ๋ฉด ์ ๋ ฌํด ์ฝ์ ์ ์๋ค. */
|
|
29
|
+
const p2 = (n) => String(n).padStart(2, '0');
|
|
30
|
+
const p3 = (n) => String(n).padStart(3, '0');
|
|
31
|
+
/**
|
|
32
|
+
* ์ง์ญ ์๊ฐ + ์คํ์
โ `2026-08-22T05:54:12.345+09:00`.
|
|
33
|
+
*
|
|
34
|
+
* UTC ๋ก ์ฐ์ง ์๋๋ค: ์ด ๋ก๊ทธ๋ฅผ ์ฝ๋ ์ฌ๋์ ํ์ฅ์ ์๊ฐ์ผ๋ก ์ด์ผ๊ธฐํ๊ณ , ํ๋ ์์ํฌ์ ๋ค๋ฅธ ์ค๋
|
|
35
|
+
* ์ง์ญ ์๊ฐ์ด๋ค. ๋ ์ค์ด ๋ค๋ฅธ ๊ธฐ์ค์ด๋ฉด ๋๋ํ ๋๊ณ ์ฝ์ ์ ์๋ค.
|
|
36
|
+
*/
|
|
37
|
+
function stamp(at = new Date()) {
|
|
38
|
+
const off = -at.getTimezoneOffset();
|
|
39
|
+
const sign = off >= 0 ? '+' : '-';
|
|
40
|
+
const abs = Math.abs(off);
|
|
41
|
+
return (`${at.getFullYear()}-${p2(at.getMonth() + 1)}-${p2(at.getDate())}` +
|
|
42
|
+
`T${p2(at.getHours())}:${p2(at.getMinutes())}:${p2(at.getSeconds())}.${p3(at.getMilliseconds())}` +
|
|
43
|
+
`${sign}${p2(Math.floor(abs / 60))}:${p2(abs % 60)}`);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* ์ธ์ ์ฌ๋ฟ์ ํ ์ค๋ก โ **์ด๋ค ์ธ์๋ ๋ฒ๋ฆฌ์ง ์๋๋ค.**
|
|
47
|
+
*
|
|
48
|
+
* `console.error(msg, err)` ์ฒ๋ผ ์ฐ๋ ์๋ฆฌ๊ฐ ๋ง๋ค. ํ๋ ์์ํฌ ๋ก๊ฑฐ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋ ๋ฒ์งธ ์ธ์๋
|
|
49
|
+
* meta ๋ก ๋ค์ด๊ฐ ์ฐ๋ฆฌ ํ์(`message` ๋ง ์ฐ๋๋ค)์์ **์กฐ์ฉํ ์ฌ๋ผ์ง๋ค.** ๊ทธ๋์ ์ฌ๊ธฐ์ ๋ฌธ์์ด๋ก ํธ๋ค.
|
|
50
|
+
* ์ค๋ฅ๋ ์คํ๊น์ง โ ์คํ์ด ์์ผ๋ฉด ใ์ด๋์ ๋ฌ๋ใ๋ฅผ ์๋๋ค.
|
|
51
|
+
*/
|
|
52
|
+
function line(args) {
|
|
53
|
+
return args
|
|
54
|
+
.map(a => {
|
|
55
|
+
if (typeof a === 'string')
|
|
56
|
+
return a;
|
|
57
|
+
if (a instanceof Error)
|
|
58
|
+
return a.stack ?? a.message;
|
|
59
|
+
if (a === undefined)
|
|
60
|
+
return 'undefined';
|
|
61
|
+
if (a === null)
|
|
62
|
+
return 'null';
|
|
63
|
+
try {
|
|
64
|
+
return typeof a === 'object' ? JSON.stringify(a) : String(a);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
/* ์ํ ์ฐธ์กฐ ๋ฑ โ ๊ฐ์ ๋ชป ์ ์ด๋ **๋ฌด์์ด ์์๋ค๋ ์ฌ์ค**์ ๋จ๊ธด๋ค. */
|
|
68
|
+
return String(a);
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
.join(' ');
|
|
72
|
+
}
|
|
73
|
+
/* ์์ค ํ๊ธฐ๋ ํ๋ ์์ํฌ์ ๊ฐ์ ๋ฑ๋ง์ ์ด๋ค(`info`ยท`warn`ยท`error`) โ ๊ฐ์ ํ์ผ์์ ๊ฑธ๋ฌ ์ฝ๋๋ค. */
|
|
74
|
+
const twinLog = (...args) => console.log(`${stamp()} info: ${line(args)}`);
|
|
75
|
+
exports.twinLog = twinLog;
|
|
76
|
+
const twinWarn = (...args) => console.warn(`${stamp()} warn: ${line(args)}`);
|
|
77
|
+
exports.twinWarn = twinWarn;
|
|
78
|
+
const twinError = (...args) => console.error(`${stamp()} error: ${line(args)}`);
|
|
79
|
+
exports.twinError = twinError;
|
|
80
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../server/engine/log.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ํธ์ ๋ก๊ทธ์ ๋ฌธ โ **๋ชจ๋ ์ค์ ์๊ฐ์ ์ฐ๋๋ค.** ์์(ํ๋ ์์ํฌ ์์กด ์์).\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-22) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ใ์๋ฒ๊ฐ ์ ๋๋ฆฐ๊ฐใ๋ฅผ ์กฐ์ฌํ๋ฉด์ ๋ฃจํ๊ฐ 55์ด ๋งํ ๊ฒ์ ๊ณ๊ธฐ๋ก ์์๋๋๋ฐ(`loop-lag.ts`),\n * **๊ทธ ์๊ฐ์ ๋ฌด์จ ์ผ์ด ์์๋์ง ๋ก๊ทธ์์ ์ฐพ์ ์ ์์๋ค.** ํธ์์ ๋ก๊ทธ๊ฐ `console.log` ๋ก ๋๊ฐ\n * ์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ด๋ค. ํ๋ ์์ํฌ ๋ก๊ทธ(`2026-08-22T05:54:12+09:00 info: โฆ`)์ ์์ฌ ์์ด์, ์ด๋\n * ์ค์ด ์ธ์ ์ฐํ๋์ง ์๋ค ํ๋ ์์ํฌ ์ค๋ก ์ง์ํด์ผ ํ๋ค.\n *\n * โโ ์ ํ๋ ์์ํฌ ๋ก๊ฑฐ๋ฅผ ๊ทธ๋๋ก ์ฐ์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ๋ฐ๋ช
์ ํผํ๋ ค๊ณ `@things-factory/env` ์ `logger` ๋ฅผ ์ฐ๋ ค ํ๋๋ฐ, ์ค์ธก์ผ๋ก ๋งํ๋ค: ์ฑ **๋ฐ**์์๋\n * ๊ทธ ๋ก๊ฑฐ์ ์ ์ก์ง๊ฐ ํ๋๋ ์๋ค(์ค์ ์ด ์ฑ์์ ์ฃผ์
๋๋ค). ๊ทธ๋์ ์ํยท๋๊ตฌ์์ ๋ถ๋ฅด๋ฉด\n *\n * [winston] Attempt to write logs with no transports โฆ {\"message\":\"โฆ\",\"level\":\"info\"}\n *\n * ๊ฐ ๋์ค๊ณ **๋ฉ์์ง ์์ฒด๊ฐ ์ฌ๋ผ์ง๋ค.** ํธ์ ์์ง์ ์ํ๊ณผ CLI ๋๊ตฌ์์๋ ๋ถ๋ ค ๋ค๋๋ฏ๋ก, ๊ทธ ์กฐ๊ฑด์์\n * ๋ก๊ทธ๊ฐ ์์ด์ง๋ ๊ฒ์ ๋ฐ๊ฟ์ ์ ๋๋ ๊ฑฐ๋์ด๋ค(๋ก๊ทธ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์ง๊ธ ๋ฌธ์ ์ ์์ธ์ด์๋ค).\n *\n * ๊ทธ๋์ **์ฑํฌ๋ ๊ทธ๋๋ก ๋๊ณ **(console) ๋น ์ง ์ฌ์ค ํ๋๋ง ์ฑ์ด๋ค โ ์๊ฐ. ํ์์ ํ๋ ์์ํฌ์ ๊ฐ์\n * ๋ชจ์์ผ๋ก ๋ง์ถฐ ํ ํ์ผ์์ ์์ฌ ์ฝํ๊ฒ ํ๊ณ , **๋ฐ๋ฆฌ์ด๊น์ง** ๋จ๊ธด๋ค(๊ณ๊ธฐ์ ๊ฐ์ด epoch ms ๋ผ\n * ์ด ๋จ์๋ก๋ ๊ฐ์ ์ด ์์ ์์๋ฅผ ๊ฐ๋ฆด ์ ์๋ค).\n */\n\n/** ๋ ์๋ฆฌยท์ธ ์๋ฆฌ 0 ์ฑ์ฐ๊ธฐ โ ํ์์ด ํ๋ค๋ฆฌ๋ฉด ์ ๋ ฌํด ์ฝ์ ์ ์๋ค. */\nconst p2 = (n: number) => String(n).padStart(2, '0')\nconst p3 = (n: number) => String(n).padStart(3, '0')\n\n/**\n * ์ง์ญ ์๊ฐ + ์คํ์
โ `2026-08-22T05:54:12.345+09:00`.\n *\n * UTC ๋ก ์ฐ์ง ์๋๋ค: ์ด ๋ก๊ทธ๋ฅผ ์ฝ๋ ์ฌ๋์ ํ์ฅ์ ์๊ฐ์ผ๋ก ์ด์ผ๊ธฐํ๊ณ , ํ๋ ์์ํฌ์ ๋ค๋ฅธ ์ค๋\n * ์ง์ญ ์๊ฐ์ด๋ค. ๋ ์ค์ด ๋ค๋ฅธ ๊ธฐ์ค์ด๋ฉด ๋๋ํ ๋๊ณ ์ฝ์ ์ ์๋ค.\n */\nexport function stamp(at: Date = new Date()): string {\n const off = -at.getTimezoneOffset()\n const sign = off >= 0 ? '+' : '-'\n const abs = Math.abs(off)\n return (\n `${at.getFullYear()}-${p2(at.getMonth() + 1)}-${p2(at.getDate())}` +\n `T${p2(at.getHours())}:${p2(at.getMinutes())}:${p2(at.getSeconds())}.${p3(at.getMilliseconds())}` +\n `${sign}${p2(Math.floor(abs / 60))}:${p2(abs % 60)}`\n )\n}\n\n/**\n * ์ธ์ ์ฌ๋ฟ์ ํ ์ค๋ก โ **์ด๋ค ์ธ์๋ ๋ฒ๋ฆฌ์ง ์๋๋ค.**\n *\n * `console.error(msg, err)` ์ฒ๋ผ ์ฐ๋ ์๋ฆฌ๊ฐ ๋ง๋ค. ํ๋ ์์ํฌ ๋ก๊ฑฐ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋ ๋ฒ์งธ ์ธ์๋\n * meta ๋ก ๋ค์ด๊ฐ ์ฐ๋ฆฌ ํ์(`message` ๋ง ์ฐ๋๋ค)์์ **์กฐ์ฉํ ์ฌ๋ผ์ง๋ค.** ๊ทธ๋์ ์ฌ๊ธฐ์ ๋ฌธ์์ด๋ก ํธ๋ค.\n * ์ค๋ฅ๋ ์คํ๊น์ง โ ์คํ์ด ์์ผ๋ฉด ใ์ด๋์ ๋ฌ๋ใ๋ฅผ ์๋๋ค.\n */\nexport function line(args: unknown[]): string {\n return args\n .map(a => {\n if (typeof a === 'string') return a\n if (a instanceof Error) return a.stack ?? a.message\n if (a === undefined) return 'undefined'\n if (a === null) return 'null'\n try {\n return typeof a === 'object' ? JSON.stringify(a) : String(a)\n } catch {\n /* ์ํ ์ฐธ์กฐ ๋ฑ โ ๊ฐ์ ๋ชป ์ ์ด๋ **๋ฌด์์ด ์์๋ค๋ ์ฌ์ค**์ ๋จ๊ธด๋ค. */\n return String(a)\n }\n })\n .join(' ')\n}\n\n/* ์์ค ํ๊ธฐ๋ ํ๋ ์์ํฌ์ ๊ฐ์ ๋ฑ๋ง์ ์ด๋ค(`info`ยท`warn`ยท`error`) โ ๊ฐ์ ํ์ผ์์ ๊ฑธ๋ฌ ์ฝ๋๋ค. */\nexport const twinLog = (...args: unknown[]): void => console.log(`${stamp()} info: ${line(args)}`)\nexport const twinWarn = (...args: unknown[]): void => console.warn(`${stamp()} warn: ${line(args)}`)\nexport const twinError = (...args: unknown[]): void => console.error(`${stamp()} error: ${line(args)}`)\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** ํ๋ณธ ๊ฐ๊ฒฉ(ms) โ ์ด์ดํ ํ์๊ฐ ์๋ค. ๊ธด ์ ์ฒด๋ฅผ ๋์น์ง ์๋ ์ ๋๋ฉด ๋๋ค. */
|
|
2
|
+
export declare const LAG_SAMPLE_MS = 500;
|
|
3
|
+
/** ์ด ๊ฐ์ ๋๋ ์ง์ฒด๋ง ใ์ ์ฒดใ๋ก ์ผ๋ค(ms). ์ฌ๋์ด ํ๋ฉด์์ ๋๋ผ๊ธฐ ์์ํ๋ ํฌ๊ธฐ. */
|
|
4
|
+
export declare const LAG_STALL_MS = 200;
|
|
5
|
+
/** ์ฐฝ ๊ธธ์ด(ms) โ `twinLoad` ์ ์ฐฝ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ๋์ด ๋๋ํ ์ฝ๋๋ค. */
|
|
6
|
+
export declare const LAG_WINDOW_MS = 10000;
|
|
7
|
+
export interface LoopLagWindow {
|
|
8
|
+
/** ์ด ์ฐฝ์์ ๊ฐ์ฅ ๊ธธ๊ฒ ๋งํ ์๊ฐ(ms). */
|
|
9
|
+
maxMs: number;
|
|
10
|
+
/** ์ ์ฒด(๋ฌธํฑ ์ด๊ณผ) ํ์. */
|
|
11
|
+
stalls: number;
|
|
12
|
+
/** ํ๋ณธ ์ โ ๋ถ๋ชจ๋ค. */
|
|
13
|
+
samples: number;
|
|
14
|
+
/** ์ง์ฒด ํฉ(ms) โ ํ๊ท ์ ์ฝ๋ ์ชฝ์์ ๋ธ๋ค. */
|
|
15
|
+
totalMs: number;
|
|
16
|
+
/** ์ฐฝ์ด ์ด๋ฆฐ ์๊ฐ. */
|
|
17
|
+
startMs: number;
|
|
18
|
+
}
|
|
19
|
+
export interface LoopLagView {
|
|
20
|
+
/** ๋ง์ง๋ง์ผ๋ก ๋ซํ ์ฐฝ โ ใ์ง๊ธ ์ด๋ค๊ฐใ. ์์ง ํ ์ฐฝ๋ ์ ์ง๋ฌ์ผ๋ฉด null. */
|
|
21
|
+
recent: (LoopLagWindow & {
|
|
22
|
+
endMs: number;
|
|
23
|
+
}) | null;
|
|
24
|
+
/** ๊ธฐ๋ ์ดํ ๋์ . */
|
|
25
|
+
total: LoopLagWindow;
|
|
26
|
+
/** ๊ธฐ๋ ์ดํ ๊ฐ์ฅ ๊ธธ๊ฒ ๋งํ ์๊ฐ(ms, epoch) โ ์ธ์ ์๋์ง๊ฐ ์์ธ์ ๊ฐ๋ฆฌ๋ ๋ฐ ์ฐ์ธ๋ค. */
|
|
27
|
+
worstAtMs: number | null;
|
|
28
|
+
/** ํ๋ณธ ๊ฐ๊ฒฉ โ ์ฝ๋ ์ชฝ์ด ์ด ๊ฐ๋ณด๋ค ์งง์ ์ ์ฒด๋ ๋ชป ๋ณธ๋ค๋ ๊ฒ์ ์์์ผ ํ๋ค. */
|
|
29
|
+
sampleMs: number;
|
|
30
|
+
/** ์ ์ฒด๋ก ์ธ๋ ๋ฌธํฑ. */
|
|
31
|
+
stallMs: number;
|
|
32
|
+
}
|
|
33
|
+
export declare class LoopLagSampler {
|
|
34
|
+
private window;
|
|
35
|
+
private closed;
|
|
36
|
+
private total;
|
|
37
|
+
private worstAtMs;
|
|
38
|
+
private timer;
|
|
39
|
+
private expectedMs;
|
|
40
|
+
private sampleMs;
|
|
41
|
+
private stallMs;
|
|
42
|
+
private windowMs;
|
|
43
|
+
private now;
|
|
44
|
+
constructor(sampleMs?: number, stallMs?: number, windowMs?: number, now?: () => number);
|
|
45
|
+
/** ํ๋ณธ์ ํ๋ ๋ฃ๋๋ค โ ํ์ด๋จธ๊ฐ ๋ถ๋ฅด๊ณ , ์ํ์ ์ง์ ๋ถ๋ฅธ๋ค(์๊ณ๋ฅผ ๋ฐ์ด ๋ฃ์ด ์ฐ๋ค). */
|
|
46
|
+
sample(atMs?: number): number;
|
|
47
|
+
/** ๊ณ๊ธฐํ์ด ์ฝ๋ ๊ฐ. **ํ ์ฐฝ๋ ๋ซํ์ง ์์์ผ๋ฉด `recent` ๋ null** โ ์ฑ์ฐ๋ ์ค์ธ ์ฐฝ์ ๊ณผ์ ์ง๊ณ๋ค. */
|
|
48
|
+
view(): LoopLagView;
|
|
49
|
+
/** ํ๋ณธ ํ์ด๋จธ ๊ธฐ๋(1ํ) โ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ๋ง์ง ์๋๋ค. */
|
|
50
|
+
start(): void;
|
|
51
|
+
stop(): void;
|
|
52
|
+
}
|
|
53
|
+
/** ํ๋ก์ธ์ค ํ๋์ ๋ฃจํ๋ฅผ ์ฌ๋ ๊ฒ์ด๋ฏ๋ก ํ๋ณธ๊ธฐ๋ ํ๋๋ค. */
|
|
54
|
+
export declare const loopLag: LoopLagSampler;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ์ด๋ฒคํธ ๋ฃจํ ์ง์ฒด โ **ํ๋ฉด์ด ๋๋ฆฐ ์ด์ ๋ฅผ ์ง์ด๋ด์ง ์๊ธฐ ์ํด.** ์์(import ์์).
|
|
4
|
+
*
|
|
5
|
+
* โโ ์ ํ์ํ๊ฐ (2026-08-21) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* ใUI ๋ฐ์์ฑ์ด ๋๋ฆฌ๋คใ๋ฅผ ์ง๋จํ๋ ค ํ๋๋ฐ, ์๋ ๊ณ๊ธฐํ์ผ๋ก๋ ๋ต์ด ๋์ค์ง ์์๋ค. `twinLoad` ๋ **ํธ์์
|
|
7
|
+
* ๊ณ์ธก๋ ์์
**๋ง ์ฌ๊ณ , `processCpuRatio` ๋ ํ๋ก์ธ์ค ์ ์ฒด๋ฅผ ์ฌ์ง๋ง **์ธ์ ์ผ๋ง๋ ๋ฉ์ท๋**๋ฅผ ๋งํ์ง
|
|
8
|
+
* ๋ชปํ๋ค. ๋ฐ์์ HTTP ์ง์ฐ์ ์ฌ ๋ณด๋ ๊ฐ์ ์์ฒญ์ด 44ms ์ 5.8์ด๋ก ๊ฐ๋ผ์ก๋๋ฐ, ๊ทธ 5.8์ด๊ฐ ํธ์ ๋๋ฌธ์ธ์ง
|
|
9
|
+
* webpack ์ฌ๋น๋ ๋๋ฌธ์ธ์ง ๋จ์ ์ฌ๊ธฐ๋ ๋๋ฌธ์ธ์ง **๊ฐ๋ฆด ๊ทผ๊ฑฐ๊ฐ ์์๋ค.**
|
|
10
|
+
*
|
|
11
|
+
* ๊ทผ๊ฑฐ ์์ด ์์ธ์ ๊ณ ๋ฅด๋ฉด ์๋ฑํ ๊ณณ์ ๊ณ ์น๋ค. ๊ทธ๋์ ๋ฃจํ๊ฐ ์ค์ ๋ก ์ผ๋ง๋ ๋งํ๋์ง๋ฅผ ์ฐ๋ค.
|
|
12
|
+
*
|
|
13
|
+
* โโ ์ด๋ป๊ฒ ์ฌ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
14
|
+
* ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊นจ์ด๋๋ ํ์ด๋จธ๋ฅผ ๋๊ณ , **์์ ์๊ฐ๊ณผ ์ค์ ์๊ฐ์ ์ฐจ์ด**๋ฅผ ๋ณธ๋ค. ๋ฃจํ๊ฐ ๋งํ ์์์ผ๋ฉด
|
|
15
|
+
* ๊ทธ๋งํผ ๋ฆ๊ฒ ๊นจ์ด๋๋ค. ์ฌ๋ ๋น์ฉ์ ๊ทธ ์ฐจ์ด ๊ณ์ฐ ํ๋๋ฟ์ด๋ค(์ฐฝ๋ง๋ค ๊ฐ ๋ค์ฏ).
|
|
16
|
+
*
|
|
17
|
+
* ์ด ๊ฐ์ **์์ธ์ ๋งํ์ง ์๋๋ค** โ ใ200ms ์ด์ ๋งํ ์ผ์ด ์ด ์ฐฝ์์ ์ธ ๋ฒ, ๊ฐ์ฅ ๊ธด ๊ฒ์ 4.6์ดใ๊น์ง๊ฐ
|
|
18
|
+
* ์ฌ์ค์ด๋ค. ์์ธ์ ๊ทธ ์๊ฐ์ ํธ์ ๋ถํ(`twinLoad`)์ ํ๋ก์ธ์ค CPU ์ ๋๋ํ ๋๊ณ ์ฌ๋์ด ๊ฐ๋ฆฐ๋ค.
|
|
19
|
+
* ์ฌ์ง ์์ ๊ฒ์ 0 ์ผ๋ก ์ ์ง ์๋๋ค โ ํ ๋ฒ๋ ๊นจ์ด๋์ง ์์์ผ๋ฉด `null` ์ด๋ค.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.loopLag = exports.LoopLagSampler = exports.LAG_WINDOW_MS = exports.LAG_STALL_MS = exports.LAG_SAMPLE_MS = void 0;
|
|
23
|
+
/** ํ๋ณธ ๊ฐ๊ฒฉ(ms) โ ์ด์ดํ ํ์๊ฐ ์๋ค. ๊ธด ์ ์ฒด๋ฅผ ๋์น์ง ์๋ ์ ๋๋ฉด ๋๋ค. */
|
|
24
|
+
exports.LAG_SAMPLE_MS = 500;
|
|
25
|
+
/** ์ด ๊ฐ์ ๋๋ ์ง์ฒด๋ง ใ์ ์ฒดใ๋ก ์ผ๋ค(ms). ์ฌ๋์ด ํ๋ฉด์์ ๋๋ผ๊ธฐ ์์ํ๋ ํฌ๊ธฐ. */
|
|
26
|
+
exports.LAG_STALL_MS = 200;
|
|
27
|
+
/** ์ฐฝ ๊ธธ์ด(ms) โ `twinLoad` ์ ์ฐฝ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ๋์ด ๋๋ํ ์ฝ๋๋ค. */
|
|
28
|
+
exports.LAG_WINDOW_MS = 10_000;
|
|
29
|
+
const emptyWindow = (startMs) => ({ maxMs: 0, stalls: 0, samples: 0, totalMs: 0, startMs });
|
|
30
|
+
class LoopLagSampler {
|
|
31
|
+
/* ์์ฑ์ ํ๋ผ๋ฏธํฐ ํ๋กํผํฐ(`private x = โฆ`)๋ ์ฐ์ง ์๋๋ค โ ์ํ์ด ์์ค๋ฅผ ๊ทธ๋๋ก ์คํํ๋๋ฐ
|
|
32
|
+
(ํ์
์ ๊ฑฐ ์คํ ๋ฐฉ์) ๊ทธ ๋ฌธ๋ฒ์ ์ง์๋์ง ์์ ํ์ผ ์ ์ฒด๊ฐ ์ด๋ฆฌ์ง ์๋๋ค. */
|
|
33
|
+
constructor(sampleMs = exports.LAG_SAMPLE_MS, stallMs = exports.LAG_STALL_MS, windowMs = exports.LAG_WINDOW_MS, now = Date.now) {
|
|
34
|
+
this.closed = null;
|
|
35
|
+
this.worstAtMs = null;
|
|
36
|
+
this.sampleMs = sampleMs;
|
|
37
|
+
this.stallMs = stallMs;
|
|
38
|
+
this.windowMs = windowMs;
|
|
39
|
+
this.now = now;
|
|
40
|
+
const t = this.now();
|
|
41
|
+
this.window = emptyWindow(t);
|
|
42
|
+
this.total = emptyWindow(t);
|
|
43
|
+
this.expectedMs = t + sampleMs;
|
|
44
|
+
}
|
|
45
|
+
/** ํ๋ณธ์ ํ๋ ๋ฃ๋๋ค โ ํ์ด๋จธ๊ฐ ๋ถ๋ฅด๊ณ , ์ํ์ ์ง์ ๋ถ๋ฅธ๋ค(์๊ณ๋ฅผ ๋ฐ์ด ๋ฃ์ด ์ฐ๋ค). */
|
|
46
|
+
sample(atMs = this.now()) {
|
|
47
|
+
const lag = Math.max(0, atMs - this.expectedMs);
|
|
48
|
+
this.expectedMs = atMs + this.sampleMs;
|
|
49
|
+
for (const w of [this.window, this.total]) {
|
|
50
|
+
w.samples += 1;
|
|
51
|
+
w.totalMs += lag;
|
|
52
|
+
if (lag > this.stallMs)
|
|
53
|
+
w.stalls += 1;
|
|
54
|
+
if (lag > w.maxMs)
|
|
55
|
+
w.maxMs = lag;
|
|
56
|
+
}
|
|
57
|
+
if (lag >= this.total.maxMs && lag > this.stallMs)
|
|
58
|
+
this.worstAtMs = atMs;
|
|
59
|
+
if (atMs - this.window.startMs >= this.windowMs) {
|
|
60
|
+
this.closed = { ...this.window, endMs: atMs };
|
|
61
|
+
this.window = emptyWindow(atMs);
|
|
62
|
+
}
|
|
63
|
+
return lag;
|
|
64
|
+
}
|
|
65
|
+
/** ๊ณ๊ธฐํ์ด ์ฝ๋ ๊ฐ. **ํ ์ฐฝ๋ ๋ซํ์ง ์์์ผ๋ฉด `recent` ๋ null** โ ์ฑ์ฐ๋ ์ค์ธ ์ฐฝ์ ๊ณผ์ ์ง๊ณ๋ค. */
|
|
66
|
+
view() {
|
|
67
|
+
return { recent: this.closed, total: this.total, worstAtMs: this.worstAtMs, sampleMs: this.sampleMs, stallMs: this.stallMs };
|
|
68
|
+
}
|
|
69
|
+
/** ํ๋ณธ ํ์ด๋จธ ๊ธฐ๋(1ํ) โ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ๋ง์ง ์๋๋ค. */
|
|
70
|
+
start() {
|
|
71
|
+
if (this.timer)
|
|
72
|
+
return;
|
|
73
|
+
this.timer = setInterval(() => this.sample(), this.sampleMs);
|
|
74
|
+
if (typeof this.timer?.unref === 'function')
|
|
75
|
+
this.timer.unref();
|
|
76
|
+
}
|
|
77
|
+
stop() {
|
|
78
|
+
if (!this.timer)
|
|
79
|
+
return;
|
|
80
|
+
clearInterval(this.timer);
|
|
81
|
+
this.timer = undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.LoopLagSampler = LoopLagSampler;
|
|
85
|
+
/** ํ๋ก์ธ์ค ํ๋์ ๋ฃจํ๋ฅผ ์ฌ๋ ๊ฒ์ด๋ฏ๋ก ํ๋ณธ๊ธฐ๋ ํ๋๋ค. */
|
|
86
|
+
exports.loopLag = new LoopLagSampler();
|
|
87
|
+
//# sourceMappingURL=loop-lag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-lag.js","sourceRoot":"","sources":["../../server/engine/loop-lag.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ์ด๋ฒคํธ ๋ฃจํ ์ง์ฒด โ **ํ๋ฉด์ด ๋๋ฆฐ ์ด์ ๋ฅผ ์ง์ด๋ด์ง ์๊ธฐ ์ํด.** ์์(import ์์).\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-21) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ใUI ๋ฐ์์ฑ์ด ๋๋ฆฌ๋คใ๋ฅผ ์ง๋จํ๋ ค ํ๋๋ฐ, ์๋ ๊ณ๊ธฐํ์ผ๋ก๋ ๋ต์ด ๋์ค์ง ์์๋ค. `twinLoad` ๋ **ํธ์์\n * ๊ณ์ธก๋ ์์
**๋ง ์ฌ๊ณ , `processCpuRatio` ๋ ํ๋ก์ธ์ค ์ ์ฒด๋ฅผ ์ฌ์ง๋ง **์ธ์ ์ผ๋ง๋ ๋ฉ์ท๋**๋ฅผ ๋งํ์ง\n * ๋ชปํ๋ค. ๋ฐ์์ HTTP ์ง์ฐ์ ์ฌ ๋ณด๋ ๊ฐ์ ์์ฒญ์ด 44ms ์ 5.8์ด๋ก ๊ฐ๋ผ์ก๋๋ฐ, ๊ทธ 5.8์ด๊ฐ ํธ์ ๋๋ฌธ์ธ์ง\n * webpack ์ฌ๋น๋ ๋๋ฌธ์ธ์ง ๋จ์ ์ฌ๊ธฐ๋ ๋๋ฌธ์ธ์ง **๊ฐ๋ฆด ๊ทผ๊ฑฐ๊ฐ ์์๋ค.**\n *\n * ๊ทผ๊ฑฐ ์์ด ์์ธ์ ๊ณ ๋ฅด๋ฉด ์๋ฑํ ๊ณณ์ ๊ณ ์น๋ค. ๊ทธ๋์ ๋ฃจํ๊ฐ ์ค์ ๋ก ์ผ๋ง๋ ๋งํ๋์ง๋ฅผ ์ฐ๋ค.\n *\n * โโ ์ด๋ป๊ฒ ์ฌ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ๊นจ์ด๋๋ ํ์ด๋จธ๋ฅผ ๋๊ณ , **์์ ์๊ฐ๊ณผ ์ค์ ์๊ฐ์ ์ฐจ์ด**๋ฅผ ๋ณธ๋ค. ๋ฃจํ๊ฐ ๋งํ ์์์ผ๋ฉด\n * ๊ทธ๋งํผ ๋ฆ๊ฒ ๊นจ์ด๋๋ค. ์ฌ๋ ๋น์ฉ์ ๊ทธ ์ฐจ์ด ๊ณ์ฐ ํ๋๋ฟ์ด๋ค(์ฐฝ๋ง๋ค ๊ฐ ๋ค์ฏ).\n *\n * ์ด ๊ฐ์ **์์ธ์ ๋งํ์ง ์๋๋ค** โ ใ200ms ์ด์ ๋งํ ์ผ์ด ์ด ์ฐฝ์์ ์ธ ๋ฒ, ๊ฐ์ฅ ๊ธด ๊ฒ์ 4.6์ดใ๊น์ง๊ฐ\n * ์ฌ์ค์ด๋ค. ์์ธ์ ๊ทธ ์๊ฐ์ ํธ์ ๋ถํ(`twinLoad`)์ ํ๋ก์ธ์ค CPU ์ ๋๋ํ ๋๊ณ ์ฌ๋์ด ๊ฐ๋ฆฐ๋ค.\n * ์ฌ์ง ์์ ๊ฒ์ 0 ์ผ๋ก ์ ์ง ์๋๋ค โ ํ ๋ฒ๋ ๊นจ์ด๋์ง ์์์ผ๋ฉด `null` ์ด๋ค.\n */\n\n/** ํ๋ณธ ๊ฐ๊ฒฉ(ms) โ ์ด์ดํ ํ์๊ฐ ์๋ค. ๊ธด ์ ์ฒด๋ฅผ ๋์น์ง ์๋ ์ ๋๋ฉด ๋๋ค. */\nexport const LAG_SAMPLE_MS = 500\n/** ์ด ๊ฐ์ ๋๋ ์ง์ฒด๋ง ใ์ ์ฒดใ๋ก ์ผ๋ค(ms). ์ฌ๋์ด ํ๋ฉด์์ ๋๋ผ๊ธฐ ์์ํ๋ ํฌ๊ธฐ. */\nexport const LAG_STALL_MS = 200\n/** ์ฐฝ ๊ธธ์ด(ms) โ `twinLoad` ์ ์ฐฝ๊ณผ ๊ฐ์ ํฌ๊ธฐ๋ก ๋์ด ๋๋ํ ์ฝ๋๋ค. */\nexport const LAG_WINDOW_MS = 10_000\n\nexport interface LoopLagWindow {\n /** ์ด ์ฐฝ์์ ๊ฐ์ฅ ๊ธธ๊ฒ ๋งํ ์๊ฐ(ms). */\n maxMs: number\n /** ์ ์ฒด(๋ฌธํฑ ์ด๊ณผ) ํ์. */\n stalls: number\n /** ํ๋ณธ ์ โ ๋ถ๋ชจ๋ค. */\n samples: number\n /** ์ง์ฒด ํฉ(ms) โ ํ๊ท ์ ์ฝ๋ ์ชฝ์์ ๋ธ๋ค. */\n totalMs: number\n /** ์ฐฝ์ด ์ด๋ฆฐ ์๊ฐ. */\n startMs: number\n}\n\nexport interface LoopLagView {\n /** ๋ง์ง๋ง์ผ๋ก ๋ซํ ์ฐฝ โ ใ์ง๊ธ ์ด๋ค๊ฐใ. ์์ง ํ ์ฐฝ๋ ์ ์ง๋ฌ์ผ๋ฉด null. */\n recent: (LoopLagWindow & { endMs: number }) | null\n /** ๊ธฐ๋ ์ดํ ๋์ . */\n total: LoopLagWindow\n /** ๊ธฐ๋ ์ดํ ๊ฐ์ฅ ๊ธธ๊ฒ ๋งํ ์๊ฐ(ms, epoch) โ ์ธ์ ์๋์ง๊ฐ ์์ธ์ ๊ฐ๋ฆฌ๋ ๋ฐ ์ฐ์ธ๋ค. */\n worstAtMs: number | null\n /** ํ๋ณธ ๊ฐ๊ฒฉ โ ์ฝ๋ ์ชฝ์ด ์ด ๊ฐ๋ณด๋ค ์งง์ ์ ์ฒด๋ ๋ชป ๋ณธ๋ค๋ ๊ฒ์ ์์์ผ ํ๋ค. */\n sampleMs: number\n /** ์ ์ฒด๋ก ์ธ๋ ๋ฌธํฑ. */\n stallMs: number\n}\n\nconst emptyWindow = (startMs: number): LoopLagWindow => ({ maxMs: 0, stalls: 0, samples: 0, totalMs: 0, startMs })\n\nexport class LoopLagSampler {\n private window: LoopLagWindow\n private closed: (LoopLagWindow & { endMs: number }) | null = null\n private total: LoopLagWindow\n private worstAtMs: number | null = null\n private timer: any\n private expectedMs: number\n\n private sampleMs: number\n private stallMs: number\n private windowMs: number\n private now: () => number\n\n /* ์์ฑ์ ํ๋ผ๋ฏธํฐ ํ๋กํผํฐ(`private x = โฆ`)๋ ์ฐ์ง ์๋๋ค โ ์ํ์ด ์์ค๋ฅผ ๊ทธ๋๋ก ์คํํ๋๋ฐ\n (ํ์
์ ๊ฑฐ ์คํ ๋ฐฉ์) ๊ทธ ๋ฌธ๋ฒ์ ์ง์๋์ง ์์ ํ์ผ ์ ์ฒด๊ฐ ์ด๋ฆฌ์ง ์๋๋ค. */\n constructor(sampleMs = LAG_SAMPLE_MS, stallMs = LAG_STALL_MS, windowMs = LAG_WINDOW_MS, now: () => number = Date.now) {\n this.sampleMs = sampleMs\n this.stallMs = stallMs\n this.windowMs = windowMs\n this.now = now\n const t = this.now()\n this.window = emptyWindow(t)\n this.total = emptyWindow(t)\n this.expectedMs = t + sampleMs\n }\n\n /** ํ๋ณธ์ ํ๋ ๋ฃ๋๋ค โ ํ์ด๋จธ๊ฐ ๋ถ๋ฅด๊ณ , ์ํ์ ์ง์ ๋ถ๋ฅธ๋ค(์๊ณ๋ฅผ ๋ฐ์ด ๋ฃ์ด ์ฐ๋ค). */\n sample(atMs = this.now()): number {\n const lag = Math.max(0, atMs - this.expectedMs)\n this.expectedMs = atMs + this.sampleMs\n for (const w of [this.window, this.total]) {\n w.samples += 1\n w.totalMs += lag\n if (lag > this.stallMs) w.stalls += 1\n if (lag > w.maxMs) w.maxMs = lag\n }\n if (lag >= this.total.maxMs && lag > this.stallMs) this.worstAtMs = atMs\n if (atMs - this.window.startMs >= this.windowMs) {\n this.closed = { ...this.window, endMs: atMs }\n this.window = emptyWindow(atMs)\n }\n return lag\n }\n\n /** ๊ณ๊ธฐํ์ด ์ฝ๋ ๊ฐ. **ํ ์ฐฝ๋ ๋ซํ์ง ์์์ผ๋ฉด `recent` ๋ null** โ ์ฑ์ฐ๋ ์ค์ธ ์ฐฝ์ ๊ณผ์ ์ง๊ณ๋ค. */\n view(): LoopLagView {\n return { recent: this.closed, total: this.total, worstAtMs: this.worstAtMs, sampleMs: this.sampleMs, stallMs: this.stallMs }\n }\n\n /** ํ๋ณธ ํ์ด๋จธ ๊ธฐ๋(1ํ) โ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ๋ง์ง ์๋๋ค. */\n start(): void {\n if (this.timer) return\n this.timer = setInterval(() => this.sample(), this.sampleMs)\n if (typeof this.timer?.unref === 'function') this.timer.unref()\n }\n\n stop(): void {\n if (!this.timer) return\n clearInterval(this.timer)\n this.timer = undefined\n }\n}\n\n/** ํ๋ก์ธ์ค ํ๋์ ๋ฃจํ๋ฅผ ์ฌ๋ ๊ฒ์ด๋ฏ๋ก ํ๋ณธ๊ธฐ๋ ํ๋๋ค. */\nexport const loopLag = new LoopLagSampler()\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/** ์ปค๋ ์ค๋
์ท์์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋ ๊ฒ๋ง. ๋๋จธ์ง ํ๋๋ ์ ํ์๊ฐ ์๋ค. */
|
|
2
|
+
export interface ModelGapSource {
|
|
3
|
+
locations?: {
|
|
4
|
+
id?: string;
|
|
5
|
+
origin?: string;
|
|
6
|
+
}[];
|
|
7
|
+
equipment?: {
|
|
8
|
+
id?: string;
|
|
9
|
+
origin?: string;
|
|
10
|
+
}[];
|
|
11
|
+
persons?: {
|
|
12
|
+
id?: string;
|
|
13
|
+
origin?: string;
|
|
14
|
+
}[];
|
|
15
|
+
/** ์ปค๋์ด ๋ด์ ์ค ๋ชฐ๋ผ ์ธ์ด ๋ ์ฌ๊ฑด โ ์ข
๋ฅ๋ณ ๊ฐ์์ ์ฒ์ยท๋ง์ง๋ง ์๊ฐ. */
|
|
16
|
+
unhandled?: {
|
|
17
|
+
eventType: string;
|
|
18
|
+
count: number;
|
|
19
|
+
firstAtMs?: number;
|
|
20
|
+
lastAtMs?: number;
|
|
21
|
+
}[];
|
|
22
|
+
/**
|
|
23
|
+
* EMS ์ํ โ **`energy` ์์ ์๋ค.**
|
|
24
|
+
*
|
|
25
|
+
* `unknownEquipment` ๋ฅผ ๋ฃจํธ์์ ์ฝ๊ณ ์์๋ค(2026-08-20์ ์ก์). ์ปค๋์ ๊ทธ๊ฒ์ `EnergyState` ์์
|
|
26
|
+
* ๋ด์ผ๋ฏ๋ก, ๋ฃจํธ์์ ์ฝ์ผ๋ฉด **์์ํ `null`** ์ด๋ค โ ์ค๋ฅ๋ ์์ด ใ์๋์ง ํธ์์ด ์๋๋คใ๋ก ์ฝํ๋ค.
|
|
27
|
+
* ๋๋ง ์ฝ๋ ํ๋๋ฅผ ์๋ชป๋ ๊ฒฝ๋ก์์ ์ฝ์ผ๋ฉด ์ด๋ ๊ฒ ์กฐ์ฉํ ์ฌ๋ผ์ง๋ค.
|
|
28
|
+
*
|
|
29
|
+
* ๊ณ๋ ์ง์ ์ `origin` ์ **์์ ์ ์๋ค**(์ ์ค๋
์ท์์ ์ด์ด๋ฐ์ ์ง์ ). ๊ทธ๋๋ ใ์ ์ธ๋์๋คใ๊ฐ
|
|
30
|
+
* ์๋๋ผ **๋ชจ๋ฅธ๋ค**๋ค.
|
|
31
|
+
*/
|
|
32
|
+
energy?: {
|
|
33
|
+
points?: {
|
|
34
|
+
id?: string;
|
|
35
|
+
origin?: string;
|
|
36
|
+
}[];
|
|
37
|
+
/** ๋ชจ๋ธ์ด ๋ชจ๋ฅด๋ ์ค๋น๊ฐ ์๋์ง ์ํ๋ฅผ ๋ณด๋ด ์จ ํ์. 0 ์ด๋ฉด ์ปค๋์ด ์ด ์นธ์ ๋ง๋ค์ง ์๋๋ค. */
|
|
38
|
+
unknownEquipment?: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* ํ๋ฉด์ ๋ด๋ id ์ ์ํ.
|
|
43
|
+
*
|
|
44
|
+
* ์คํ ํ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ค๋ฌด ๊ฐ๋ฉด ์ถฉ๋ถํ๊ณ , ์์ฒ์ด ์์ฒ ๊ฐ๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ(๋ชจ๋ธ์ ์์ ์ ๋ง์ถ ๊ฒฝ์ฐ)์
|
|
45
|
+
* ๋ชฉ๋ก์ผ๋ก ํ๋ฉด์ ์ฑ์ธ ์ด์ ๊ฐ ์๋ค. **๋์น ์๋ ํจ๊ป ๋ธ๋ค** โ ์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.
|
|
46
|
+
*/
|
|
47
|
+
export declare const GAP_ID_LIMIT = 20;
|
|
48
|
+
export interface ModelGapAxis {
|
|
49
|
+
/** ๊ด์ธก์ผ๋ก๋ง ์๊ฒ ๋ id ์. */
|
|
50
|
+
count: number;
|
|
51
|
+
/** ๊ทธ์ค ํ๋ฉด์ ์ฃ๋ ๊ฒ(์ต๋ `GAP_ID_LIMIT`). */
|
|
52
|
+
ids: string[];
|
|
53
|
+
/** ์ํ์์ ๋ฐ๋ ค๋ ์. 0 ์ด๋ฉด ์ ๋ถ ์ค์๋ค. */
|
|
54
|
+
more: number;
|
|
55
|
+
/**
|
|
56
|
+
* ์ถ์ฒ๋ฅผ **๋ชจ๋ฅด๋** ์ โ ํ์๊ฐ ์๋ ํญ๋ชฉ.
|
|
57
|
+
*
|
|
58
|
+
* ใ์ ์ธ๋์๋คใ๋ก ์ธ์ง ์๋๋ค. ๊ณ๋๊ธฐ๋ ์ด ํ์๊ฐ ๋ฆ๊ฒ ์๊ฒผ์ผ๋ฏ๋ก ์ ์ค๋
์ท์์ ์ด์ด๋ฐ์ ์ง์ ์๋
|
|
59
|
+
* ์นธ์ด ์๋ค(`undefined`). ๊ทธ๊ฒ์ ๋ง์คํฐ๋ก ์ธ๋ฉด ์คํ๋ฅผ ๋์น๊ณ , ๊ด์ธก์ผ๋ก ์ธ๋ฉด ์ ์์ ๋ฌธ์ ๋ก ๋ง๋ ๋ค.
|
|
60
|
+
* ๋ ๋ค ํ๋ฆฌ๋ฏ๋ก **๋ชจ๋ฅธ๋ค๊ณ ์ผ๋ค.**
|
|
61
|
+
*/
|
|
62
|
+
unknown: number;
|
|
63
|
+
}
|
|
64
|
+
export interface ModelGapView {
|
|
65
|
+
locations: ModelGapAxis;
|
|
66
|
+
equipment: ModelGapAxis;
|
|
67
|
+
persons: ModelGapAxis;
|
|
68
|
+
/**
|
|
69
|
+
* EMS ๊ณ๋ ์ง์ .
|
|
70
|
+
*
|
|
71
|
+
* โโ ์ด ์ถ์ด ๊ฐ์ฅ ๋ฌด๊ฒ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
72
|
+
* ๋ชจ๋ฅด๋ `meterId` ๋ ์กฐ์ฉํ ์ ๊ณ๋๊ธฐ๊ฐ ๋๊ณ ๊ทธ kW ๊ฐ ๊ทธ ํ์ฅ์ **์์ ๊ตฌ๊ฐยทํผํฌยท์๊ธ ํ์ **์
|
|
73
|
+
* ๋ํด์ง๋ค. ์คํ ํ๋๋ฉด ์ง์ง ๊ณ๋๊ธฐ๋ ๋ฉ์ถ๊ณ ์ ๋ น์ด ๋์ ๋๋ค โ ์ซ์๋ ๊ทธ๋ด๋ฏํ๊ณ ํ๋ฆฐ๋ค. ์๋ฆฌ ์คํ๋
|
|
74
|
+
* ์คํค๋งคํฑ์ด ๋น๋ ๊ฒ์ผ๋ก ๋๋ฌ๋์ง๋ง, ์ด๊ฑด ๊ทธ๋ด๋ฏํ ์ซ์๋ก ๋์จ๋ค.
|
|
75
|
+
*
|
|
76
|
+
* ์ปค๋์ด `origin` ์ **ํ๋ณธ๋ง๋ค ๋ค์ ๋ง์ถ๋ค** โ ์ ์ธ์ ์ ๋ณธ์ ๋ชจ๋ธ์ด๊ณ ๋ชจ๋ธ์ ์ฑํ์ผ๋ก ๋์ด๋๋ฏ๋ก,
|
|
77
|
+
* ํ ๋ฒ ์ฐ๊ณ ๋๋ฉด ๋์ค์ ์ ์ธ๋ ๊ณ๋๊ธฐ๊ฐ ์์ํ `observed` ๋ก ๋จ๋๋ค. ๊ทธ๋์ ์ด ๊ฐ์ ใ์ง๊ธ ๋ชจ๋ธ์
|
|
78
|
+
* ์๋๊ฐใ์ ๋ต์ด๊ณ , ใํ ๋ฒ ์คํ์๋คใ์ ๋ต์ด ์๋๋ค.
|
|
79
|
+
*/
|
|
80
|
+
meters: ModelGapAxis;
|
|
81
|
+
/** ์ธ ์ถ์ ํฉ โ ํ๋ฉด์ด ใ์๋ ์๋ใ๋ฅผ ํ ๋ฒ์ ๋ฌป๊ธฐ ์ํ ๊ฐ. */
|
|
82
|
+
total: number;
|
|
83
|
+
/** ์ปค๋์ด ๋ด์ ์ค ๋ชจ๋ฅธ ์ฌ๊ฑด๋ค(์ข
๋ฅ๋ณ). ์ฐธ์กฐ ๋ฌธ์ ์ ๋ค๋ฅธ ์ฌ์ค์ด๋ฏ๋ก ๋ฐ๋ก ๋ธ๋ค. */
|
|
84
|
+
unhandled: {
|
|
85
|
+
eventType: string;
|
|
86
|
+
count: number;
|
|
87
|
+
lastAt: string | null;
|
|
88
|
+
}[];
|
|
89
|
+
/** EMS: ๋ชจ๋ธ์ด ๋ชจ๋ฅด๋ ์ค๋น์ ์๋์ง ๋ณด๊ณ ํ์. ์์ผ๋ฉด `null`(0 ๊ณผ ๊ตฌ๋ณํ๋ค). */
|
|
90
|
+
unknownEquipmentReports: number | null;
|
|
91
|
+
/**
|
|
92
|
+
* ์์ง ๋ฎ์ง ๋ชปํ๋ ์ถ โ **๋ชจ๋ฅด๋ ๊ฒ์ ๋ชจ๋ฅธ๋ค๊ณ ๋งํ๋ค.**
|
|
93
|
+
*
|
|
94
|
+
* ๊ณ๋๊ธฐ๋ ์ปค๋ 0.7.39 ๋ถํฐ ๋ฎ์ธ๋ค(๊ทธ ์ ์๋ `origin` ํ์๊ฐ ์์ด ์คํ๋ฅผ ์ฐพ์ ์ค ์ ์์๋ค).
|
|
95
|
+
* ๋น์ด ์๋ ๊ฒ์ด ์ ์์ด๊ณ , ์ ์ถ์ด ํ์ ์์ด ๋ค์ด์ค๋ฉด ์ฌ๊ธฐ์ ์ด๋ฆ์ ๋ฃ๋๋ค โ ํ๋ฉด์ด ใ๋ค ์ฐพ์
|
|
96
|
+
* ์ค๋คใ๊ณ ๋งํ์ง ์๊ฒ.
|
|
97
|
+
*/
|
|
98
|
+
notCovered: string[];
|
|
99
|
+
}
|
|
100
|
+
/** ๊ณ๋๊ธฐ ์ถ์ด ์์ง ๋ฎ์ด์ง ์๋ ์ด์ โ ํ๋ฉด์ด ๊ทธ๋๋ก ๋งํ ์ ์๊ฒ ์ด๋ฆ์ ์ฌ๊ธฐ ๋๋ค. */
|
|
101
|
+
export declare const NOT_COVERED_METERS = "meters";
|
|
102
|
+
/**
|
|
103
|
+
* ์ค๋
์ท โ ๋ชจ๋ธ ๊ฐญ.
|
|
104
|
+
*
|
|
105
|
+
* ์ค๋
์ท์ด ์์ผ๋ฉด `null` ์ด๋ค โ **0 ์ด ์๋๋ค.** ํธ์์ด ๋์ง ์์ผ๋ฉด ๋น๊ตํ ์๋๊ฐ ์๊ณ , ใ์๋คใ์
|
|
106
|
+
* ใ์ธ์ด ๋ณด์ง ๋ชปํ๋คใ๋ ๋ค๋ฅธ ์ฌ์ค์ด๋ค(๋ชจ๋ธ ์ธ์คํ์
์ด ๊ฐ์ ๊ท์จ์ ์ด๋ค).
|
|
107
|
+
*/
|
|
108
|
+
export declare function modelGapOf(snapshot: ModelGapSource | null | undefined): ModelGapView | null;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* **์๋ณธ์ด ๋งํ ์ ์๋ ๊ฒ** โ ๋ฏธํด๊ฒฐ ์ฐธ์กฐ๋ฅผ ์ธ๋ ํ ์๋ฆฌ. ์์(import ์์).
|
|
4
|
+
*
|
|
5
|
+
* โโ ๋ฌด์์ ๋ตํ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* ์์ฒ์ด ์ฐ๋ฆฌ ๋ชจ๋ธ์ ์๋ id ๋ฅผ ๋ณด๋ด๋ฉด ์ด๋ป๊ฒ ๋๋. ์ ์
๋ฌธ(`ingestCanonicalRecords`)์ **๊ฑฐ๋ถํ์ง
|
|
7
|
+
* ์๋๋ค** โ ์ค์ธก์ผ๋ก ํ์ธํ๋ค(2026-08-20):
|
|
8
|
+
*
|
|
9
|
+
* ๋ชจ๋ฅด๋ ๋ก์ผ์ด์
ใ์คํ-99ใ โ ํต๊ณผ
|
|
10
|
+
* ๋ชจ๋ฅด๋ bizStep ใPUTAWAY_X17ใ โ ํต๊ณผ
|
|
11
|
+
* ๋ชจ๋ฅด๋ ๊ณ๋๊ธฐ ใMMXU-์คํ-99ใ โ ํต๊ณผ
|
|
12
|
+
*
|
|
13
|
+
* ๊ฑฐ๋ถํ์ง ์๋ ๊ฒ์ด ์ณ๋ค. ์์ฒ์ด ๋ชจ๋ธ๋ณด๋ค ๋จผ์ ์ ๋ก์ผ์ด์
์ ๋งํ๋ ๊ฒ์ ์ ์์ด๊ณ (๊ตฌ์กฐ ๊ฐฑ์ ์ ๋ฆ๊ฒ ์จ๋ค),
|
|
14
|
+
* ๊ฑฐ๋ถํ๋ฉด ๊ทธ ์ ํ ๊ณ์ธก์ ์๋๋ค. ๊ทธ๋์ ์ปค๋์ **ํก์ํ๊ณ ํ์ํ๋ค** โ ๋ง์คํฐ์ ์๋ ๋ก์ผ์ด์
์
|
|
15
|
+
* `origin: 'observed'` ๋ก ์น๊ฒฉ๋์ด ์ค๋
์ท์ ์ค๋ฆฐ๋ค(`ObservedReducer.touchLocation`).
|
|
16
|
+
*
|
|
17
|
+
* โโ ์ ์ด ํ์ผ์ด ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
18
|
+
* ๊ทธ ํ์๋ฅผ ์ฝ๋ ๊ณณ์ด **๋ชจ๋ธ ์ธ์คํ์
ํ๋ฉด ํ๋**์๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ฌ์ค์ ํ์๋ก ํ๋ ์ฌ๋์ ใ์ด ํธ์์ด
|
|
19
|
+
* ํ์ฅ๊ณผ ๋ง์ถฐ์ง๊ณ ์๋ใ๋ฅผ ๋ณด๋ ์ฌ๋์ด๋ค โ ์์ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ฅด๋ ๋ก์ผ์ด์
๋ง ๋ณด๋ด๊ณ ์์ผ๋ฉด ํธ์์ ๋๋๋ฐ
|
|
20
|
+
* ์คํค๋งคํฑ์ ๋น์ด ์๊ณ , ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ใ๋น ๊ณต์ฅใ์ด๋ผ ๋ถ๋ฌ ์จ ์ํ๋ค.
|
|
21
|
+
*
|
|
22
|
+
* ๋์ถ์ ๋ ๊ณณ์ ์ ์ผ๋ฉด ๋ ํ๋ฉด์ด ๋ค๋ฅธ ์๋ฅผ ๋งํ๊ฒ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ ํ ๋ฒ๋ง ๋๋ค.
|
|
23
|
+
*
|
|
24
|
+
* โโ ํ์ ์ ๋ฐ๊พธ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
25
|
+
* ๋๊ธฐํ ํ์ (`syncVerdictOf`)์ **ํผ๋**๋ฅผ ๋งํ๋ค: ์ค๊ณ ์๋, ํต๊ณผํ๋. ์ด ๊ฐญ์ **๋ชจ๋ธ**์ ๋งํ๋ค:
|
|
26
|
+
* ์์ฒ์ด ์๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ๋. ๋์ ํ ํ์ ์ ์์ผ๋ฉด ใ์ ์
์ ์ ์์ธ๋ฐ ๋ชจ๋ธ์ด ๋ค์ฒ์ก๋คใ์
|
|
27
|
+
* ใ์ ์
์ด ๋งํ๋คใ๊ฐ ๊ฐ์ ์์ผ๋ก ๋ณด์ด๊ณ , ์ฒ๋ฐฉ์ด ์์ ํ ๋ค๋ฅด๋ค.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.NOT_COVERED_METERS = exports.GAP_ID_LIMIT = void 0;
|
|
31
|
+
exports.modelGapOf = modelGapOf;
|
|
32
|
+
/**
|
|
33
|
+
* ํ๋ฉด์ ๋ด๋ id ์ ์ํ.
|
|
34
|
+
*
|
|
35
|
+
* ์คํ ํ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ค๋ฌด ๊ฐ๋ฉด ์ถฉ๋ถํ๊ณ , ์์ฒ์ด ์์ฒ ๊ฐ๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ(๋ชจ๋ธ์ ์์ ์ ๋ง์ถ ๊ฒฝ์ฐ)์
|
|
36
|
+
* ๋ชฉ๋ก์ผ๋ก ํ๋ฉด์ ์ฑ์ธ ์ด์ ๊ฐ ์๋ค. **๋์น ์๋ ํจ๊ป ๋ธ๋ค** โ ์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.
|
|
37
|
+
*/
|
|
38
|
+
exports.GAP_ID_LIMIT = 20;
|
|
39
|
+
/** ๊ณ๋๊ธฐ ์ถ์ด ์์ง ๋ฎ์ด์ง ์๋ ์ด์ โ ํ๋ฉด์ด ๊ทธ๋๋ก ๋งํ ์ ์๊ฒ ์ด๋ฆ์ ์ฌ๊ธฐ ๋๋ค. */
|
|
40
|
+
exports.NOT_COVERED_METERS = 'meters';
|
|
41
|
+
function axisOf(rows) {
|
|
42
|
+
const ids = [];
|
|
43
|
+
let count = 0;
|
|
44
|
+
let unknown = 0;
|
|
45
|
+
for (const r of rows ?? []) {
|
|
46
|
+
if (r?.origin === 'observed') {
|
|
47
|
+
count++;
|
|
48
|
+
if (ids.length < exports.GAP_ID_LIMIT)
|
|
49
|
+
ids.push(String(r.id ?? ''));
|
|
50
|
+
}
|
|
51
|
+
else if (r?.origin !== 'master') {
|
|
52
|
+
/* ํ์๊ฐ ์๋ค โ ๋ง์คํฐ๋ก๋ ๊ด์ธก์ผ๋ก๋ ์ธ์ง ์๋๋ค. ๋ชจ๋ฅด๋ ๊ฒ์ ๋ชจ๋ฅธ๋ค๊ณ ์ผ๋ค. */
|
|
53
|
+
unknown++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { count, ids, more: Math.max(0, count - ids.length), unknown };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* ์ค๋
์ท โ ๋ชจ๋ธ ๊ฐญ.
|
|
60
|
+
*
|
|
61
|
+
* ์ค๋
์ท์ด ์์ผ๋ฉด `null` ์ด๋ค โ **0 ์ด ์๋๋ค.** ํธ์์ด ๋์ง ์์ผ๋ฉด ๋น๊ตํ ์๋๊ฐ ์๊ณ , ใ์๋คใ์
|
|
62
|
+
* ใ์ธ์ด ๋ณด์ง ๋ชปํ๋คใ๋ ๋ค๋ฅธ ์ฌ์ค์ด๋ค(๋ชจ๋ธ ์ธ์คํ์
์ด ๊ฐ์ ๊ท์จ์ ์ด๋ค).
|
|
63
|
+
*/
|
|
64
|
+
function modelGapOf(snapshot) {
|
|
65
|
+
if (!snapshot)
|
|
66
|
+
return null;
|
|
67
|
+
const locations = axisOf(snapshot.locations);
|
|
68
|
+
const equipment = axisOf(snapshot.equipment);
|
|
69
|
+
const persons = axisOf(snapshot.persons);
|
|
70
|
+
const meters = axisOf(snapshot.energy?.points);
|
|
71
|
+
return {
|
|
72
|
+
locations,
|
|
73
|
+
equipment,
|
|
74
|
+
persons,
|
|
75
|
+
meters,
|
|
76
|
+
total: locations.count + equipment.count + persons.count + meters.count,
|
|
77
|
+
unhandled: (snapshot.unhandled ?? []).map(u => ({
|
|
78
|
+
eventType: u.eventType,
|
|
79
|
+
count: u.count,
|
|
80
|
+
/* ๋ง์ง๋ง ์๊ฐ์ด ๋ฉ์ถ ์ข
๋ฅ๋ ์ด๋ฏธ ๊ณ ์ณ์ง ๊ฒ์ด๋ค. ์์ผ๋ฉด ์ง์ด๋ด์ง ์๋๋ค. */
|
|
81
|
+
lastAt: Number.isFinite(u.lastAtMs) ? new Date(u.lastAtMs).toISOString() : null
|
|
82
|
+
})),
|
|
83
|
+
/*
|
|
84
|
+
* ์ปค๋์ 0 ์ด๋ฉด ์ด ์นธ์ ๋ง๋ค์ง ์๋๋ค. ๊ทธ๋์ ใ์์ใ์ ๋ ๋ป์ด๋ค โ ์๋์ง ํธ์์ด ์๋๊ฑฐ๋, ์ธ์๊ณ
|
|
85
|
+
* 0 ์ด์๋ค. ๋์ ๊ฐ๋ฅด๋ ค๋ฉด `energy` ์์ฒด๊ฐ ์๋์ง๋ฅผ ๋ณธ๋ค: ์์ผ๋ฉด ์ธ์๊ณ 0 ์ด๋ค.
|
|
86
|
+
*/
|
|
87
|
+
unknownEquipmentReports: typeof snapshot.energy?.unknownEquipment === 'number' ? snapshot.energy.unknownEquipment : snapshot.energy ? 0 : null,
|
|
88
|
+
/*
|
|
89
|
+
* ์ด์ ๊ณ๋๊ธฐ๋ ๋ฎ๋๋ค(์ปค๋ 0.7.39 ๊ฐ `MeterPointState.origin` ์ ๋ธ๋ค). ๋ฎ์ง ๋ชปํ๋ ์ถ์ด ์๊ธฐ๋ฉด
|
|
90
|
+
* ๋ค์ ์ฌ๊ธฐ์ ์ด๋ฆ์ ๋ฃ๋๋ค โ ํ๋ฉด์ด ใ๋ค ์ฐพ์ ์ค๋คใ๊ณ ๋งํ์ง ์๊ฒ.
|
|
91
|
+
*/
|
|
92
|
+
notCovered: []
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=model-gap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-gap.js","sourceRoot":"","sources":["../../server/engine/model-gap.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;AA6GH,gCAgCC;AAnHD;;;;;GAKG;AACU,QAAA,YAAY,GAAG,EAAE,CAAA;AAoD9B,uDAAuD;AAC1C,QAAA,kBAAkB,GAAG,QAAQ,CAAA;AAE1C,SAAS,MAAM,CAAC,IAAoD;IAClE,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,MAAM,KAAK,UAAU,EAAE,CAAC;YAC7B,KAAK,EAAE,CAAA;YACP,IAAI,GAAG,CAAC,MAAM,GAAG,oBAAY;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;aAAM,IAAI,CAAC,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClC,kDAAkD;YAClD,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;AACvE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,UAAU,CAAC,QAA2C;IACpE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE9C,OAAO;QACL,SAAS;QACT,SAAS;QACT,OAAO;QACP,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;QACvE,SAAS,EAAE,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,8CAA8C;YAC9C,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAkB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;SAC1F,CAAC,CAAC;QACH;;;WAGG;QACH,uBAAuB,EACrB,OAAO,QAAQ,CAAC,MAAM,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACvH;;;WAGG;QACH,UAAU,EAAE,EAAE;KACf,CAAA;AACH,CAAC","sourcesContent":["/*\n * **์๋ณธ์ด ๋งํ ์ ์๋ ๊ฒ** โ ๋ฏธํด๊ฒฐ ์ฐธ์กฐ๋ฅผ ์ธ๋ ํ ์๋ฆฌ. ์์(import ์์).\n *\n * โโ ๋ฌด์์ ๋ตํ๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์ฒ์ด ์ฐ๋ฆฌ ๋ชจ๋ธ์ ์๋ id ๋ฅผ ๋ณด๋ด๋ฉด ์ด๋ป๊ฒ ๋๋. ์ ์
๋ฌธ(`ingestCanonicalRecords`)์ **๊ฑฐ๋ถํ์ง\n * ์๋๋ค** โ ์ค์ธก์ผ๋ก ํ์ธํ๋ค(2026-08-20):\n *\n * ๋ชจ๋ฅด๋ ๋ก์ผ์ด์
ใ์คํ-99ใ โ ํต๊ณผ\n * ๋ชจ๋ฅด๋ bizStep ใPUTAWAY_X17ใ โ ํต๊ณผ\n * ๋ชจ๋ฅด๋ ๊ณ๋๊ธฐ ใMMXU-์คํ-99ใ โ ํต๊ณผ\n *\n * ๊ฑฐ๋ถํ์ง ์๋ ๊ฒ์ด ์ณ๋ค. ์์ฒ์ด ๋ชจ๋ธ๋ณด๋ค ๋จผ์ ์ ๋ก์ผ์ด์
์ ๋งํ๋ ๊ฒ์ ์ ์์ด๊ณ (๊ตฌ์กฐ ๊ฐฑ์ ์ ๋ฆ๊ฒ ์จ๋ค),\n * ๊ฑฐ๋ถํ๋ฉด ๊ทธ ์ ํ ๊ณ์ธก์ ์๋๋ค. ๊ทธ๋์ ์ปค๋์ **ํก์ํ๊ณ ํ์ํ๋ค** โ ๋ง์คํฐ์ ์๋ ๋ก์ผ์ด์
์\n * `origin: 'observed'` ๋ก ์น๊ฒฉ๋์ด ์ค๋
์ท์ ์ค๋ฆฐ๋ค(`ObservedReducer.touchLocation`).\n *\n * โโ ์ ์ด ํ์ผ์ด ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ทธ ํ์๋ฅผ ์ฝ๋ ๊ณณ์ด **๋ชจ๋ธ ์ธ์คํ์
ํ๋ฉด ํ๋**์๋ค. ๊ทธ๋ฐ๋ฐ ์ด ์ฌ์ค์ ํ์๋ก ํ๋ ์ฌ๋์ ใ์ด ํธ์์ด\n * ํ์ฅ๊ณผ ๋ง์ถฐ์ง๊ณ ์๋ใ๋ฅผ ๋ณด๋ ์ฌ๋์ด๋ค โ ์์ฒ์ด ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ฅด๋ ๋ก์ผ์ด์
๋ง ๋ณด๋ด๊ณ ์์ผ๋ฉด ํธ์์ ๋๋๋ฐ\n * ์คํค๋งคํฑ์ ๋น์ด ์๊ณ , ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ใ๋น ๊ณต์ฅใ์ด๋ผ ๋ถ๋ฌ ์จ ์ํ๋ค.\n *\n * ๋์ถ์ ๋ ๊ณณ์ ์ ์ผ๋ฉด ๋ ํ๋ฉด์ด ๋ค๋ฅธ ์๋ฅผ ๋งํ๊ฒ ๋๋ค. ๊ทธ๋์ ์ฌ๊ธฐ ํ ๋ฒ๋ง ๋๋ค.\n *\n * โโ ํ์ ์ ๋ฐ๊พธ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋๊ธฐํ ํ์ (`syncVerdictOf`)์ **ํผ๋**๋ฅผ ๋งํ๋ค: ์ค๊ณ ์๋, ํต๊ณผํ๋. ์ด ๊ฐญ์ **๋ชจ๋ธ**์ ๋งํ๋ค:\n * ์์ฒ์ด ์๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ๋. ๋์ ํ ํ์ ์ ์์ผ๋ฉด ใ์ ์
์ ์ ์์ธ๋ฐ ๋ชจ๋ธ์ด ๋ค์ฒ์ก๋คใ์\n * ใ์ ์
์ด ๋งํ๋คใ๊ฐ ๊ฐ์ ์์ผ๋ก ๋ณด์ด๊ณ , ์ฒ๋ฐฉ์ด ์์ ํ ๋ค๋ฅด๋ค.\n */\n\n/** ์ปค๋ ์ค๋
์ท์์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋ ๊ฒ๋ง. ๋๋จธ์ง ํ๋๋ ์ ํ์๊ฐ ์๋ค. */\nexport interface ModelGapSource {\n locations?: { id?: string; origin?: string }[]\n equipment?: { id?: string; origin?: string }[]\n persons?: { id?: string; origin?: string }[]\n /** ์ปค๋์ด ๋ด์ ์ค ๋ชฐ๋ผ ์ธ์ด ๋ ์ฌ๊ฑด โ ์ข
๋ฅ๋ณ ๊ฐ์์ ์ฒ์ยท๋ง์ง๋ง ์๊ฐ. */\n unhandled?: { eventType: string; count: number; firstAtMs?: number; lastAtMs?: number }[]\n /**\n * EMS ์ํ โ **`energy` ์์ ์๋ค.**\n *\n * `unknownEquipment` ๋ฅผ ๋ฃจํธ์์ ์ฝ๊ณ ์์๋ค(2026-08-20์ ์ก์). ์ปค๋์ ๊ทธ๊ฒ์ `EnergyState` ์์\n * ๋ด์ผ๋ฏ๋ก, ๋ฃจํธ์์ ์ฝ์ผ๋ฉด **์์ํ `null`** ์ด๋ค โ ์ค๋ฅ๋ ์์ด ใ์๋์ง ํธ์์ด ์๋๋คใ๋ก ์ฝํ๋ค.\n * ๋๋ง ์ฝ๋ ํ๋๋ฅผ ์๋ชป๋ ๊ฒฝ๋ก์์ ์ฝ์ผ๋ฉด ์ด๋ ๊ฒ ์กฐ์ฉํ ์ฌ๋ผ์ง๋ค.\n *\n * ๊ณ๋ ์ง์ ์ `origin` ์ **์์ ์ ์๋ค**(์ ์ค๋
์ท์์ ์ด์ด๋ฐ์ ์ง์ ). ๊ทธ๋๋ ใ์ ์ธ๋์๋คใ๊ฐ\n * ์๋๋ผ **๋ชจ๋ฅธ๋ค**๋ค.\n */\n energy?: {\n points?: { id?: string; origin?: string }[]\n /** ๋ชจ๋ธ์ด ๋ชจ๋ฅด๋ ์ค๋น๊ฐ ์๋์ง ์ํ๋ฅผ ๋ณด๋ด ์จ ํ์. 0 ์ด๋ฉด ์ปค๋์ด ์ด ์นธ์ ๋ง๋ค์ง ์๋๋ค. */\n unknownEquipment?: number\n }\n}\n\n/**\n * ํ๋ฉด์ ๋ด๋ id ์ ์ํ.\n *\n * ์คํ ํ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ค๋ฌด ๊ฐ๋ฉด ์ถฉ๋ถํ๊ณ , ์์ฒ์ด ์์ฒ ๊ฐ๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ(๋ชจ๋ธ์ ์์ ์ ๋ง์ถ ๊ฒฝ์ฐ)์\n * ๋ชฉ๋ก์ผ๋ก ํ๋ฉด์ ์ฑ์ธ ์ด์ ๊ฐ ์๋ค. **๋์น ์๋ ํจ๊ป ๋ธ๋ค** โ ์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.\n */\nexport const GAP_ID_LIMIT = 20\n\nexport interface ModelGapAxis {\n /** ๊ด์ธก์ผ๋ก๋ง ์๊ฒ ๋ id ์. */\n count: number\n /** ๊ทธ์ค ํ๋ฉด์ ์ฃ๋ ๊ฒ(์ต๋ `GAP_ID_LIMIT`). */\n ids: string[]\n /** ์ํ์์ ๋ฐ๋ ค๋ ์. 0 ์ด๋ฉด ์ ๋ถ ์ค์๋ค. */\n more: number\n /**\n * ์ถ์ฒ๋ฅผ **๋ชจ๋ฅด๋** ์ โ ํ์๊ฐ ์๋ ํญ๋ชฉ.\n *\n * ใ์ ์ธ๋์๋คใ๋ก ์ธ์ง ์๋๋ค. ๊ณ๋๊ธฐ๋ ์ด ํ์๊ฐ ๋ฆ๊ฒ ์๊ฒผ์ผ๋ฏ๋ก ์ ์ค๋
์ท์์ ์ด์ด๋ฐ์ ์ง์ ์๋\n * ์นธ์ด ์๋ค(`undefined`). ๊ทธ๊ฒ์ ๋ง์คํฐ๋ก ์ธ๋ฉด ์คํ๋ฅผ ๋์น๊ณ , ๊ด์ธก์ผ๋ก ์ธ๋ฉด ์ ์์ ๋ฌธ์ ๋ก ๋ง๋ ๋ค.\n * ๋ ๋ค ํ๋ฆฌ๋ฏ๋ก **๋ชจ๋ฅธ๋ค๊ณ ์ผ๋ค.**\n */\n unknown: number\n}\n\nexport interface ModelGapView {\n locations: ModelGapAxis\n equipment: ModelGapAxis\n persons: ModelGapAxis\n /**\n * EMS ๊ณ๋ ์ง์ .\n *\n * โโ ์ด ์ถ์ด ๊ฐ์ฅ ๋ฌด๊ฒ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ชจ๋ฅด๋ `meterId` ๋ ์กฐ์ฉํ ์ ๊ณ๋๊ธฐ๊ฐ ๋๊ณ ๊ทธ kW ๊ฐ ๊ทธ ํ์ฅ์ **์์ ๊ตฌ๊ฐยทํผํฌยท์๊ธ ํ์ **์\n * ๋ํด์ง๋ค. ์คํ ํ๋๋ฉด ์ง์ง ๊ณ๋๊ธฐ๋ ๋ฉ์ถ๊ณ ์ ๋ น์ด ๋์ ๋๋ค โ ์ซ์๋ ๊ทธ๋ด๋ฏํ๊ณ ํ๋ฆฐ๋ค. ์๋ฆฌ ์คํ๋\n * ์คํค๋งคํฑ์ด ๋น๋ ๊ฒ์ผ๋ก ๋๋ฌ๋์ง๋ง, ์ด๊ฑด ๊ทธ๋ด๋ฏํ ์ซ์๋ก ๋์จ๋ค.\n *\n * ์ปค๋์ด `origin` ์ **ํ๋ณธ๋ง๋ค ๋ค์ ๋ง์ถ๋ค** โ ์ ์ธ์ ์ ๋ณธ์ ๋ชจ๋ธ์ด๊ณ ๋ชจ๋ธ์ ์ฑํ์ผ๋ก ๋์ด๋๋ฏ๋ก,\n * ํ ๋ฒ ์ฐ๊ณ ๋๋ฉด ๋์ค์ ์ ์ธ๋ ๊ณ๋๊ธฐ๊ฐ ์์ํ `observed` ๋ก ๋จ๋๋ค. ๊ทธ๋์ ์ด ๊ฐ์ ใ์ง๊ธ ๋ชจ๋ธ์\n * ์๋๊ฐใ์ ๋ต์ด๊ณ , ใํ ๋ฒ ์คํ์๋คใ์ ๋ต์ด ์๋๋ค.\n */\n meters: ModelGapAxis\n /** ์ธ ์ถ์ ํฉ โ ํ๋ฉด์ด ใ์๋ ์๋ใ๋ฅผ ํ ๋ฒ์ ๋ฌป๊ธฐ ์ํ ๊ฐ. */\n total: number\n /** ์ปค๋์ด ๋ด์ ์ค ๋ชจ๋ฅธ ์ฌ๊ฑด๋ค(์ข
๋ฅ๋ณ). ์ฐธ์กฐ ๋ฌธ์ ์ ๋ค๋ฅธ ์ฌ์ค์ด๋ฏ๋ก ๋ฐ๋ก ๋ธ๋ค. */\n unhandled: { eventType: string; count: number; lastAt: string | null }[]\n /** EMS: ๋ชจ๋ธ์ด ๋ชจ๋ฅด๋ ์ค๋น์ ์๋์ง ๋ณด๊ณ ํ์. ์์ผ๋ฉด `null`(0 ๊ณผ ๊ตฌ๋ณํ๋ค). */\n unknownEquipmentReports: number | null\n /**\n * ์์ง ๋ฎ์ง ๋ชปํ๋ ์ถ โ **๋ชจ๋ฅด๋ ๊ฒ์ ๋ชจ๋ฅธ๋ค๊ณ ๋งํ๋ค.**\n *\n * ๊ณ๋๊ธฐ๋ ์ปค๋ 0.7.39 ๋ถํฐ ๋ฎ์ธ๋ค(๊ทธ ์ ์๋ `origin` ํ์๊ฐ ์์ด ์คํ๋ฅผ ์ฐพ์ ์ค ์ ์์๋ค).\n * ๋น์ด ์๋ ๊ฒ์ด ์ ์์ด๊ณ , ์ ์ถ์ด ํ์ ์์ด ๋ค์ด์ค๋ฉด ์ฌ๊ธฐ์ ์ด๋ฆ์ ๋ฃ๋๋ค โ ํ๋ฉด์ด ใ๋ค ์ฐพ์\n * ์ค๋คใ๊ณ ๋งํ์ง ์๊ฒ.\n */\n notCovered: string[]\n}\n\n/** ๊ณ๋๊ธฐ ์ถ์ด ์์ง ๋ฎ์ด์ง ์๋ ์ด์ โ ํ๋ฉด์ด ๊ทธ๋๋ก ๋งํ ์ ์๊ฒ ์ด๋ฆ์ ์ฌ๊ธฐ ๋๋ค. */\nexport const NOT_COVERED_METERS = 'meters'\n\nfunction axisOf(rows: { id?: string; origin?: string }[] | undefined): ModelGapAxis {\n const ids: string[] = []\n let count = 0\n let unknown = 0\n for (const r of rows ?? []) {\n if (r?.origin === 'observed') {\n count++\n if (ids.length < GAP_ID_LIMIT) ids.push(String(r.id ?? ''))\n } else if (r?.origin !== 'master') {\n /* ํ์๊ฐ ์๋ค โ ๋ง์คํฐ๋ก๋ ๊ด์ธก์ผ๋ก๋ ์ธ์ง ์๋๋ค. ๋ชจ๋ฅด๋ ๊ฒ์ ๋ชจ๋ฅธ๋ค๊ณ ์ผ๋ค. */\n unknown++\n }\n }\n return { count, ids, more: Math.max(0, count - ids.length), unknown }\n}\n\n/**\n * ์ค๋
์ท โ ๋ชจ๋ธ ๊ฐญ.\n *\n * ์ค๋
์ท์ด ์์ผ๋ฉด `null` ์ด๋ค โ **0 ์ด ์๋๋ค.** ํธ์์ด ๋์ง ์์ผ๋ฉด ๋น๊ตํ ์๋๊ฐ ์๊ณ , ใ์๋คใ์\n * ใ์ธ์ด ๋ณด์ง ๋ชปํ๋คใ๋ ๋ค๋ฅธ ์ฌ์ค์ด๋ค(๋ชจ๋ธ ์ธ์คํ์
์ด ๊ฐ์ ๊ท์จ์ ์ด๋ค).\n */\nexport function modelGapOf(snapshot: ModelGapSource | null | undefined): ModelGapView | null {\n if (!snapshot) return null\n\n const locations = axisOf(snapshot.locations)\n const equipment = axisOf(snapshot.equipment)\n const persons = axisOf(snapshot.persons)\n const meters = axisOf(snapshot.energy?.points)\n\n return {\n locations,\n equipment,\n persons,\n meters,\n total: locations.count + equipment.count + persons.count + meters.count,\n unhandled: (snapshot.unhandled ?? []).map(u => ({\n eventType: u.eventType,\n count: u.count,\n /* ๋ง์ง๋ง ์๊ฐ์ด ๋ฉ์ถ ์ข
๋ฅ๋ ์ด๋ฏธ ๊ณ ์ณ์ง ๊ฒ์ด๋ค. ์์ผ๋ฉด ์ง์ด๋ด์ง ์๋๋ค. */\n lastAt: Number.isFinite(u.lastAtMs) ? new Date(u.lastAtMs as number).toISOString() : null\n })),\n /*\n * ์ปค๋์ 0 ์ด๋ฉด ์ด ์นธ์ ๋ง๋ค์ง ์๋๋ค. ๊ทธ๋์ ใ์์ใ์ ๋ ๋ป์ด๋ค โ ์๋์ง ํธ์์ด ์๋๊ฑฐ๋, ์ธ์๊ณ \n * 0 ์ด์๋ค. ๋์ ๊ฐ๋ฅด๋ ค๋ฉด `energy` ์์ฒด๊ฐ ์๋์ง๋ฅผ ๋ณธ๋ค: ์์ผ๋ฉด ์ธ์๊ณ 0 ์ด๋ค.\n */\n unknownEquipmentReports:\n typeof snapshot.energy?.unknownEquipment === 'number' ? snapshot.energy.unknownEquipment : snapshot.energy ? 0 : null,\n /*\n * ์ด์ ๊ณ๋๊ธฐ๋ ๋ฎ๋๋ค(์ปค๋ 0.7.39 ๊ฐ `MeterPointState.origin` ์ ๋ธ๋ค). ๋ฎ์ง ๋ชปํ๋ ์ถ์ด ์๊ธฐ๋ฉด\n * ๋ค์ ์ฌ๊ธฐ์ ์ด๋ฆ์ ๋ฃ๋๋ค โ ํ๋ฉด์ด ใ๋ค ์ฐพ์ ์ค๋คใ๊ณ ๋งํ์ง ์๊ฒ.\n */\n notCovered: []\n }\n}\n"]}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
export type RestartPolicy = 'resync' | 'resume' | 'reset';
|
|
3
3
|
export declare const RESTART_POLICIES: readonly RestartPolicy[];
|
|
4
4
|
/**
|
|
5
|
-
* ์ ์ฅ๋ ๊ฐ์ ์ ์ฑ
์ผ๋ก ์ฝ๋๋ค โ **๋ชจ๋ฅด๋ฉด
|
|
5
|
+
* ์ ์ฅ๋ ๊ฐ์ ์ ์ฑ
์ผ๋ก ์ฝ๋๋ค โ **๋ชจ๋ฅด๋ฉด ์ค๋ฅ๋ฅผ ๋ธ๋ค**(๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค).
|
|
6
6
|
*
|
|
7
7
|
* ์ ์ดํ(`mirror`ยท`sim-world`ยท`sim-experiment`)๋ฅผ ์ฌ๊ธฐ์ ๋ฒ์ญํ์ง ์๋๋ค: ๋ฒ์ญ์ ๋๋ฉด ์ ๊ฐ์ด ์ด์๋จ๊ณ ,
|
|
8
8
|
* ๊ทธ ๊ฐ์ด ๋ค์ ์ด๋๊ฐ์ ์ ์ฅ๋๋ค. ์ ์ฅ๋ ๊ฐ์ **ํ ๋ฒ ์ฎ๊ธฐ๊ณ **(๋ฐ์ดํฐ ์ด๊ด) ์ฝ๋๋ ์ ์ดํ๋ง ์๋ค.
|
|
9
|
-
* ๊ทธ๋์ ์ด ํจ์๋ ์ ๊ฐ์ ๋ํด์๋
|
|
9
|
+
* ๊ทธ๋์ ์ด ํจ์๋ ์ ๊ฐ์ ๋ํด์๋ ์ค๋ฅ๋ฅผ ๋ด๋ฉฐ, ๋ฌด์์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋์ง ๋ฌธ์ฅ์ผ๋ก ๋งํ๋ค.
|
|
10
10
|
*/
|
|
11
11
|
export declare function readRestartPolicy(raw: unknown, where: string): RestartPolicy;
|
|
12
|
-
/** ์ด ๊ฐ์ด ์ ์ฑ
์ธ๊ฐ โ
|
|
12
|
+
/** ์ด ๊ฐ์ด ์ ์ฑ
์ธ๊ฐ โ ์ค๋ฅ๋ฅผ ๋ด์ง ์๊ณ ๋ฌป๋ ์๋ฆฌ(ํ๋ฉดยท๊ฒ์ฌ)๋ฅผ ์ํด. */
|
|
13
13
|
export declare function isRestartPolicy(raw: unknown): raw is RestartPolicy;
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* โโ ๊ธฐ๋ณธ๊ฐ์ ๋์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
20
20
|
* ์์ ์๋ ๋ฏธ์ ์ธ์ด ์กฐ์ฉํ `sim-experiment`(=์ ๋ ์ด๊ธฐํ)๋ก ๋จ์ด์ก๋ค. ๊ทธ ๊ด์ฉ์ ๊ฐ์ด ํ๋ ์ด๊ธ๋๋
|
|
21
21
|
* ์๊ฐ **์ ๋์ ์ง์ฐ๋ ๊ธธ**์ด ๋๋ค โ ๊ฐ๋ช
๋ค ์ ๊ฐ์ด ๋จ์ ์๋ ํ์ ๊ทธ ๊ธธ๋ก ์ฝ์ผ๋ฉด ์ฌ๊ธฐ๋ ํ ๋ฒ์
|
|
22
|
-
* ์ด๋ ฅ์ด ์ฌ๋ผ์ง๋ค. ๊ทธ๋์ ๋ชจ๋ฅด๋ ๊ฐ์
|
|
22
|
+
* ์ด๋ ฅ์ด ์ฌ๋ผ์ง๋ค. ๊ทธ๋์ ๋ชจ๋ฅด๋ ๊ฐ์ **์ค๋ฅ๋ฅผ ๋ธ๋ค.** ๋ถ๋ฅด๋ ์ชฝ์ด ์ ์ธํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ด ์ถ์ ์์ ์ด๋ค.
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.RESTART_POLICIES = void 0;
|
|
@@ -27,11 +27,11 @@ exports.readRestartPolicy = readRestartPolicy;
|
|
|
27
27
|
exports.isRestartPolicy = isRestartPolicy;
|
|
28
28
|
exports.RESTART_POLICIES = ['resync', 'resume', 'reset'];
|
|
29
29
|
/**
|
|
30
|
-
* ์ ์ฅ๋ ๊ฐ์ ์ ์ฑ
์ผ๋ก ์ฝ๋๋ค โ **๋ชจ๋ฅด๋ฉด
|
|
30
|
+
* ์ ์ฅ๋ ๊ฐ์ ์ ์ฑ
์ผ๋ก ์ฝ๋๋ค โ **๋ชจ๋ฅด๋ฉด ์ค๋ฅ๋ฅผ ๋ธ๋ค**(๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค).
|
|
31
31
|
*
|
|
32
32
|
* ์ ์ดํ(`mirror`ยท`sim-world`ยท`sim-experiment`)๋ฅผ ์ฌ๊ธฐ์ ๋ฒ์ญํ์ง ์๋๋ค: ๋ฒ์ญ์ ๋๋ฉด ์ ๊ฐ์ด ์ด์๋จ๊ณ ,
|
|
33
33
|
* ๊ทธ ๊ฐ์ด ๋ค์ ์ด๋๊ฐ์ ์ ์ฅ๋๋ค. ์ ์ฅ๋ ๊ฐ์ **ํ ๋ฒ ์ฎ๊ธฐ๊ณ **(๋ฐ์ดํฐ ์ด๊ด) ์ฝ๋๋ ์ ์ดํ๋ง ์๋ค.
|
|
34
|
-
* ๊ทธ๋์ ์ด ํจ์๋ ์ ๊ฐ์ ๋ํด์๋
|
|
34
|
+
* ๊ทธ๋์ ์ด ํจ์๋ ์ ๊ฐ์ ๋ํด์๋ ์ค๋ฅ๋ฅผ ๋ด๋ฉฐ, ๋ฌด์์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋์ง ๋ฌธ์ฅ์ผ๋ก ๋งํ๋ค.
|
|
35
35
|
*/
|
|
36
36
|
function readRestartPolicy(raw, where) {
|
|
37
37
|
const value = typeof raw === 'string' ? raw.trim() : '';
|
|
@@ -45,7 +45,7 @@ function readRestartPolicy(raw, where) {
|
|
|
45
45
|
throw new Error(`${where}: restart policy ${value ? `"${value}"` : 'is missing'} โ declare one of ${exports.RESTART_POLICIES.join(' | ')}. ` +
|
|
46
46
|
'There is no default: an unspecified policy used to fall through to "reset", which erases the journal on the next reboot.');
|
|
47
47
|
}
|
|
48
|
-
/** ์ด ๊ฐ์ด ์ ์ฑ
์ธ๊ฐ โ
|
|
48
|
+
/** ์ด ๊ฐ์ด ์ ์ฑ
์ธ๊ฐ โ ์ค๋ฅ๋ฅผ ๋ด์ง ์๊ณ ๋ฌป๋ ์๋ฆฌ(ํ๋ฉดยท๊ฒ์ฌ)๋ฅผ ์ํด. */
|
|
49
49
|
function isRestartPolicy(raw) {
|
|
50
50
|
return typeof raw === 'string' && exports.RESTART_POLICIES.includes(raw);
|
|
51
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restart-policy.js","sourceRoot":"","sources":["../../server/engine/restart-policy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAcH,8CAcC;AAGD,0CAEC;AA5BY,QAAA,gBAAgB,GAA6B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAEhG;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,GAAY,EAAE,KAAa;IAC3D,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACvD,IAAK,wBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAsB,CAAA;IAC1F,MAAM,MAAM,GAAkC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAA;IACpH,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,qBAAqB,KAAK,uDAAuD,MAAM,CAAC,KAAK,CAAC,IAAI;YACxG,4IAA4I,CAC/I,CAAA;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,oBAAoB,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,qBAAqB,wBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;QAClH,0HAA0H,CAC7H,CAAA;AACH,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"restart-policy.js","sourceRoot":"","sources":["../../server/engine/restart-policy.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAcH,8CAcC;AAGD,0CAEC;AA5BY,QAAA,gBAAgB,GAA6B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAA;AAEhG;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,GAAY,EAAE,KAAa;IAC3D,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACvD,IAAK,wBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAsB,CAAA;IAC1F,MAAM,MAAM,GAAkC,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAA;IACpH,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,qBAAqB,KAAK,uDAAuD,MAAM,CAAC,KAAK,CAAC,IAAI;YACxG,4IAA4I,CAC/I,CAAA;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,oBAAoB,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,qBAAqB,wBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;QAClH,0HAA0H,CAC7H,CAAA;AACH,CAAC;AAED,8CAA8C;AAC9C,SAAgB,eAAe,CAAC,GAAY;IAC1C,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAK,wBAAsC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACzF,CAAC","sourcesContent":["/*\n * **์ฌ๊ธฐ๋ ์ ์ฑ
** โ ์ด ํธ์์ ๋ค์ ์ธ์์ง ๋ ์๊ธฐ ๊ณผ๊ฑฐ๋ฅผ ์ด๋ป๊ฒ ๋ํ๋.\n *\n * โโ ์ ์ด ์ด๋ฆ์ธ๊ฐ (ADR-0029 ยท plans/simulator-as-source.md ยง2) โโโโโโโโโโโโโ\n * ์ ์ด๋ฆ์ `realityMode` ์๊ณ ๊ฐ์ `mirror`ยท`sim-world`ยท`sim-experiment` ์๋ค. ๊ทธ ์ถ์ ใํ์ค์ด ์ด๋์\n * ์ค๋ใ๋ฅผ ๋งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ง๋ง, ์ฝ๋๊ฐ ๊ทธ๊ฒ์ผ๋ก ๊ฐ๋ฅธ ๊ฒ์ **์ฌ๊ธฐ๋ ๊ฑฐ๋ ํ๋**์๋ค. ๊ทธ๋ฆฌ๊ณ ใํ์ค์ด\n * ์ด๋์ ์ค๋ใ๋ ADR-0029 ๊ฐ **์๋ณธ์ ์ข
๋ฅ**๋ก ์ฎ๊ธด ๋ฌผ์์ด๋ค(`TwinReference.adapterType`) โ ํธ์์ ํ\n * ์ข
๋ฅ์ด๊ณ ์ธ์ ๋ ์๋ณธ์ ๋ฐ์ํ๋ค.\n *\n * ๊ทธ๋์ ์ด ์ถ์ ์ฌ๋ผ์ง์ง ์๊ณ **ํธ์์ ๋จ์ ์ด๋ฆ์ ๋ฐ๊ฟจ๋ค.** ๋จ๋ ์ด์ : ใ์๊ธฐ ์ ๋์ ์๋๊ฐใ๋ ์๋ณธ์\n * ์ฑ์ง์ด ์๋๋ผ **ํธ์๊ณผ ์๊ธฐ ๊ณผ๊ฑฐ์ ๊ด๊ณ**๋ค. ๊ฐ์ ์๋ฎฌ๋ ์ดํฐ ์๋ณธ์ ๋ณด๋ ๋ ํธ์์ด ํ๋๋ ์ด์ด๊ฐ๊ณ \n * ํ๋๋ ๋งค๋ฒ ์ฒ์๋ถํฐ ์ฌํํ ์ ์๋ค โ ์๋ณธ์ ๊ทธ ๋์ ๊ตฌ๋ณํ์ง ๋ชปํ๋ค.\n *\n * resync โ ์ธ๋ถ ์ค๋ฌผ์์ ๋ค์ ์ฝ๋๋ค(์๋ณธ์ด ์ง์ค์ด๋ฏ๋ก ์ฐ๋ฆฌ ๊ณผ๊ฑฐ๋ฅผ ์ด์ด ๋ถ์ด์ง ์๋๋ค).\n * resume โ ์ ๋์ ์ด์ด ์ธ์ด๋ค(์ด ํธ์์ด ๋ณ์ ํ์๋ผ์ธ์ด ๊ณง ์ฌ์ค์ด๋ค).\n * reset โ ์ ๋์ ๋น์ฐ๊ณ ์จ์๋ถํฐ ๋ค์ ๋๋ฆฐ๋ค(์ฌํ ๊ฐ๋ฅํ ์คํ).\n *\n * โโ ๊ธฐ๋ณธ๊ฐ์ ๋์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์์ ์๋ ๋ฏธ์ ์ธ์ด ์กฐ์ฉํ `sim-experiment`(=์ ๋ ์ด๊ธฐํ)๋ก ๋จ์ด์ก๋ค. ๊ทธ ๊ด์ฉ์ ๊ฐ์ด ํ๋ ์ด๊ธ๋๋\n * ์๊ฐ **์ ๋์ ์ง์ฐ๋ ๊ธธ**์ด ๋๋ค โ ๊ฐ๋ช
๋ค ์ ๊ฐ์ด ๋จ์ ์๋ ํ์ ๊ทธ ๊ธธ๋ก ์ฝ์ผ๋ฉด ์ฌ๊ธฐ๋ ํ ๋ฒ์\n * ์ด๋ ฅ์ด ์ฌ๋ผ์ง๋ค. ๊ทธ๋์ ๋ชจ๋ฅด๋ ๊ฐ์ **์ค๋ฅ๋ฅผ ๋ธ๋ค.** ๋ถ๋ฅด๋ ์ชฝ์ด ์ ์ธํ๊ฒ ๋ง๋๋ ๊ฒ์ด ์ด ์ถ์ ์์ ์ด๋ค.\n */\n\n/** ์ฌ๊ธฐ๋ ์ ์ฑ
โ ์
๋ฟ์ด๋ค. */\nexport type RestartPolicy = 'resync' | 'resume' | 'reset'\n\nexport const RESTART_POLICIES: readonly RestartPolicy[] = ['resync', 'resume', 'reset'] as const\n\n/**\n * ์ ์ฅ๋ ๊ฐ์ ์ ์ฑ
์ผ๋ก ์ฝ๋๋ค โ **๋ชจ๋ฅด๋ฉด ์ค๋ฅ๋ฅผ ๋ธ๋ค**(๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฉ์ฐ์ง ์๋๋ค).\n *\n * ์ ์ดํ(`mirror`ยท`sim-world`ยท`sim-experiment`)๋ฅผ ์ฌ๊ธฐ์ ๋ฒ์ญํ์ง ์๋๋ค: ๋ฒ์ญ์ ๋๋ฉด ์ ๊ฐ์ด ์ด์๋จ๊ณ ,\n * ๊ทธ ๊ฐ์ด ๋ค์ ์ด๋๊ฐ์ ์ ์ฅ๋๋ค. ์ ์ฅ๋ ๊ฐ์ **ํ ๋ฒ ์ฎ๊ธฐ๊ณ **(๋ฐ์ดํฐ ์ด๊ด) ์ฝ๋๋ ์ ์ดํ๋ง ์๋ค.\n * ๊ทธ๋์ ์ด ํจ์๋ ์ ๊ฐ์ ๋ํด์๋ ์ค๋ฅ๋ฅผ ๋ด๋ฉฐ, ๋ฌด์์ผ๋ก ์ฎ๊ฒจ์ผ ํ๋์ง ๋ฌธ์ฅ์ผ๋ก ๋งํ๋ค.\n */\nexport function readRestartPolicy(raw: unknown, where: string): RestartPolicy {\n const value = typeof raw === 'string' ? raw.trim() : ''\n if ((RESTART_POLICIES as readonly string[]).includes(value)) return value as RestartPolicy\n const legacy: Record<string, RestartPolicy> = { mirror: 'resync', 'sim-world': 'resume', 'sim-experiment': 'reset' }\n if (legacy[value]) {\n throw new Error(\n `${where}: restart policy \"${value}\" is the old vocabulary โ move the stored value to \"${legacy[value]}\" ` +\n '(ADR-0029 ยท plans/simulator-as-source.md ยง2). Nothing is translated at read time on purpose: a translation would keep the old value alive.'\n )\n }\n throw new Error(\n `${where}: restart policy ${value ? `\"${value}\"` : 'is missing'} โ declare one of ${RESTART_POLICIES.join(' | ')}. ` +\n 'There is no default: an unspecified policy used to fall through to \"reset\", which erases the journal on the next reboot.'\n )\n}\n\n/** ์ด ๊ฐ์ด ์ ์ฑ
์ธ๊ฐ โ ์ค๋ฅ๋ฅผ ๋ด์ง ์๊ณ ๋ฌป๋ ์๋ฆฌ(ํ๋ฉดยท๊ฒ์ฌ)๋ฅผ ์ํด. */\nexport function isRestartPolicy(raw: unknown): raw is RestartPolicy {\n return typeof raw === 'string' && (RESTART_POLICIES as readonly string[]).includes(raw)\n}\n"]}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* `${domainId}:${instanceId}` โ ์ด ์ ์ฅ์๊ฐ ์ด๋ฏธ ์ฐ๋ ๋ชจ์์ด๋ค(`structureRevCache`ยท`measuredCache`).
|
|
27
27
|
* ์ ๋ชจ์์ ๋ง๋ค์ง ์๋๋ค. ํ์ฑ์ **์ฒซ ๊ตฌ๋ถ์**์์ ์๋ฅด๋ฏ๋ก `instanceId` ์ `:` ๊ฐ ๋ค์ด ์์ด๋
|
|
28
28
|
* ์์ ํ๋ค(๋ ํผ๋ฐ์ค ์์ค ์ด๋ฆ์ ๋ค์ด๊ฐ ์ ์๋ค). ๋์ `domainId` ์ ๊ตฌ๋ถ์๊ฐ ์์ผ๋ฉด ํค๊ฐ ๋ชจํธํด์ง๋ฏ๋ก
|
|
29
|
-
* **๊ทธ๋๋
|
|
29
|
+
* **๊ทธ๋๋ ์ค๋ฅ๋ฅผ ๋ธ๋ค** โ ์กฐ์ฉํ ์๋ชป๋ ํค๋ฅผ ๋ง๋ค๋ฉด ๊ทธ๊ฒ ๊ณง ์ด ๊ฒฐํจ์ ์ฌ๋ฐ์ด๋ค.
|
|
30
30
|
*/
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
32
|
exports.RUNTIME_KEY_SEP = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-key.js","sourceRoot":"","sources":["../../server/engine/runtime-key.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAUH,gCAOC;AAGD,0CAIC;AAGD,gCAEC;AA3BD,kDAAkD;AACrC,QAAA,eAAe,GAAG,GAAG,CAAA;AAElC;;;;GAIG;AACH,SAAgB,UAAU,CAAC,QAAgB,EAAE,UAAkB;IAC7D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;IAC9G,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACtE,IAAI,QAAQ,CAAC,QAAQ,CAAC,uBAAe,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,0CAA0C,uBAAe,kCAAkC,CAAC,CAAA;IAC9G,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,uBAAe,GAAG,UAAU,EAAE,CAAA;AACrD,CAAC;AAED,iDAAiD;AACjD,SAAgB,eAAe,CAAC,GAAW;IACzC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAe,CAAC,CAAA;IACvC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,wBAAwB,CAAC,CAAA;IACvG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;AACtE,CAAC;AAED,iDAAiD;AACjD,SAAgB,UAAU,CAAC,GAAW,EAAE,QAAgB;IACtD,OAAO,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,uBAAe,EAAE,CAAC,CAAA;AACtE,CAAC","sourcesContent":["/*\n * ๋ฐํ์ ๋ ์ง์คํธ๋ฆฌ ํค โ **ํธ์์ ์ ์ฒด์ฑ์ `(๋๋ฉ์ธ, ์ธ์คํด์ค id)` ๋ค.** ์์.\n *\n * โโ ์ ์๋ (2026-08-06 ํ
๋ํธ ๊ฒฉ๋ฆฌ ์ ์ ํ์ธ) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `TwinEngine.instances` ์ `recovered` ๊ฐ **`instanceId` ํ๋๋ก** ํค๋ฅผ ์ก๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ DB ์ ์ผ์ฑ์\n * `[domain, instanceId]` ์ด๊ณ (`TwinInstance` ์ธ๋ฑ์ค) ํธ์์ ์ ์ฒด์ฑ๋ ๊ทธ์ชฝ์ด๋ค. ์ฆ ๋ฐํ์ ๋งต๋ง **์ ์ญ\n * ์ด๋ฆ ๊ณต๊ฐ**์ด์๋ค.\n *\n * **์ถฉ๋์ ์ด๋ก ์ด ์๋๋ค.** ๋ ํผ๋ฐ์ค ๊ฒฝ๋ก๊ฐ `instanceId` ๋ก **๋ ํผ๋ฐ์ค ์์ค ์ด๋ฆ**์ ์ด๋ค\n * (`sap-ewm-1710`). ๋ฒค๋ ์์คํ
์ด๋ฆ์ ํ
๋ํธ๊ฐ **๊ณต์ ํ๋ ์ดํ**๋ผ, ๋ ํ
๋ํธ๊ฐ ๊ฐ์ ์์คํ
์\n * ์ฐ๊ฒฐํ๋ฉด ๊ฐ์ id ๊ฐ ๋๋ค โ ๋๋ฌธ ์ฌ๊ณ ๊ฐ ์๋๋ผ ์์๋๋ ๊ฒฝ์ฐ๋ค.\n *\n * ๊ทธ๋์ ๋ฌด์์ด ์ด๊ธ๋ฌ๋:\n * ยท `startLive` ์ ์กฐ๊ธฐ ๋ฐํ์ด A ์ ๋ฐํ์์ B ์๊ฒ ๋๋ ค์ฃผ๊ณ `ingestLive` ๋ ๋๋ฉ์ธ์ ํ์ธํ์ง ์์\n * **B ์ ๋ผ์ด๋ธ ์ด๋ฒคํธ๊ฐ A ์ ์ปค๋์ ์ ์ฉ**๋ ์ ์์๋ค.\n * ยท `recovered` ๊ฐ ๊ฒน์น๋ฉด ์์คํํธ ์จ์์ด **๋จ์ ์ค๋
์ท**์ด ๋์ด ์ฌ๊ณ ๊ฐ ์์ธ๋ค.\n * ยท `start`/`stop` ์ด ๋จ์ ๋ฐํ์์ ์ง์ผ๋ฏ๋ก B ๋ \"๊ธฐ๋๋จ\" ์ ๋ฐ๊ณ ๋ ์ดํ ์ ๋ถ ๊ฑฐ๋ถ๋๋ค.\n *\n * ์ด ๋ถ๋ฅ๋ **์ด๋ฏธ ํ ๋ฒ ๋ฌผ์๋ค** โ `twin-lifecycle-mutation.ts` ์ฃผ์์ด ์ฆ์ธํ๋ค: \"๊ณผ๊ฑฐ์\n * `Object.keys(TwinEngine.instances)` ๋ก ์ ์ญ ๋ฐํ โ ๋ค๋ฅธ ๋๋ฉ์ธ ํธ์์ด ์๋ ๋ฒ๊ทธ.\" ๊ทธ ์๋ฆฌ๋ง ๊ณ ์ณค๋ค.\n * ๊ทธ๋์ ์ด๋ฒ์๋ ๊ฐ๋๋ฅผ ๋ ๋ถ์ด์ง ์๊ณ **ํค๋ฅผ ๊ณ ์น๋ค** โ ์ ์์ค ๋ฉ์๋๊ฐ `domainId` ๋ฅผ ๋ฐ๊ฒ ๋๋ ๊ฒ์ด\n * ์์ ์ด๋ค. \"๋๊ตฌ์ ํธ์์ธ๊ฐ\" ๋ฅผ ๋งํ์ง ์๊ณ ๋ ๋ง์ง ์ ์๋ค.\n *\n * โโ ๊ตฌ๋ถ์ ๊ท์ฝ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `${domainId}:${instanceId}` โ ์ด ์ ์ฅ์๊ฐ ์ด๋ฏธ ์ฐ๋ ๋ชจ์์ด๋ค(`structureRevCache`ยท`measuredCache`).\n * ์ ๋ชจ์์ ๋ง๋ค์ง ์๋๋ค. ํ์ฑ์ **์ฒซ ๊ตฌ๋ถ์**์์ ์๋ฅด๋ฏ๋ก `instanceId` ์ `:` ๊ฐ ๋ค์ด ์์ด๋\n * ์์ ํ๋ค(๋ ํผ๋ฐ์ค ์์ค ์ด๋ฆ์ ๋ค์ด๊ฐ ์ ์๋ค). ๋์ `domainId` ์ ๊ตฌ๋ถ์๊ฐ ์์ผ๋ฉด ํค๊ฐ ๋ชจํธํด์ง๋ฏ๋ก\n * **๊ทธ๋๋
|
|
1
|
+
{"version":3,"file":"runtime-key.js","sourceRoot":"","sources":["../../server/engine/runtime-key.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;;;AAUH,gCAOC;AAGD,0CAIC;AAGD,gCAEC;AA3BD,kDAAkD;AACrC,QAAA,eAAe,GAAG,GAAG,CAAA;AAElC;;;;GAIG;AACH,SAAgB,UAAU,CAAC,QAAgB,EAAE,UAAkB;IAC7D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAA;IAC9G,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACtE,IAAI,QAAQ,CAAC,QAAQ,CAAC,uBAAe,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,0CAA0C,uBAAe,kCAAkC,CAAC,CAAA;IAC9G,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,uBAAe,GAAG,UAAU,EAAE,CAAA;AACrD,CAAC;AAED,iDAAiD;AACjD,SAAgB,eAAe,CAAC,GAAW;IACzC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,uBAAe,CAAC,CAAA;IACvC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,wBAAwB,CAAC,CAAA;IACvG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAA;AACtE,CAAC;AAED,iDAAiD;AACjD,SAAgB,UAAU,CAAC,GAAW,EAAE,QAAgB;IACtD,OAAO,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,uBAAe,EAAE,CAAC,CAAA;AACtE,CAAC","sourcesContent":["/*\n * ๋ฐํ์ ๋ ์ง์คํธ๋ฆฌ ํค โ **ํธ์์ ์ ์ฒด์ฑ์ `(๋๋ฉ์ธ, ์ธ์คํด์ค id)` ๋ค.** ์์.\n *\n * โโ ์ ์๋ (2026-08-06 ํ
๋ํธ ๊ฒฉ๋ฆฌ ์ ์ ํ์ธ) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `TwinEngine.instances` ์ `recovered` ๊ฐ **`instanceId` ํ๋๋ก** ํค๋ฅผ ์ก๊ณ ์์๋ค. ๊ทธ๋ฐ๋ฐ DB ์ ์ผ์ฑ์\n * `[domain, instanceId]` ์ด๊ณ (`TwinInstance` ์ธ๋ฑ์ค) ํธ์์ ์ ์ฒด์ฑ๋ ๊ทธ์ชฝ์ด๋ค. ์ฆ ๋ฐํ์ ๋งต๋ง **์ ์ญ\n * ์ด๋ฆ ๊ณต๊ฐ**์ด์๋ค.\n *\n * **์ถฉ๋์ ์ด๋ก ์ด ์๋๋ค.** ๋ ํผ๋ฐ์ค ๊ฒฝ๋ก๊ฐ `instanceId` ๋ก **๋ ํผ๋ฐ์ค ์์ค ์ด๋ฆ**์ ์ด๋ค\n * (`sap-ewm-1710`). ๋ฒค๋ ์์คํ
์ด๋ฆ์ ํ
๋ํธ๊ฐ **๊ณต์ ํ๋ ์ดํ**๋ผ, ๋ ํ
๋ํธ๊ฐ ๊ฐ์ ์์คํ
์\n * ์ฐ๊ฒฐํ๋ฉด ๊ฐ์ id ๊ฐ ๋๋ค โ ๋๋ฌธ ์ฌ๊ณ ๊ฐ ์๋๋ผ ์์๋๋ ๊ฒฝ์ฐ๋ค.\n *\n * ๊ทธ๋์ ๋ฌด์์ด ์ด๊ธ๋ฌ๋:\n * ยท `startLive` ์ ์กฐ๊ธฐ ๋ฐํ์ด A ์ ๋ฐํ์์ B ์๊ฒ ๋๋ ค์ฃผ๊ณ `ingestLive` ๋ ๋๋ฉ์ธ์ ํ์ธํ์ง ์์\n * **B ์ ๋ผ์ด๋ธ ์ด๋ฒคํธ๊ฐ A ์ ์ปค๋์ ์ ์ฉ**๋ ์ ์์๋ค.\n * ยท `recovered` ๊ฐ ๊ฒน์น๋ฉด ์์คํํธ ์จ์์ด **๋จ์ ์ค๋
์ท**์ด ๋์ด ์ฌ๊ณ ๊ฐ ์์ธ๋ค.\n * ยท `start`/`stop` ์ด ๋จ์ ๋ฐํ์์ ์ง์ผ๋ฏ๋ก B ๋ \"๊ธฐ๋๋จ\" ์ ๋ฐ๊ณ ๋ ์ดํ ์ ๋ถ ๊ฑฐ๋ถ๋๋ค.\n *\n * ์ด ๋ถ๋ฅ๋ **์ด๋ฏธ ํ ๋ฒ ๋ฌผ์๋ค** โ `twin-lifecycle-mutation.ts` ์ฃผ์์ด ์ฆ์ธํ๋ค: \"๊ณผ๊ฑฐ์\n * `Object.keys(TwinEngine.instances)` ๋ก ์ ์ญ ๋ฐํ โ ๋ค๋ฅธ ๋๋ฉ์ธ ํธ์์ด ์๋ ๋ฒ๊ทธ.\" ๊ทธ ์๋ฆฌ๋ง ๊ณ ์ณค๋ค.\n * ๊ทธ๋์ ์ด๋ฒ์๋ ๊ฐ๋๋ฅผ ๋ ๋ถ์ด์ง ์๊ณ **ํค๋ฅผ ๊ณ ์น๋ค** โ ์ ์์ค ๋ฉ์๋๊ฐ `domainId` ๋ฅผ ๋ฐ๊ฒ ๋๋ ๊ฒ์ด\n * ์์ ์ด๋ค. \"๋๊ตฌ์ ํธ์์ธ๊ฐ\" ๋ฅผ ๋งํ์ง ์๊ณ ๋ ๋ง์ง ์ ์๋ค.\n *\n * โโ ๊ตฌ๋ถ์ ๊ท์ฝ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `${domainId}:${instanceId}` โ ์ด ์ ์ฅ์๊ฐ ์ด๋ฏธ ์ฐ๋ ๋ชจ์์ด๋ค(`structureRevCache`ยท`measuredCache`).\n * ์ ๋ชจ์์ ๋ง๋ค์ง ์๋๋ค. ํ์ฑ์ **์ฒซ ๊ตฌ๋ถ์**์์ ์๋ฅด๋ฏ๋ก `instanceId` ์ `:` ๊ฐ ๋ค์ด ์์ด๋\n * ์์ ํ๋ค(๋ ํผ๋ฐ์ค ์์ค ์ด๋ฆ์ ๋ค์ด๊ฐ ์ ์๋ค). ๋์ `domainId` ์ ๊ตฌ๋ถ์๊ฐ ์์ผ๋ฉด ํค๊ฐ ๋ชจํธํด์ง๋ฏ๋ก\n * **๊ทธ๋๋ ์ค๋ฅ๋ฅผ ๋ธ๋ค** โ ์กฐ์ฉํ ์๋ชป๋ ํค๋ฅผ ๋ง๋ค๋ฉด ๊ทธ๊ฒ ๊ณง ์ด ๊ฒฐํจ์ ์ฌ๋ฐ์ด๋ค.\n */\n\n/** ๋๋ฉ์ธ๊ณผ ์ธ์คํด์ค id ๋ฅผ ์๋ ๋ฌธ์ โ ์ ์ฅ์์ ๊ธฐ์กด ์บ์ ํค์ ๊ฐ์ ๋ชจ์. */\nexport const RUNTIME_KEY_SEP = ':'\n\n/**\n * ๋ฐํ์ ๋ ์ง์คํธ๋ฆฌ ํค.\n *\n * @throws ๋๋ฉ์ธ id ๊ฐ ๋น์๊ฑฐ๋ ๊ตฌ๋ถ์๋ฅผ ๋ด๊ณ ์์ผ๋ฉด(ํค๊ฐ ๋ชจํธํด์ง๋ค). ์ธ์คํด์ค id ๊ฐ ๋น์์ผ๋ฉด.\n */\nexport function runtimeKey(domainId: string, instanceId: string): string {\n if (!domainId) throw new Error('runtimeKey: domainId is required โ a twin runtime always belongs to a tenant')\n if (!instanceId) throw new Error('runtimeKey: instanceId is required')\n if (domainId.includes(RUNTIME_KEY_SEP)) {\n throw new Error(`runtimeKey: domainId must not contain \"${RUNTIME_KEY_SEP}\" (would make the key ambiguous)`)\n }\n return `${domainId}${RUNTIME_KEY_SEP}${instanceId}`\n}\n\n/** ํค๋ฅผ ๋๋๋ฆฐ๋ค โ ์ฒซ ๊ตฌ๋ถ์์์ ์๋ฅธ๋ค(์ธ์คํด์ค id ์์ ๊ตฌ๋ถ์๋ ๋ณด์กด). */\nexport function parseRuntimeKey(key: string): { domainId: string; instanceId: string } {\n const at = key.indexOf(RUNTIME_KEY_SEP)\n if (at <= 0 || at === key.length - 1) throw new Error(`parseRuntimeKey: \"${key}\" is not a runtime key`)\n return { domainId: key.slice(0, at), instanceId: key.slice(at + 1) }\n}\n\n/** ์ด ํค๊ฐ ์ด ํ
๋ํธ์ ๊ฒ์ธ๊ฐ โ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์กฐํํ ๋ ๋๋ฉ์ธ์ผ๋ก ๊ฑธ๋ฌ๋ธ๋ค. */\nexport function isOfDomain(key: string, domainId: string): boolean {\n return !!domainId && key.startsWith(`${domainId}${RUNTIME_KEY_SEP}`)\n}\n"]}
|