@things-factory/headless-twin 10.0.15 โ 10.0.17
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/attention-digest.d.ts +4 -4
- package/dist-server/engine/attention-digest.js +7 -7
- package/dist-server/engine/attention-digest.js.map +1 -1
- package/dist-server/engine/canonical-ingest.d.ts +11 -2
- package/dist-server/engine/canonical-ingest.js +108 -9
- 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/declared-stimulus.js +1 -1
- package/dist-server/engine/declared-stimulus.js.map +1 -1
- package/dist-server/engine/energy-topology.js +1 -1
- package/dist-server/engine/energy-topology.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +38 -0
- package/dist-server/engine/ingest-dedupe.js +145 -0
- package/dist-server/engine/ingest-dedupe.js.map +1 -0
- package/dist-server/engine/ingest-health.d.ts +90 -10
- package/dist-server/engine/ingest-health.js +125 -16
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/integration-probes.d.ts +3 -3
- package/dist-server/engine/integration-probes.js +6 -6
- package/dist-server/engine/integration-probes.js.map +1 -1
- package/dist-server/engine/kpi-baseline.js +4 -4
- package/dist-server/engine/kpi-baseline.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +122 -12
- package/dist-server/engine/kpi-fold.js +247 -18
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +11 -11
- package/dist-server/engine/kpi-query.js +185 -28
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +1 -1
- package/dist-server/engine/live-feed-registry.js +1 -1
- 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.map +1 -1
- package/dist-server/engine/local-declarations.d.ts +7 -7
- package/dist-server/engine/local-declarations.js +9 -9
- package/dist-server/engine/local-declarations.js.map +1 -1
- package/dist-server/engine/log.d.ts +1 -1
- package/dist-server/engine/log.js +1 -1
- package/dist-server/engine/log.js.map +1 -1
- package/dist-server/engine/measured-estimator.js +1 -1
- package/dist-server/engine/measured-estimator.js.map +1 -1
- package/dist-server/engine/measured-yield.js +1 -1
- package/dist-server/engine/measured-yield.js.map +1 -1
- package/dist-server/engine/model-basis.d.ts +1 -1
- package/dist-server/engine/model-basis.js +1 -1
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-gap.d.ts +3 -3
- package/dist-server/engine/model-gap.js +1 -1
- package/dist-server/engine/model-gap.js.map +1 -1
- package/dist-server/engine/model-vocabulary.js +1 -1
- package/dist-server/engine/model-vocabulary.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +4 -4
- package/dist-server/engine/oee-accumulator.js +3 -3
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/property-effects.js +2 -2
- package/dist-server/engine/property-effects.js.map +1 -1
- package/dist-server/engine/read-time.d.ts +22 -0
- package/dist-server/engine/read-time.js +81 -0
- package/dist-server/engine/read-time.js.map +1 -0
- package/dist-server/engine/restart-policy.js +1 -1
- 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/spec-coverage.d.ts +2 -2
- package/dist-server/engine/spec-coverage.js +1 -1
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/stage-path.d.ts +4 -4
- package/dist-server/engine/stage-path.js +1 -1
- package/dist-server/engine/stage-path.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +1 -1
- package/dist-server/engine/state-axes.js +2 -2
- package/dist-server/engine/state-axes.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +2 -2
- package/dist-server/engine/travel-estimator.js +1 -1
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +237 -54
- package/dist-server/engine/twin-engine.js +672 -192
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +2 -2
- package/dist-server/engine/warm-start.js +5 -5
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -1
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js +3 -3
- package/dist-server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.js.map +1 -1
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js +2 -2
- package/dist-server/migrations/1786200000000-CarryLiveFeedCursor.js.map +1 -1
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.d.ts +5 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js +54 -0
- package/dist-server/migrations/1786300000000-IndexEventTypeByTime.js.map +1 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.d.ts +5 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js +44 -0
- package/dist-server/migrations/1786400000000-IndexEventCreatedAt.js.map +1 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.d.ts +6 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js +84 -0
- package/dist-server/migrations/1786500000000-CreateTwinSubjectEvents.js.map +1 -0
- package/dist-server/migrations/index.js +7 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.d.ts +1 -0
- package/dist-server/routes.js +69 -5
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/service/index.js +27 -24
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/control-routing.d.ts +1 -1
- package/dist-server/service/reference/control-routing.js +1 -1
- package/dist-server/service/reference/control-routing.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +2 -2
- package/dist-server/service/reference/discovery-result.js +3 -3
- package/dist-server/service/reference/discovery-result.js.map +1 -1
- package/dist-server/service/reference/hook-contract.d.ts +43 -0
- package/dist-server/service/reference/hook-contract.js +59 -0
- package/dist-server/service/reference/hook-contract.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +1 -1
- package/dist-server/service/reference/ingest-space.js +4 -4
- package/dist-server/service/reference/ingest-space.js.map +1 -1
- package/dist-server/service/reference/knob-defaults.d.ts +1 -1
- package/dist-server/service/reference/knob-defaults.js +4 -4
- package/dist-server/service/reference/knob-defaults.js.map +1 -1
- package/dist-server/service/reference/reference-adapter.d.ts +116 -9
- package/dist-server/service/reference/reference-adapter.js +27 -0
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-hook.d.ts +20 -0
- package/dist-server/service/reference/reference-hook.js +133 -0
- package/dist-server/service/reference/reference-hook.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +2 -2
- package/dist-server/service/reference/reference-live.js +76 -13
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +14 -14
- package/dist-server/service/reference/reference-master.js +34 -12
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +1 -1
- package/dist-server/service/reference/reference-resolver.js +10 -10
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/twin-reference.d.ts +3 -3
- package/dist-server/service/reference/twin-reference.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +1 -1
- package/dist-server/service/twin-audit/command-audit.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +1 -1
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js +1 -1
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js +1 -1
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js +2 -2
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-type.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event-type.js +8 -1
- package/dist-server/service/twin-event/twin-event-type.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +2 -2
- package/dist-server/service/twin-event/twin-event.js +32 -4
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +1 -1
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +29 -11
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.d.ts +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-query.js.map +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js +1 -1
- package/dist-server/service/twin-ingest-window/twin-ingest-window-writer.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/event-type-split-shape.d.ts +50 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js +111 -0
- package/dist-server/service/twin-journal/event-type-split-shape.js.map +1 -0
- package/dist-server/service/twin-journal/event-type-split.d.ts +15 -0
- package/dist-server/service/twin-journal/event-type-split.js +102 -0
- package/dist-server/service/twin-journal/event-type-split.js.map +1 -0
- package/dist-server/service/twin-journal/journal-order.d.ts +15 -0
- package/dist-server/service/twin-journal/journal-order.js +17 -0
- package/dist-server/service/twin-journal/journal-order.js.map +1 -0
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +5 -5
- package/dist-server/service/twin-journal/twin-journal-query.js +232 -21
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +27 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +59 -3
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js +14 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js +1 -1
- package/dist-server/service/twin-model/axis-journal-evidence.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.js +34 -3
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js +1 -1
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -1
- package/dist-server/service/twin-model/isa95-coverage.d.ts +12 -9
- package/dist-server/service/twin-model/isa95-coverage.js +33 -9
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -1
- package/dist-server/service/twin-model/item-ref.js +2 -2
- package/dist-server/service/twin-model/item-ref.js.map +1 -1
- package/dist-server/service/twin-model/name-index.d.ts +1 -1
- package/dist-server/service/twin-model/name-index.js +1 -1
- package/dist-server/service/twin-model/name-index.js.map +1 -1
- package/dist-server/service/twin-model/project-structure.d.ts +1 -1
- package/dist-server/service/twin-model/project-structure.js +3 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +1 -1
- package/dist-server/service/twin-model/twin-equipment.js +1 -1
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +16 -5
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-location.d.ts +1 -1
- package/dist-server/service/twin-model/twin-location.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +3 -3
- package/dist-server/service/twin-model/twin-model-item-query.js +14 -14
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +2 -2
- package/dist-server/service/twin-model/twin-model-mutation.js +4 -4
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-query.js +47 -26
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js +22 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-operation.d.ts +1 -1
- package/dist-server/service/twin-model/twin-operation.js +1 -1
- package/dist-server/service/twin-model/twin-operation.js.map +1 -1
- package/dist-server/service/twin-space/move-space.js +2 -2
- package/dist-server/service/twin-space/move-space.js.map +1 -1
- package/dist-server/service/twin-space/representation-role.d.ts +2 -0
- package/dist-server/service/twin-space/representation-role.js +18 -0
- package/dist-server/service/twin-space/representation-role.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +1 -1
- package/dist-server/service/twin-space/space-integrity.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.d.ts +2 -0
- package/dist-server/service/twin-space/twin-space-representation.js +16 -0
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +2 -2
- package/dist-server/service/twin-space/twin-space-resolver.js +36 -7
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +3 -3
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +43 -0
- package/dist-server/service/twin-subject/event-subjects.js +137 -0
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -0
- package/dist-server/service/twin-subject/index.d.ts +9 -0
- package/dist-server/service/twin-subject/index.js +16 -0
- package/dist-server/service/twin-subject/index.js.map +1 -0
- package/dist-server/service/twin-subject/item-resolver.d.ts +10 -0
- package/dist-server/service/twin-subject/item-resolver.js +93 -0
- package/dist-server/service/twin-subject/item-resolver.js.map +1 -0
- package/dist-server/service/twin-subject/subject-query-shape.d.ts +22 -0
- package/dist-server/service/twin-subject/subject-query-shape.js +88 -0
- package/dist-server/service/twin-subject/subject-query-shape.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.d.ts +23 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js +159 -0
- package/dist-server/service/twin-subject/twin-subject-backfill.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-event.d.ts +14 -0
- package/dist-server/service/twin-subject/twin-subject-event.js +111 -0
- package/dist-server/service/twin-subject/twin-subject-event.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.d.ts +39 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js +295 -0
- package/dist-server/service/twin-subject/twin-subject-fast-path.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-query.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-query.js +232 -0
- package/dist-server/service/twin-subject/twin-subject-query.js.map +1 -0
- package/dist-server/service/twin-subject/twin-subject-writer.d.ts +27 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js +166 -0
- package/dist-server/service/twin-subject/twin-subject-writer.js.map +1 -0
- package/dist-server/service/twin-target/twin-target-resolver.js +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/entity-delta.d.ts +1 -1
- package/dist-shared/entity-delta.js +3 -3
- package/dist-shared/entity-delta.js.map +1 -1
- package/dist-shared/touched-items.js +2 -2
- package/dist-shared/touched-items.js.map +1 -1
- package/dist-shared/twin-level.js +1 -1
- package/dist-shared/twin-level.js.map +1 -1
- package/package.json +3 -3
- package/server/engine/attention-digest.ts +9 -9
- package/server/engine/canonical-ingest.ts +141 -14
- package/server/engine/command-routing.ts +1 -1
- package/server/engine/declared-stimulus.ts +1 -1
- package/server/engine/energy-topology.ts +1 -1
- package/server/engine/ingest-dedupe.ts +149 -0
- package/server/engine/ingest-health.ts +171 -22
- package/server/engine/integration-probes.ts +7 -7
- package/server/engine/kpi-baseline.ts +4 -4
- package/server/engine/kpi-fold.ts +395 -27
- package/server/engine/kpi-query.ts +212 -46
- package/server/engine/live-feed-registry.ts +1 -1
- package/server/engine/load-meter.ts +1 -1
- package/server/engine/local-declarations.ts +13 -13
- package/server/engine/log.ts +1 -1
- package/server/engine/measured-estimator.ts +1 -1
- package/server/engine/measured-yield.ts +1 -1
- package/server/engine/model-basis.ts +2 -2
- package/server/engine/model-gap.ts +3 -3
- package/server/engine/model-vocabulary.ts +1 -1
- package/server/engine/oee-accumulator.ts +4 -4
- package/server/engine/property-effects.ts +2 -2
- package/server/engine/read-time.ts +77 -0
- package/server/engine/restart-policy.ts +1 -1
- package/server/engine/runtime-key.ts +1 -1
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/stage-path.ts +5 -5
- package/server/engine/state-axes.ts +2 -2
- package/server/engine/travel-estimator.ts +2 -2
- package/server/engine/twin-engine.ts +745 -202
- package/server/engine/warm-start.ts +6 -6
- package/server/index.ts +1 -1
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +1 -1
- package/server/migrations/1786100000000-PromoteEventActionAndSyncWarnings.ts +3 -3
- package/server/migrations/1786200000000-CarryLiveFeedCursor.ts +2 -2
- package/server/migrations/1786300000000-IndexEventTypeByTime.ts +48 -0
- package/server/migrations/1786400000000-IndexEventCreatedAt.ts +38 -0
- package/server/migrations/1786500000000-CreateTwinSubjectEvents.ts +93 -0
- package/server/migrations/index.ts +7 -1
- package/server/routes.ts +68 -5
- package/server/service/index.ts +4 -1
- package/server/service/reference/control-routing.ts +1 -1
- package/server/service/reference/discovery-result.ts +3 -3
- package/server/service/reference/hook-contract.ts +103 -0
- package/server/service/reference/ingest-space.ts +4 -4
- package/server/service/reference/knob-defaults.ts +4 -4
- package/server/service/reference/reference-adapter.ts +145 -10
- package/server/service/reference/reference-hook.ts +145 -0
- package/server/service/reference/reference-live.ts +80 -14
- package/server/service/reference/reference-master.ts +39 -17
- package/server/service/reference/reference-resolver.ts +10 -10
- package/server/service/reference/twin-reference.ts +3 -3
- package/server/service/twin-attention/twin-attention-query.ts +1 -1
- package/server/service/twin-audit/command-audit.ts +1 -1
- package/server/service/twin-audit/twin-audit-event.ts +2 -2
- package/server/service/twin-audit/twin-audit-query.ts +1 -1
- package/server/service/twin-control/twin-control-mutation.ts +1 -1
- package/server/service/twin-event/twin-event-keys.ts +2 -2
- package/server/service/twin-event/twin-event-type.ts +18 -1
- package/server/service/twin-event/twin-event.ts +32 -6
- package/server/service/twin-forecast/forecast-metrics.ts +1 -1
- package/server/service/twin-forecast/gap-analytics.ts +1 -1
- package/server/service/twin-forecast/twin-forecast-query.ts +30 -11
- package/server/service/twin-ingest-window/twin-ingest-window-query.ts +1 -1
- package/server/service/twin-ingest-window/twin-ingest-window-writer.ts +1 -1
- package/server/service/twin-instance/twin-instance.ts +4 -4
- package/server/service/twin-journal/event-type-split-shape.ts +112 -0
- package/server/service/twin-journal/event-type-split.ts +144 -0
- package/server/service/twin-journal/journal-order.ts +20 -0
- package/server/service/twin-journal/twin-journal-query.ts +224 -20
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +57 -3
- package/server/service/twin-metrics/twin-metrics-query.ts +14 -1
- package/server/service/twin-model/axis-journal-evidence.ts +1 -1
- package/server/service/twin-model/epcis-coverage.ts +34 -3
- package/server/service/twin-model/iec61850-coverage.ts +1 -1
- package/server/service/twin-model/isa95-coverage.ts +43 -16
- package/server/service/twin-model/item-ref.ts +2 -2
- package/server/service/twin-model/name-index.ts +1 -1
- package/server/service/twin-model/project-structure.ts +4 -4
- package/server/service/twin-model/twin-equipment.ts +2 -2
- package/server/service/twin-model/twin-lineage-query.ts +16 -5
- package/server/service/twin-model/twin-location.ts +1 -1
- package/server/service/twin-model/twin-model-item-query.ts +14 -14
- package/server/service/twin-model/twin-model-mutation.ts +4 -4
- package/server/service/twin-model/twin-model-query.ts +47 -26
- package/server/service/twin-model/twin-model-tree-query.ts +25 -1
- package/server/service/twin-model/twin-operation.ts +2 -2
- package/server/service/twin-space/move-space.ts +3 -3
- package/server/service/twin-space/representation-role.ts +15 -0
- package/server/service/twin-space/space-integrity.ts +1 -1
- package/server/service/twin-space/twin-space-representation.ts +37 -0
- package/server/service/twin-space/twin-space-resolver.ts +39 -7
- package/server/service/twin-structure/twin-structure.ts +3 -3
- package/server/service/twin-subject/event-subjects.ts +155 -0
- package/server/service/twin-subject/index.ts +10 -0
- package/server/service/twin-subject/item-resolver.ts +92 -0
- package/server/service/twin-subject/subject-query-shape.ts +84 -0
- package/server/service/twin-subject/twin-subject-backfill.ts +196 -0
- package/server/service/twin-subject/twin-subject-event.ts +101 -0
- package/server/service/twin-subject/twin-subject-fast-path.ts +346 -0
- package/server/service/twin-subject/twin-subject-query.ts +210 -0
- package/server/service/twin-subject/twin-subject-writer.ts +189 -0
- package/server/service/twin-target/twin-target-resolver.ts +1 -1
- package/shared/entity-delta.ts +3 -3
- package/shared/touched-items.ts +2 -2
- package/shared/twin-level.ts +1 -1
- package/test/adopt-structure-live.test.ts +3 -3
- package/test/aggregate-not-findone.test.ts +112 -0
- package/test/attention-digest.test.ts +6 -6
- package/test/axis-read.test.ts +2 -2
- package/test/boot-resume.test.ts +20 -7
- package/test/broadcast-period.test.ts +2 -2
- package/test/broadcast-queue-overflow.test.ts +244 -0
- package/test/canonical-ingest-vocabularies.test.ts +179 -7
- package/test/canonical-quantity-door.test.ts +2 -2
- package/test/checkpoint-refuses-empty.test.ts +2 -2
- package/test/connector-capability-declaration.test.ts +88 -0
- package/test/control-capability.test.ts +1 -1
- package/test/cursor-stall-not-read-failure.test.ts +2 -2
- package/test/declaration-reaches-model.test.ts +5 -5
- package/test/declared-stimulus.test.ts +4 -4
- package/test/discovery-result.test.ts +2 -2
- package/test/entity-delta.test.ts +4 -4
- package/test/event-subjects.test.ts +147 -0
- package/test/event-time-column.test.ts +3 -3
- package/test/event-type-split.test.ts +155 -0
- package/test/fold-gap-speaks.test.ts +53 -0
- package/test/forecast-metrics.test.ts +1 -1
- package/test/forecast-tuning.test.ts +1 -1
- package/test/ingest-health-engine.test.ts +2 -2
- package/test/ingest-health-wiring.test.ts +7 -5
- package/test/ingest-health.test.ts +6 -6
- package/test/ingest-history.test.ts +2 -2
- package/test/ingest-idempotent.test.ts +132 -0
- package/test/ingest-space.test.ts +3 -3
- package/test/integration-probes.test.ts +3 -3
- package/test/integration-runner.test.ts +1 -1
- package/test/item-ref.test.ts +1 -1
- package/test/journal-order-axis.test.ts +80 -0
- package/test/journal-read-discipline.test.ts +16 -6
- package/test/journal-retention.test.ts +171 -29
- package/test/journal-sort-axis.test.ts +1 -1
- package/test/journal-write-door.test.ts +3 -3
- package/test/journal-write-trend.test.ts +1 -1
- package/test/kernel-kind-guard.test.ts +3 -3
- package/test/knob-defaults.test.ts +1 -1
- package/test/kpi-baseline-db.test.ts +2 -2
- package/test/kpi-fold.test.ts +185 -14
- package/test/kpi-query-bench.test.ts +3 -3
- package/test/live-cursor-wiring.test.ts +6 -6
- package/test/live-kernel-facts.test.ts +11 -11
- package/test/live-mirror-parity.test.ts +3 -3
- package/test/load-meter.test.ts +1 -1
- package/test/local-declarations.test.ts +10 -10
- package/test/log-stamp.test.ts +1 -1
- package/test/measured-yield.test.ts +2 -2
- package/test/merge-streams.test.ts +70 -0
- package/test/mirror-resumes-from-checkpoint.test.ts +13 -13
- package/test/model-basis.test.ts +2 -2
- package/test/model-gap.test.ts +4 -4
- package/test/model-vocabulary.test.ts +2 -2
- package/test/move-space.test.ts +1 -1
- package/test/oee-accumulator.test.ts +2 -2
- package/test/operational-vocabulary.test.ts +2 -2
- package/test/project-structure-db.test.ts +2 -2
- package/test/projection-reaches-screen.test.ts +2 -2
- package/test/property-effects.test.ts +3 -3
- package/test/read-failure-ledger.test.ts +106 -0
- package/test/read-failure-visible.test.ts +7 -7
- package/test/read-time.test.ts +118 -0
- package/test/reference-grounding.test.ts +1 -1
- package/test/reference-hook.test.ts +86 -0
- package/test/registry-key-guard.test.ts +1 -1
- package/test/rename-twin.test.ts +81 -0
- package/test/restart-policy.test.ts +3 -3
- package/test/resync-origin-site.test.ts +3 -3
- package/test/revision-axis.test.ts +14 -8
- package/test/runtime-key.test.ts +3 -3
- package/test/snapshot-freshness.test.ts +4 -4
- package/test/source-outcome-audit.test.ts +1 -1
- package/test/space-integrity.test.ts +1 -1
- package/test/space-representation.test.ts +66 -0
- package/test/space-scope-includes-stopped.test.ts +55 -0
- package/test/spec-coverage.test.ts +1 -1
- package/test/standard-coverage.test.ts +19 -21
- package/test/status-tally.test.ts +1 -1
- package/test/structure-revision-db.test.ts +7 -7
- package/test/subject-fast-path.test.ts +148 -0
- package/test/subject-read-model.test.ts +175 -0
- package/test/touched-items.test.ts +2 -2
- package/test/twin-audit.test.ts +1 -1
- package/test/twin-event-keys.test.ts +1 -1
- package/test/twin-model-item-db.test.ts +5 -5
- package/test/twin-model-tree-db.test.ts +35 -2
- package/test/twin-origin-resync.test.ts +1 -1
- package/test/warm-start-seam.test.ts +1 -1
- package/test/warm-start.test.ts +6 -6
- package/test/withheld-door.test.ts +2 -2
- package/test/yield-loop.test.ts +4 -4
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"energy-topology.js","sourceRoot":"","sources":["../../server/engine/energy-topology.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ์ ๋ ฅ ๊ณํต๋ โ **์ ์ธ๋ ๊ฒ๋ง ๊ทธ๋ฆฐ๋ค.** ์์.\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ถ๊ธฐ๋ณ ๋ง๋๋ ใ์ด๋๊ฐ ๋ง์ด ์ฐ๋ใ์ ๋ตํ์ง๋ง **์ด๋์ ๊ฑธ๋ ค ์๋**์ ๋ตํ์ง ๋ชปํ๋ค. ์ค์ ๋ก ๋ถ๋ชํ\n * ์ธ ๊ฐ์ง๊ฐ ์ ๋ถ ๊ณํต ์ง๋ฌธ์ด์๋ค:\n * ยท ใํ์ ๊ณ๋์ด ๋ฎ์ง ์๋ 327 kWhใ โ ๊ทธ ๋ชซ์ด ์์ ์ง๊ฒฐ ๋ถํ์ธ์ง, ๊ณ๋ ์๋ ๊ตฌ๊ฐ์ธ์ง ํ๋ก๋ ๋ชจ๋ฅธ๋ค.\n * ยท ์ปค๋ฅํฐ๋ ๊ฒฐ์ ์ ๋ชจ๋ฅด๋ ๋ถํ๋ฅผ **์์ ์ ๋งค๋จ๋ค**(์ ์งํ ์ ํ). ๊ทธ๋ฐ๋ฐ ๊ทธ ์ฌ์ค์ด ํ๋ฉด์ ์์๋ค.\n * ยท ใ๊ณ๋๊ธฐ๋ฅผ ์ด๋์ ๋ ๋ฌ์์ผ ํ๋ใ โ ์ด๋์ด ๊ตฌ๊ฐ์ด ๋ณด์ฌ์ผ ๋ตํ ์ ์๋ค.\n *\n * โโ ๋ฌด์์ ๊ทธ๋ฆฌ์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **๋ณดํธ ๊ณํต ๋จ์ ๋(SLD)๊ฐ ์๋๋ค.** ์ฐจ๋จ๊ธฐ ์ ๊ฒฉยท๋ณดํธ ํ์กฐยท์(phase)ยท๊ฒฐ์ ๋ฐฉ์์ ๋ชจ๋ธ์ ์๊ณ , ๊ทธ๋ด๋ฏํ\n * ๋จ์ ๋๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๊ฐ์ง ์์ ๊ณตํ์ ์ถฉ์ค๋๋ฅผ ์ฃผ์ฅํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ **ํธ์์ด ์ ์ธํ ๊ด๊ณ**\n * (์๋ฆฌ์ ๊ณ์ธต + ์ค๋น์ ์์)์ **๊ณ๋์ด ์ค์ ๋ก ๋ฎ๋ ๋ฒ์**๋ฟ์ด๋ค. ํ๊ณ๋ ์๋น์ฒ๊ฐ ํ๋ฉด์ ์ ๋๋ค.\n *\n * โโ ์กฐ์ฉํ ๋น ๋จ๋ฆฌ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ค๋น, ๊ณ๋๊ธฐ๊ฐ ์๋ ์๋ฆฌ, ๊ณ๋์ด ๋ฎ์ง ์๋ ๋ชซ์ **๊ฐ์ ์๊ธฐ ์นธ์ผ๋ก** ๋์จ๋ค. ๊ทธ๋ฆผ์์\n * ์ฌ๋ผ์ง๋ฉด ์ฌ์ฉ์๋ ์๊ธฐ ํ์ฅ์ด ๋ค ๊ทธ๋ ค์ก๋ค๊ณ ๋ฏฟ๋๋ค.\n */\nimport { EMS_LOCATION_TYPES, electricalUpstreamOf } from '@operato/twin-kernel'\n\n/** ๊ณํต์ ํ ๊ตฌ๊ฐ(์์ ยท๋ถ๊ธฐยท๊ตฌ์ญ) โ ์๋ฆฌ ํ๋๊ฐ ๊ณง ๊ตฌ๊ฐ์ด๋ค. */\nexport interface TopologySegment {\n id: string\n /** ์นดํ๋ก๊ทธ ์๋ฆฌ ํ์
(`incoming`ยท`feeder`ยท`submeter-zone`). */\n type: string\n label?: string\n /** ์ด ์๋ฆฌ์ ๋ฌ๋ฆฐ ๊ณ๋ ์ง์ id ๋ค โ ๋น์ด ์์ผ๋ฉด **์ด๋์ด ๊ตฌ๊ฐ**์ด๋ค(๊ฐ์ ์ ๊ธธ์ด ์๋ค). */\n meters: string[]\n /** ์ด ๊ตฌ๊ฐ์ ์ ๋ ฅ๋๊ณผ ๊ทผ๊ฑฐ โ ํด๋๊ฐ ๋ธ ๊ฒ๋ง ์ฃ๋๋ค(์ฐ๋ฆฌ๊ฐ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ค). */\n kWh?: number\n basis?: 'measured' | 'apportioned'\n /**\n * **ํผํฌ๊ฐ ์ฐํ ์๊ฐ** ์ด ๊ตฌ๊ฐ์ด ์ผ๋ง์๋(kW) โ ์๊ธ์ด ๊ฑธ๋ฆฐ ์๋ค.\n *\n * ์ ๋ ฅ๋์ด ํฐ ๊ตฌ๊ฐ๊ณผ ํผํฌ๋ฅผ ๋ง๋ ๊ตฌ๊ฐ์ ๋ค๋ฅผ ์ ์๋ค(ํ๋ฃจ ์ข
์ผ ์กฐ๊ธ์ฉ ์ฐ๋ ๋ถํ vs ์ ๊น ํฌ๊ฒ ์ฐ๋ ๋ถํ).\n * ๊ทธ๋ฆผ์ ๋์ ํจ๊ป ๋๋ฉด ใ์ด๋ ๋ถ๊ธฐ๋ฅผ ๊น์์ผ ํผํฌ๊ฐ ๋ด๋ ค๊ฐ๋ใ๊ฐ ๋ฐ๋ก ์ฝํ๋ค.\n */\n peakKW?: number\n /** ์ด ์๋ฆฌ์ ๋งค๋ฌ๋ฆฐ ๋ถํ(์ค๋น) โ ์ข
๋ฅ๋ฅผ ๊ทธ๋๋ก ์ฃ๋๋ค. */\n loads: { id: string; kind: string }[]\n /**\n * ๊ณํต ์ค๋น(์ฐจ๋จ๊ธฐยทํ์๊ดยท์ถ์ ์ง) โ ๋ถํ๊ฐ ์๋๋ผ ๊ณํต์ ์ผ๋ถ๋ค.\n *\n * `live` ๋ **์ง๊ธ ๊ฐ**์ด๋ค(๊ตฌ๊ฐ ๊ฐ์ด ์๋๋ค): ํ์๊ด์ด ์ง๊ธ ๋ช kW ๋ฅผ ๋ง๋ค๊ณ , ์ถ์ ์ง๊ฐ ์ผ๋ง๋ฅผ ๋ด๋ณด๋ด๋ฉฐ\n * ์ถฉ์ ์จ์ด ์ผ๋ง์ธ๊ฐ. ์์ฒ์ด ๋ณด๋ด ์ฃผ๋ ์ฌ์ค์ด๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์ง ์๋๋ค โ ๋ณด๋ด์ง ์์ ํ๋๋ ์๋ค.\n *\n * ์๊ฐ(`measuredAt`)์ ํจ๊ป ๋๋ฅธ๋ค: ๊ณ์ธก์ด ๋๊ธฐ๋ฉด **๋ฉ์ถ ๊ฐ์ ์ง๊ธ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๊ฒ** ๋๊ณ , ๊ทธ๊ฒ์ด ํ๋ฉด์ด\n * ๋ผ ์ ์๋ ๊ฐ์ฅ ๋์ ๊ฑฐ์ง์ด๋ค(๊ฐ์ด ๊ทธ๋ด๋ฏํ ์๋ก ์ํํ๋ค).\n */\n gear: {\n id: string\n kind: string\n live?: { generatedKW?: number; exportKW?: number; chargeKW?: number; dischargeKW?: number; soc?: number; measuredAt?: string }\n }[]\n children: TopologySegment[]\n}\n\nexport interface EnergyTopology {\n roots: TopologySegment[]\n /**\n * ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ค๋น โ ์ง์ด ์๊ฑฐ๋, ์๋ ์๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์จ๊ธฐ๋ฉด ๊ทธ๋ฆผ์ ์ค๋น ์๊ฐ ๋ชจ๋ธ๊ณผ ๋ฌ๋ผ์ง๋ค.\n */\n unplaced: { id: string; kind: string }[]\n /** ๊ณ๋๊ธฐ๊ฐ ์๋ ์๋ฆฌ id ๋ค โ ใ์ฌ๊ธฐ์ ๋ฌ๋ฉด ๋ฌด์์ ์ ์ ์๋ใ์ ๋ต์ด ๋๋ ๋ชฉ๋ก์ด๋ค. */\n unmetered: string[]\n /**\n * ๊ฒฐ์ ์ ๋ชจ๋ฅด๋ ๋ถํ๊ฐ ๋งค๋ฌ๋ฆฐ ์๋ฆฌ โ ์ปค๋ฅํฐ๊ฐ ใ์ด๋ ๋ถ๊ธฐ๊ฐ ์ด ์ค๋น์ ์ ๊ธฐ๋ฅผ ์ฃผ๋์ง ๋ชจ๋ฅธ๋คใ๊ณ ํ๋จํด\n * ์์ ์ ๋งค๋จ ๊ฒฝ์ฐ๋ค. ๊ทธ ์๋ฆฌ์ ๋ชซ์ด ๋ถ๊ธฐ๋ก ๋ด๋ ค๊ฐ์ง ์๋ ์ด์ ๊ฐ ์ด๊ฒ์ด๋ค.\n */\n loadsOnIncoming: number\n}\n\n/**\n * ์ด ์ค๋น์ **์ง๊ธ ๊ฐ** โ ์ค๋
์ท์์ ๊ทธ ์ค๋น๋ฅผ ์ฐพ์ ์๋์ง ์ถ์ ๊ฐ๋ง ์ฎ๊ธด๋ค.\n *\n * ์ข
๋ฅ๊ฐ ์๋ ํ๋๋ง ์ฎ๊ธด๋ค: ํ์๊ด์ ์ถฉ์ ์จ์ ๋ถ์ด๊ฑฐ๋ ์ถ์ ์ง์ ๋ฐ์ ๋์ ๋ถ์ด๋ฉด, ํ๋ฉด์ ๊ทธ๊ฒ์ ์ฌ์ค๋ก\n * ๊ทธ๋ฆฌ๊ณ ์ฌ๋์ ๊ทธ ์ค๋น๊ฐ ๊ทธ๋ฐ ์ผ์ ํ๋ค๊ณ ์ฝ๋๋ค(์ปค๋์ด ์ข
๋ฅ๋ณ๋ก ํ๋๋ฅผ ๊ฐ๋ ค ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ท์จ).\n */\nfunction liveOf(\n state: readonly any[] | undefined | null,\n id: string,\n kind: string\n): { live: NonNullable<TopologySegment['gear'][number]['live']> } | undefined {\n const e = (state ?? []).find(x => String(x?.id ?? '') === id)\n if (!e) return undefined\n const num = (v: unknown): number | undefined => (Number.isFinite(Number(v)) ? Number(v) : undefined)\n const live: NonNullable<TopologySegment['gear'][number]['live']> = {}\n if (kind === 'pv-array') {\n const g = num(e.generatedKW)\n const x = num(e.exportKW)\n if (g !== undefined) live.generatedKW = g\n if (x !== undefined) live.exportKW = x\n } else if (kind === 'battery') {\n const soc = num(e.soc)\n const dis = num(e.dischargeKW)\n const cha = num(e.chargeKW)\n if (soc !== undefined) live.soc = soc\n if (dis !== undefined) live.dischargeKW = dis\n if (cha !== undefined) live.chargeKW = cha\n }\n if (!Object.keys(live).length) return undefined\n /* ๊ฐ์ด ์์ผ๋ฉด ์๊ฐ๋ ํจ๊ป โ ์์ผ๋ฉด ๋ถ์ด์ง ์๋๋ค(๋ชจ๋ฅด๋ ์๊ฐ์ ์ง๊ธ์ผ๋ก ๋ง๋ค์ง ์๋๋ค). */\n if (e.measuredAt) live.measuredAt = String(e.measuredAt)\n return { live }\n}\n\nconst ELECTRICAL = new Set(EMS_LOCATION_TYPES as readonly string[])\n/** ๋ถํ๊ฐ ์๋ ๊ณํต ์ค๋น โ ์ด๊ฒ๋ค์ ์๋น๋ฅผ ๋ถํ๋ก ์ธ๋ฉด ์ด๋์ด ์ด์ค์ผ๋ก ๋๋๋ค. */\nconst GEAR = new Set(['meter', 'breaker', 'pv-array', 'battery'])\n\n/**\n * ๋ชจ๋ธ + ํด๋ ๊ฒฐ๊ณผ โ ๊ณํต ํธ๋ฆฌ.\n *\n * @param model ํธ์ ๋ชจ๋ธ(์๋ฆฌ ๊ณ์ธต `parentId`, ์ค๋น ์์ `homeLocation`).\n * @param energy ํด๋๊ฐ ๋ธ ๋ถ๊ธฐ๋ณ ๋ชซ(์์ผ๋ฉด ๋
ธ๋์ ์ฃ๋๋ค โ ์์ผ๋ฉด ๊ฐ ์์ด ๊ตฌ์กฐ๋ง ๊ทธ๋ฆฐ๋ค).\n */\nexport function buildEnergyTopology(\n model: { locations?: any[]; equipment?: any[] } | undefined | null,\n energy?: { byFeeder?: { key: string; kWh: number; basis?: 'measured' | 'apportioned'; peakKW?: number }[] } | null,\n /**\n * ์ง๊ธ์ ์ค๋น ์ํ(์ค๋
์ท์ `equipment`) โ ๋ฐ์ ยท์ ์ฅ์ **์ง๊ธ ๊ฐ**์ ๊ธฐํธ ์์ ์ ๊ธฐ ์ํด์๋ค.\n *\n * ์์ผ๋ฉด ๊ฐ ์์ด ๊ตฌ์กฐ๋ง ๊ทธ๋ฆฐ๋ค. ์ฌ๊ธฐ์ ๊ฐ์ ๋ง๋ค์ง ์๋๋ค: ์์ฒ์ด ๋ณด๋ด์ง ์์ ๊ฒ์ ๋ชจ๋ฅด๋ ๊ฒ์ด๋ค.\n */\n equipmentState?: readonly any[] | null\n): EnergyTopology {\n const locations: any[] = (model?.locations ?? []).filter(n => n?.id && ELECTRICAL.has(String(n.type)))\n const byId = new Map<string, TopologySegment>()\n for (const n of locations) {\n byId.set(String(n.id), {\n id: String(n.id),\n type: String(n.type),\n ...(n.name ? { label: String(n.name) } : {}),\n meters: [],\n loads: [],\n gear: [],\n children: []\n })\n }\n\n const share = new Map((energy?.byFeeder ?? []).map(f => [f.key, f]))\n for (const [id, segment] of byId) {\n const s = share.get(id)\n if (s) {\n segment.kWh = s.kWh\n if (s.basis) segment.basis = s.basis\n if (typeof s.peakKW === 'number') segment.peakKW = s.peakKW\n }\n }\n\n /* ์ค๋น๋ฅผ ์๊ธฐ ์๋ฆฌ์ ๋ถ์ธ๋ค โ ๊ณ๋๊ธฐ๋ ใ์ด ๊ตฌ๊ฐ์ ์ฐ๋คใ๋ ๋ป์ด๋ผ ๋ฐ๋ก ๋ชจ์๋ค. */\n const unplaced: { id: string; kind: string }[] = []\n let loadsOnIncoming = 0\n for (const e of (model?.equipment ?? []) as any[]) {\n if (!e?.id) continue\n const kind = String(e.kind ?? '')\n const home = String(e.homeLocation ?? e.homeLocationId ?? '')\n const at = byId.get(home)\n if (!at) {\n /* ์ ๊ธฐ ๊ณํต ๋ฐ์ ์๋ฆฌ์ ์ฌ๋ ์ค๋น๋ ์ฌ๊ธฐ์๋ ใ์๋ฆฌ๋ฅผ ๋ชจ๋ฅธ๋คใ๋ก ๋ชจ์๋ค โ ์ด ๊ทธ๋ฆผ์ ์ถ์ ๊ณํต์ด๋ค. */\n unplaced.push({ id: String(e.id), kind })\n continue\n }\n if (kind === 'meter') at.meters.push(String(e.id))\n else if (GEAR.has(kind)) at.gear.push({ id: String(e.id), kind, ...(liveOf(equipmentState, String(e.id), kind) ?? {}) })\n else {\n at.loads.push({ id: String(e.id), kind })\n if (at.type === 'incoming') loadsOnIncoming++\n }\n }\n\n /*\n * ๊ณ์ธต์ ์๋ ๊ฒ์ **์ ๊ธฐ ์๋ฅ**๋ค โ ๊ณต๊ฐ ๋ถ๋ชจ(๊ณต์ฅยท๊ตฌ์ญ)๋ ์ด ์ถ์ด ์๋๋ค. ์๋ฅ์ ๋ป์ ์ปค๋์ด ์ฝ๋๋ค\n * (์ ์ธ๋๋ ๊ทธ ์์์ ํก์๋๋ค) โ ์ฌ๊ธฐ์ ๋ค์ ํ์ ํ๋ฉด ํ๋ฉด๊ณผ ๊ณ์ฐ์ด ๋ค๋ฅธ ๊ณํต์ ๋งํ๊ฒ ๋๋ค.\n */\n const roots: TopologySegment[] = []\n const all = model?.locations ?? []\n for (const n of locations) {\n const segment = byId.get(String(n.id))!\n const up = electricalUpstreamOf(all as any, String(n.id))\n const parent = up ? byId.get(up) : undefined\n if (parent && parent !== segment) parent.children.push(segment)\n else roots.push(segment)\n }\n\n const unmetered = [...byId.values()].filter(n => !n.meters.length).map(n => n.id)\n return { roots, unplaced, unmetered, loadsOnIncoming }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"energy-topology.js","sourceRoot":"","sources":["../../server/engine/energy-topology.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * ์ ๋ ฅ ๊ณํต๋ โ **์ ์ธ๋ ๊ฒ๋ง ๊ทธ๋ฆฐ๋ค.** ์์.\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-18) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ถ๊ธฐ๋ณ ๋ง๋๋ ใ์ด๋๊ฐ ๋ง์ด ์ฐ๋ใ์ ๋ตํ์ง๋ง **์ด๋์ ๊ฑธ๋ ค ์๋**์ ๋ตํ์ง ๋ชปํ๋ค. ์ค์ ๋ก ๋ถ๋ชํ\n * ์ธ ๊ฐ์ง๊ฐ ์ ๋ถ ๊ณํต ์ง๋ฌธ์ด์๋ค:\n * ยท ใํ์ ๊ณ๋์ด ๋ฎ์ง ์๋ 327 kWhใ โ ๊ทธ ๋ชซ์ด ์์ ์ง๊ฒฐ ๋ถํ์ธ์ง, ๊ณ๋ ์๋ ๊ตฌ๊ฐ์ธ์ง ํ๋ก๋ ๋ชจ๋ฅธ๋ค.\n * ยท ์ปค๋ฅํฐ๋ ๊ฒฐ์ ์ ๋ชจ๋ฅด๋ ๋ถํ๋ฅผ **์์ ์ ๋งค๋จ๋ค**(์ ์งํ ์ ํ). ๊ทธ๋ฐ๋ฐ ๊ทธ ์ฌ์ค์ด ํ๋ฉด์ ์์๋ค.\n * ยท ใ๊ณ๋๊ธฐ๋ฅผ ์ด๋์ ๋ ๋ฌ์์ผ ํ๋ใ โ ์ด๋์ด ๊ตฌ๊ฐ์ด ๋ณด์ฌ์ผ ๋ตํ ์ ์๋ค.\n *\n * โโ ๋ฌด์์ ๊ทธ๋ฆฌ์ง ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * **๋ณดํธ ๊ณํต ๋จ์ ๋(SLD)๊ฐ ์๋๋ค.** ์ฐจ๋จ๊ธฐ ์ ๊ฒฉยท๋ณดํธ ํ์กฐยท์(phase)ยท๊ฒฐ์ ๋ฐฉ์์ ๋ชจ๋ธ์ ์๊ณ , ๊ทธ๋ด๋ฏํ\n * ๋จ์ ๋๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๊ฐ์ง ์์ ๊ณตํ์ ์ถฉ์ค๋๋ฅผ ์ฃผ์ฅํ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ๋ฆฌ๋ ๊ฒ์ **ํธ์์ด ์ ์ธํ ๊ด๊ณ**\n * (์๋ฆฌ์ ๊ณ์ธต + ์ค๋น์ ์์)์ **๊ณ๋์ด ์ค์ ๋ก ๋ฎ๋ ๋ฒ์**๋ฟ์ด๋ค. ํ๊ณ๋ ์๋น์ฒ๊ฐ ํ๋ฉด์ ์ ๋๋ค.\n *\n * โโ ์๋ฆฌ์ง ์๊ณ ๋น ๋จ๋ฆฌ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ค๋น, ๊ณ๋๊ธฐ๊ฐ ์๋ ์๋ฆฌ, ๊ณ๋์ด ๋ฎ์ง ์๋ ๋ชซ์ **๊ฐ์ ์๊ธฐ ์นธ์ผ๋ก** ๋์จ๋ค. ๊ทธ๋ฆผ์์\n * ์ฌ๋ผ์ง๋ฉด ์ฌ์ฉ์๋ ์๊ธฐ ํ์ฅ์ด ๋ค ๊ทธ๋ ค์ก๋ค๊ณ ๋ฏฟ๋๋ค.\n */\nimport { EMS_LOCATION_TYPES, electricalUpstreamOf } from '@operato/twin-kernel'\n\n/** ๊ณํต์ ํ ๊ตฌ๊ฐ(์์ ยท๋ถ๊ธฐยท๊ตฌ์ญ) โ ์๋ฆฌ ํ๋๊ฐ ๊ณง ๊ตฌ๊ฐ์ด๋ค. */\nexport interface TopologySegment {\n id: string\n /** ์นดํ๋ก๊ทธ ์๋ฆฌ ํ์
(`incoming`ยท`feeder`ยท`submeter-zone`). */\n type: string\n label?: string\n /** ์ด ์๋ฆฌ์ ๋ฌ๋ฆฐ ๊ณ๋ ์ง์ id ๋ค โ ๋น์ด ์์ผ๋ฉด **์ด๋์ด ๊ตฌ๊ฐ**์ด๋ค(๊ฐ์ ์ ๊ธธ์ด ์๋ค). */\n meters: string[]\n /** ์ด ๊ตฌ๊ฐ์ ์ ๋ ฅ๋๊ณผ ๊ทผ๊ฑฐ โ ํด๋๊ฐ ๋ธ ๊ฒ๋ง ์ฃ๋๋ค(์ฐ๋ฆฌ๊ฐ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ค). */\n kWh?: number\n basis?: 'measured' | 'apportioned'\n /**\n * **ํผํฌ๊ฐ ์ฐํ ์๊ฐ** ์ด ๊ตฌ๊ฐ์ด ์ผ๋ง์๋(kW) โ ์๊ธ์ด ๊ฑธ๋ฆฐ ์๋ค.\n *\n * ์ ๋ ฅ๋์ด ํฐ ๊ตฌ๊ฐ๊ณผ ํผํฌ๋ฅผ ๋ง๋ ๊ตฌ๊ฐ์ ๋ค๋ฅผ ์ ์๋ค(ํ๋ฃจ ์ข
์ผ ์กฐ๊ธ์ฉ ์ฐ๋ ๋ถํ vs ์ ๊น ํฌ๊ฒ ์ฐ๋ ๋ถํ).\n * ๊ทธ๋ฆผ์ ๋์ ํจ๊ป ๋๋ฉด ใ์ด๋ ๋ถ๊ธฐ๋ฅผ ๊น์์ผ ํผํฌ๊ฐ ๋ด๋ ค๊ฐ๋ใ๊ฐ ๋ฐ๋ก ์ฝํ๋ค.\n */\n peakKW?: number\n /** ์ด ์๋ฆฌ์ ๋งค๋ฌ๋ฆฐ ๋ถํ(์ค๋น) โ ์ข
๋ฅ๋ฅผ ๊ทธ๋๋ก ์ฃ๋๋ค. */\n loads: { id: string; kind: string }[]\n /**\n * ๊ณํต ์ค๋น(์ฐจ๋จ๊ธฐยทํ์๊ดยท์ถ์ ์ง) โ ๋ถํ๊ฐ ์๋๋ผ ๊ณํต์ ์ผ๋ถ๋ค.\n *\n * `live` ๋ **์ง๊ธ ๊ฐ**์ด๋ค(๊ตฌ๊ฐ ๊ฐ์ด ์๋๋ค): ํ์๊ด์ด ์ง๊ธ ๋ช kW ๋ฅผ ๋ง๋ค๊ณ , ์ถ์ ์ง๊ฐ ์ผ๋ง๋ฅผ ๋ด๋ณด๋ด๋ฉฐ\n * ์ถฉ์ ์จ์ด ์ผ๋ง์ธ๊ฐ. ์์ฒ์ด ๋ณด๋ด ์ฃผ๋ ์ฌ์ค์ด๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์ง ์๋๋ค โ ๋ณด๋ด์ง ์์ ํ๋๋ ์๋ค.\n *\n * ์๊ฐ(`measuredAt`)์ ํจ๊ป ๋๋ฅธ๋ค: ๊ณ์ธก์ด ๋๊ธฐ๋ฉด **๋ฉ์ถ ๊ฐ์ ์ง๊ธ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๊ฒ** ๋๊ณ , ๊ทธ๊ฒ์ด ํ๋ฉด์ด\n * ๋ผ ์ ์๋ ๊ฐ์ฅ ๋์ ๊ฑฐ์ง์ด๋ค(๊ฐ์ด ๊ทธ๋ด๋ฏํ ์๋ก ์ํํ๋ค).\n */\n gear: {\n id: string\n kind: string\n live?: { generatedKW?: number; exportKW?: number; chargeKW?: number; dischargeKW?: number; soc?: number; measuredAt?: string }\n }[]\n children: TopologySegment[]\n}\n\nexport interface EnergyTopology {\n roots: TopologySegment[]\n /**\n * ์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๋ ์ค๋น โ ์ง์ด ์๊ฑฐ๋, ์๋ ์๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์จ๊ธฐ๋ฉด ๊ทธ๋ฆผ์ ์ค๋น ์๊ฐ ๋ชจ๋ธ๊ณผ ๋ฌ๋ผ์ง๋ค.\n */\n unplaced: { id: string; kind: string }[]\n /** ๊ณ๋๊ธฐ๊ฐ ์๋ ์๋ฆฌ id ๋ค โ ใ์ฌ๊ธฐ์ ๋ฌ๋ฉด ๋ฌด์์ ์ ์ ์๋ใ์ ๋ต์ด ๋๋ ๋ชฉ๋ก์ด๋ค. */\n unmetered: string[]\n /**\n * ๊ฒฐ์ ์ ๋ชจ๋ฅด๋ ๋ถํ๊ฐ ๋งค๋ฌ๋ฆฐ ์๋ฆฌ โ ์ปค๋ฅํฐ๊ฐ ใ์ด๋ ๋ถ๊ธฐ๊ฐ ์ด ์ค๋น์ ์ ๊ธฐ๋ฅผ ์ฃผ๋์ง ๋ชจ๋ฅธ๋คใ๊ณ ํ๋จํด\n * ์์ ์ ๋งค๋จ ๊ฒฝ์ฐ๋ค. ๊ทธ ์๋ฆฌ์ ๋ชซ์ด ๋ถ๊ธฐ๋ก ๋ด๋ ค๊ฐ์ง ์๋ ์ด์ ๊ฐ ์ด๊ฒ์ด๋ค.\n */\n loadsOnIncoming: number\n}\n\n/**\n * ์ด ์ค๋น์ **์ง๊ธ ๊ฐ** โ ์ค๋
์ท์์ ๊ทธ ์ค๋น๋ฅผ ์ฐพ์ ์๋์ง ์ถ์ ๊ฐ๋ง ์ฎ๊ธด๋ค.\n *\n * ์ข
๋ฅ๊ฐ ์๋ ํ๋๋ง ์ฎ๊ธด๋ค: ํ์๊ด์ ์ถฉ์ ์จ์ ๋ถ์ด๊ฑฐ๋ ์ถ์ ์ง์ ๋ฐ์ ๋์ ๋ถ์ด๋ฉด, ํ๋ฉด์ ๊ทธ๊ฒ์ ์ฌ์ค๋ก\n * ๊ทธ๋ฆฌ๊ณ ์ฌ๋์ ๊ทธ ์ค๋น๊ฐ ๊ทธ๋ฐ ์ผ์ ํ๋ค๊ณ ์ฝ๋๋ค(์ปค๋์ด ์ข
๋ฅ๋ณ๋ก ํ๋๋ฅผ ๊ฐ๋ ค ๋ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ท์จ).\n */\nfunction liveOf(\n state: readonly any[] | undefined | null,\n id: string,\n kind: string\n): { live: NonNullable<TopologySegment['gear'][number]['live']> } | undefined {\n const e = (state ?? []).find(x => String(x?.id ?? '') === id)\n if (!e) return undefined\n const num = (v: unknown): number | undefined => (Number.isFinite(Number(v)) ? Number(v) : undefined)\n const live: NonNullable<TopologySegment['gear'][number]['live']> = {}\n if (kind === 'pv-array') {\n const g = num(e.generatedKW)\n const x = num(e.exportKW)\n if (g !== undefined) live.generatedKW = g\n if (x !== undefined) live.exportKW = x\n } else if (kind === 'battery') {\n const soc = num(e.soc)\n const dis = num(e.dischargeKW)\n const cha = num(e.chargeKW)\n if (soc !== undefined) live.soc = soc\n if (dis !== undefined) live.dischargeKW = dis\n if (cha !== undefined) live.chargeKW = cha\n }\n if (!Object.keys(live).length) return undefined\n /* ๊ฐ์ด ์์ผ๋ฉด ์๊ฐ๋ ํจ๊ป โ ์์ผ๋ฉด ๋ถ์ด์ง ์๋๋ค(๋ชจ๋ฅด๋ ์๊ฐ์ ์ง๊ธ์ผ๋ก ๋ง๋ค์ง ์๋๋ค). */\n if (e.measuredAt) live.measuredAt = String(e.measuredAt)\n return { live }\n}\n\nconst ELECTRICAL = new Set(EMS_LOCATION_TYPES as readonly string[])\n/** ๋ถํ๊ฐ ์๋ ๊ณํต ์ค๋น โ ์ด๊ฒ๋ค์ ์๋น๋ฅผ ๋ถํ๋ก ์ธ๋ฉด ์ด๋์ด ์ด์ค์ผ๋ก ๋๋๋ค. */\nconst GEAR = new Set(['meter', 'breaker', 'pv-array', 'battery'])\n\n/**\n * ๋ชจ๋ธ + ํด๋ ๊ฒฐ๊ณผ โ ๊ณํต ํธ๋ฆฌ.\n *\n * @param model ํธ์ ๋ชจ๋ธ(์๋ฆฌ ๊ณ์ธต `parentId`, ์ค๋น ์์ `homeLocation`).\n * @param energy ํด๋๊ฐ ๋ธ ๋ถ๊ธฐ๋ณ ๋ชซ(์์ผ๋ฉด ๋
ธ๋์ ์ฃ๋๋ค โ ์์ผ๋ฉด ๊ฐ ์์ด ๊ตฌ์กฐ๋ง ๊ทธ๋ฆฐ๋ค).\n */\nexport function buildEnergyTopology(\n model: { locations?: any[]; equipment?: any[] } | undefined | null,\n energy?: { byFeeder?: { key: string; kWh: number; basis?: 'measured' | 'apportioned'; peakKW?: number }[] } | null,\n /**\n * ์ง๊ธ์ ์ค๋น ์ํ(์ค๋
์ท์ `equipment`) โ ๋ฐ์ ยท์ ์ฅ์ **์ง๊ธ ๊ฐ**์ ๊ธฐํธ ์์ ์ ๊ธฐ ์ํด์๋ค.\n *\n * ์์ผ๋ฉด ๊ฐ ์์ด ๊ตฌ์กฐ๋ง ๊ทธ๋ฆฐ๋ค. ์ฌ๊ธฐ์ ๊ฐ์ ๋ง๋ค์ง ์๋๋ค: ์์ฒ์ด ๋ณด๋ด์ง ์์ ๊ฒ์ ๋ชจ๋ฅด๋ ๊ฒ์ด๋ค.\n */\n equipmentState?: readonly any[] | null\n): EnergyTopology {\n const locations: any[] = (model?.locations ?? []).filter(n => n?.id && ELECTRICAL.has(String(n.type)))\n const byId = new Map<string, TopologySegment>()\n for (const n of locations) {\n byId.set(String(n.id), {\n id: String(n.id),\n type: String(n.type),\n ...(n.name ? { label: String(n.name) } : {}),\n meters: [],\n loads: [],\n gear: [],\n children: []\n })\n }\n\n const share = new Map((energy?.byFeeder ?? []).map(f => [f.key, f]))\n for (const [id, segment] of byId) {\n const s = share.get(id)\n if (s) {\n segment.kWh = s.kWh\n if (s.basis) segment.basis = s.basis\n if (typeof s.peakKW === 'number') segment.peakKW = s.peakKW\n }\n }\n\n /* ์ค๋น๋ฅผ ์๊ธฐ ์๋ฆฌ์ ๋ถ์ธ๋ค โ ๊ณ๋๊ธฐ๋ ใ์ด ๊ตฌ๊ฐ์ ์ฐ๋คใ๋ ๋ป์ด๋ผ ๋ฐ๋ก ๋ชจ์๋ค. */\n const unplaced: { id: string; kind: string }[] = []\n let loadsOnIncoming = 0\n for (const e of (model?.equipment ?? []) as any[]) {\n if (!e?.id) continue\n const kind = String(e.kind ?? '')\n const home = String(e.homeLocation ?? e.homeLocationId ?? '')\n const at = byId.get(home)\n if (!at) {\n /* ์ ๊ธฐ ๊ณํต ๋ฐ์ ์๋ฆฌ์ ์ฌ๋ ์ค๋น๋ ์ฌ๊ธฐ์๋ ใ์๋ฆฌ๋ฅผ ๋ชจ๋ฅธ๋คใ๋ก ๋ชจ์๋ค โ ์ด ๊ทธ๋ฆผ์ ์ถ์ ๊ณํต์ด๋ค. */\n unplaced.push({ id: String(e.id), kind })\n continue\n }\n if (kind === 'meter') at.meters.push(String(e.id))\n else if (GEAR.has(kind)) at.gear.push({ id: String(e.id), kind, ...(liveOf(equipmentState, String(e.id), kind) ?? {}) })\n else {\n at.loads.push({ id: String(e.id), kind })\n if (at.type === 'incoming') loadsOnIncoming++\n }\n }\n\n /*\n * ๊ณ์ธต์ ์๋ ๊ฒ์ **์ ๊ธฐ ์๋ฅ**๋ค โ ๊ณต๊ฐ ๋ถ๋ชจ(๊ณต์ฅยท๊ตฌ์ญ)๋ ์ด ์ถ์ด ์๋๋ค. ์๋ฅ์ ๋ป์ ์ปค๋์ด ์ฝ๋๋ค\n * (์ ์ธ๋๋ ๊ทธ ์์์ ํก์๋๋ค) โ ์ฌ๊ธฐ์ ๋ค์ ํ์ ํ๋ฉด ํ๋ฉด๊ณผ ๊ณ์ฐ์ด ๋ค๋ฅธ ๊ณํต์ ๋งํ๊ฒ ๋๋ค.\n */\n const roots: TopologySegment[] = []\n const all = model?.locations ?? []\n for (const n of locations) {\n const segment = byId.get(String(n.id))!\n const up = electricalUpstreamOf(all as any, String(n.id))\n const parent = up ? byId.get(up) : undefined\n if (parent && parent !== segment) parent.children.push(segment)\n else roots.push(segment)\n }\n\n const unmetered = [...byId.values()].filter(n => !n.meters.length).map(n => n.id)\n return { roots, unplaced, unmetered, loadsOnIncoming }\n}\n"]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ์ด ๋ดํฌ๊ฐ ๋งํ๋ ์ฌ์ค์ ์ ์ฒด โ ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฌ์ค์ด๋ค.
|
|
3
|
+
*
|
|
4
|
+
* ๋์์ด๋ ์๊ฐ์ ์ ์ ์์ผ๋ฉด **์ ์ฒด๋ฅผ ๋ง๋ค์ง ์๋๋ค**(`undefined`). ๊ทธ๋๋ ๊ฑฐ๋ฅด์ง ์๊ณ ํต๊ณผ์ํจ๋ค โ
|
|
5
|
+
* ๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ๋ค๊ณ ํ๋จํ๋ฉด ์๋ก ๋ค๋ฅธ ์ฌ์ค์ด ํ๋๋ก ํฉ์ณ์ง๋ค. ์๋ฆฌ์ง ์๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋ฒ ์ธ๋ ๊ฒ์ด ๋ซ๋ค.
|
|
6
|
+
*/
|
|
7
|
+
export declare function factIdentity(envelope: any): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* ์ต๊ทผ์ ๋ณธ ์ ์ฒด๋ฅผ ๊ธฐ์ตํ๋ค โ **ํฌ๊ธฐ์ ์ํ์ ๋๋ค.**
|
|
10
|
+
*
|
|
11
|
+
* ์ ๋ถ ๊ธฐ์ตํ ์๋ ์๋ค(ํธ์ ํ๋๊ฐ ์์ฒ๋ง ์ฌ๊ฑด์ ๊ฐ๋๋ค). ์ฐฝ์ ๋์ผ๋ฉด ์ค๋๋ ๊ฒ๋ถํฐ ์๋๋ค. ์ฐฝ ๋ฐ์
|
|
12
|
+
* ์ฌ์ ์ก์ ๋ค์ ํต๊ณผํ๋๋ฐ, ๊ทธ๊ฒ์ ์ ๋๊ฐ ์ฌ์ค์ด๋ผ ์ํ์ ํด๊ฐ ์๊ณ ์ง๋ ๊ธฐ๋ก์ ํ ์ค ๋ ๋จ๋๋ค.
|
|
13
|
+
* ์ฐฝ์ ํฌ๊ฒ ์ก์ผ๋ฉด ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ค โ ๊ทธ ๊ฐ์ ์ฌ๊ธฐ์ ์ด๋ฆ์ผ๋ก ๋ชป ๋ฐ๋๋ค.
|
|
14
|
+
*
|
|
15
|
+
* **์ฌ๊ธฐ๋์ ๊ฑด๋์ง ๋ชปํ๋ค.** ํ๋ก์ธ์ค๊ฐ ์๋ก ๋จ๋ฉด ๊ธฐ์ต์ด ๋น์ด ์์ผ๋ฏ๋ก, ์ฌ๊ธฐ๋ ์งํ ์ฒซ ์ฃผ๊ธฐ๊ฐ ๊ฐ์
|
|
16
|
+
* ๊ฐ์ ๋ค์ ๋ณด๋ด๋ฉด ๊ฑธ๋ฌ์ง์ง ์๋๋ค. ๊ทธ๊ฒ์ ๋ง์ผ๋ ค๋ฉด ์ด ๊ธฐ์ต์ด ์ ์ฅ๋ผ์ผ ํ๊ณ , ๊ทธ๊ฒ์ ๋ค์ ๊ฑธ์์ด๋ค.
|
|
17
|
+
* ์ง๊ธ์ ๊ทธ ์ฌ์ค์ ์ฌ๊ธฐ ์ ์ด ๋๋ค โ ์ ์ด ๋์ง ์์ผ๋ฉด ใ์ค๋ณต์ ์ด์ ์๋คใ๋ก ์ฝํ๋ค.
|
|
18
|
+
*/
|
|
19
|
+
export declare class FactDeduper {
|
|
20
|
+
/** ๊ธฐ์ตํ๋ ์ ์ฒด์ ์ โ ์ฐฝ. */
|
|
21
|
+
static WINDOW: number;
|
|
22
|
+
private seen;
|
|
23
|
+
private order;
|
|
24
|
+
/** ์ด ์ฌ์ค์ ๋ณธ ์ ์ด ์๋ โ ์์ผ๋ฉด ๊ธฐ์ตํ๊ณ `false`. */
|
|
25
|
+
private known;
|
|
26
|
+
/**
|
|
27
|
+
* ์ฒ์ ๋ณด๋ ๊ฒ๋ง ๋๋ ค์ค๋ค โ ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ๋ฅผ ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค.
|
|
28
|
+
*
|
|
29
|
+
* ๋ฒ๋ฆฐ ์๋ฅผ ํจ๊ป ๋ด๋ ์ด์ : ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ๋ฉด ใ๋ณด๋ธ ์ใ์ ใ๋ฐ์๋ ์ใ๊ฐ ์ด๊ธ๋๋๋ฐ ์๋ฌด๋ ๊ทธ
|
|
30
|
+
* ์ด์ ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ ์๊ฐ ํฌ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ด ๋ณด๋ด๊ณ ์๋ค๋ ๋ป์ด๊ณ , ๊ทธ๊ฒ์ ๊ณ ์น ์ผ์ด๋ค.
|
|
31
|
+
*/
|
|
32
|
+
filter<T>(envelopes: readonly T[]): {
|
|
33
|
+
fresh: T[];
|
|
34
|
+
duplicates: number;
|
|
35
|
+
};
|
|
36
|
+
/** ๊ธฐ์ตํ๊ณ ์๋ ์ ์ฒด์ ์ โ ๊ณ๊ธฐ๊ฐ ์ฝ๋๋ค. */
|
|
37
|
+
size(): number;
|
|
38
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* ๊ฐ์ ์ฌ์ค์ ๋ ๋ฒ ๋ฐ์ผ๋ฉด ํ ๋ฒ๋ง ๋ฐ์ํ๋ค โ **์ ์
๊ฒฝ๊ณ ํ ๊ณณ์์.**
|
|
4
|
+
*
|
|
5
|
+
* โโ ์ ํ์ํ๊ฐ (2026-08-26) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
6
|
+
* ์ง๊ธ ์ค๋ณต์ ๋ง๋ ๊ฒ์ ์ปค๋ฅํฐ๋ง๋ค ๊ฐ์ ํ๊ณ ์๋ค. ๊ทธ๋์ ์ปค๋ฅํฐ๊ฐ ๊ทธ๊ฒ์ ์์ผ๋ฉด ํธ์์ด ๊ทธ๋๋ก ๋ ๋ฒ
|
|
7
|
+
* ์ผ๋ค. ์ค์ ๋ก ๊ทธ๋ฌ๋ค: ํ์๊ด ์ปค๋ฅํฐ๊ฐ 10์ด๋ง๋ค ๋ฌผ์ผ๋ฉด์ 10๋ถ๋ง๋ค ๋ฐ๋๋ ๊ฐ์ ๋งค๋ฒ ๋ค์ ๋ณด๋๊ณ ,
|
|
8
|
+
* ํ ์ฃผ๊ธฐ์ 76๊ฑด์ด ๋ํ์ด๋๋ค(์ปค๋ฅํฐ์์ ๊ณ ์ณ์ 2๊ฑด์ด ๋๋ค).
|
|
9
|
+
*
|
|
10
|
+
* ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์นํ
์ผ๋ก ๋ฐ์ ๋ ๋ ์์ฃผ ๋๋ค. ๋ฐ์ด ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ ์ก์ด ์ ์์ด๋ค โ ๊ทธ์ชฝ์ด ์๋ต์
|
|
11
|
+
* ๋ชป ๋ฐ์ผ๋ฉด ๊ฐ์ ๊ฒ์ ๋ค์ ๋ณด๋ธ๋ค.
|
|
12
|
+
*
|
|
13
|
+
* โโ ๋ฌด์์ด ๋ ๋ฒ ์ธ์ด์ง๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
14
|
+
* ์ ๋๊ฐ์ผ๋ก ๋งํ๋ ์ฌ์ค์ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค(์๋ ยท ์ํ ยท ์ ์ฐ ยท ์๊ฐ kW). ๊ทธ๋ฐ๋ฐ ์ธ๋
|
|
15
|
+
* ๊ฐ์ ๊ทธ๋ ์ง ์๋ค.
|
|
16
|
+
*
|
|
17
|
+
* ๊ตฌ๊ฐ์ ํ๋ณธ ์ ยท ํ๊ท ๋ถํ(ํ๋ณธ ์๋ก ๋๋๋ค) ยท OEE ์นด์ดํฐ ยท ์ ์
๊ณ์
|
|
18
|
+
* ๊ทธ๋ฆฌ๊ณ ์ง๋ ๊ธฐ๋ก์ ๊ฐ์ ์ฌ์ค์ด ๋ ์ค๋ก ๋จ๋๋ค โ ๋์ค์ ๊ทธ ๊ธฐ๋ก์ผ๋ก ๋ค์ ๊ณ์ฐํ๋ฉด ๋ ๋ ๋ฒ ์ผ๋ค
|
|
19
|
+
*
|
|
20
|
+
* โโ ์ ์ฒด๋ฅผ ๋ฌด์์ผ๋ก ๋ณด๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
21
|
+
* ๋ดํฌ์ `eventId` ๋ก๋ ํ๋จํ ์ ์๋ค. ๋ณด๋ธ ์ชฝ์ด ๋งค๋ฒ ์๋ก ๋ง๋๋ ์๋ฒ์ด๊ณ (`โฆ-energy-1` ์ฒ๋ผ ํธ์ถ๋ง๋ค
|
|
22
|
+
* 1๋ถํฐ ๋ค์ ์์ํ๋ค), ๊ฐ์ ์ฌ์ค์ ๋ ๋ฒ ๋ณด๋ด๋ฉด ๋ค๋ฅธ ๋ฒํธ๊ฐ ๋ถ๋๋ค. ๋ค๋ฅธ ์ฌ์ค์ ๊ฐ์ ๋ฒํธ๊ฐ ๋ถ๋ ์ผ๋
|
|
23
|
+
* ์๊ธด๋ค.
|
|
24
|
+
*
|
|
25
|
+
* ๊ทธ๋์ **์ฌ์ค ์์ฒด๋ก** ํ๋จํ๋ค.
|
|
26
|
+
*
|
|
27
|
+
* ๋ฌด์์ ๋ํ ๊ฒ์ธ๊ฐ ์ค๋น ยท ๊ณ๋ ์ง์ ยท ๋ฌผํ ยท ์์
ยท ์ค๋ ยท ์๋ฆฌ
|
|
28
|
+
* ์ด๋ค ์ข
๋ฅ์ธ๊ฐ ์ฌ๊ฑด ์ข
๋ฅ(eventType)
|
|
29
|
+
* ์ธ์ ์ฐ ๊ฒ์ธ๊ฐ ์ฐ๊ฒฐ๋ ์์คํ
์ด ์ค ์๊ฐ
|
|
30
|
+
*
|
|
31
|
+
* ์ด ์
์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฌ์ค์ด๋ค. ํ์๊ด ์ปค๋ฅํฐ๊ฐ `collectedAt` ์ผ๋ก ํ๋จํ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ด๊ณ , ๊ทธ๊ฒ์
|
|
32
|
+
* ์ปค๋ฅํฐ๋ง๋ค ํ์ง ์๋๋ก ์ฌ๊ธฐ๋ก ์ฌ๋ฆฐ๋ค.
|
|
33
|
+
*
|
|
34
|
+
* โโ ์ ํํ ๊ฐ์ ๊ฒ๋ง ๋ฒ๋ฆฐ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
35
|
+
* ๋ฆ๊ฒ ๋์ฐฉํ ์ ์ฌ์ค์ ๋ฒ๋ฆฌ์ง ์๋๋ค. ๊ทธ๊ฒ์ด ์๋ค๋ ๊ฒ ์์ฒด๊ฐ ์ฌ์ค์ด๊ณ , ์ํ์ ๋ฐ์๋์ง ์๋ ๊ฒ์
|
|
36
|
+
* ์ปค๋์ ์์ ํ๋จ์ด ์ด๋ฏธ ๋งก๋๋ค. ์ฌ๊ธฐ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ **์ ์ฒด๊ฐ ์์ ํ ๊ฐ์ ๊ฒ**๋ฟ์ด๋ค.
|
|
37
|
+
*/
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.FactDeduper = void 0;
|
|
40
|
+
exports.factIdentity = factIdentity;
|
|
41
|
+
/** ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก โ ์ฐ๊ฒฐ๋ ์์คํ
์ด ์ค ์๊ฐ์ด ๋จผ์ , ์์ผ๋ฉด ๋ดํฌ์ ์๊ฐ. */
|
|
42
|
+
function timeOf(envelope) {
|
|
43
|
+
for (const v of [envelope?.data?.at, envelope?.data?.eventTime, envelope?.eventTime]) {
|
|
44
|
+
const t = Date.parse(String(v ?? ''));
|
|
45
|
+
if (Number.isFinite(t))
|
|
46
|
+
return t;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ์ด ๋ดํฌ๊ฐ ๋งํ๋ ๋์ โ ์ดํ๋ง๋ค ์ด๋ฆ์ด ๋ค๋ฅด๋ฏ๋ก ์๋ ์ด๋ฆ์ ๋ชจ๋ ๋ณธ๋ค.
|
|
52
|
+
*
|
|
53
|
+
* ์์๊ฐ ๋ป์ ๊ฐ๋๋ค: ์ฃผ์ฒด๋ฅผ ๋จผ์ ๋ณธ๋ค. ์ค๋น ์ฌ์ค์ ใ์ง๊ธ ๋ถ์ด ์๋ ์์
ใ์ ํจ๊ป ์ฃ๊ณ , ์์
์ฌ์ค์
|
|
54
|
+
* ใ์์ ์ค๋ใ๋ฅผ ํจ๊ป ์ฃ๋๋ค. ์๋ฌด ์ด๋ฆ์ด๋ ๋จผ์ ๋ณด๋ฉด ์ฐธ์กฐ๋ฅผ ์ฃผ์ฒด๋ก ์ฝ๋๋ค(์น๊ฒฉ ํค์์ ๊ฒช์ ๊ฒ๊ณผ ๊ฐ๋ค).
|
|
55
|
+
*/
|
|
56
|
+
function targetOf(envelope) {
|
|
57
|
+
const d = envelope?.data ?? {};
|
|
58
|
+
const first = (...vals) => {
|
|
59
|
+
for (const v of vals) {
|
|
60
|
+
const s = String(v ?? '').trim();
|
|
61
|
+
if (s)
|
|
62
|
+
return s;
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
};
|
|
66
|
+
return first(d.meterId, d.equipmentId, d.moverId, d.taskId, d.orderId, d.personId, d.assetId, d.locationId, d.epcList?.[0], d.parentID, d.quantityList?.[0]?.epcClass, d.transformationID);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* ์ด ๋ดํฌ๊ฐ ๋งํ๋ ์ฌ์ค์ ์ ์ฒด โ ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฌ์ค์ด๋ค.
|
|
70
|
+
*
|
|
71
|
+
* ๋์์ด๋ ์๊ฐ์ ์ ์ ์์ผ๋ฉด **์ ์ฒด๋ฅผ ๋ง๋ค์ง ์๋๋ค**(`undefined`). ๊ทธ๋๋ ๊ฑฐ๋ฅด์ง ์๊ณ ํต๊ณผ์ํจ๋ค โ
|
|
72
|
+
* ๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ๋ค๊ณ ํ๋จํ๋ฉด ์๋ก ๋ค๋ฅธ ์ฌ์ค์ด ํ๋๋ก ํฉ์ณ์ง๋ค. ์๋ฆฌ์ง ์๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋ฒ ์ธ๋ ๊ฒ์ด ๋ซ๋ค.
|
|
73
|
+
*/
|
|
74
|
+
function factIdentity(envelope) {
|
|
75
|
+
const type = String(envelope?.eventType ?? '').trim();
|
|
76
|
+
if (!type)
|
|
77
|
+
return undefined;
|
|
78
|
+
const target = targetOf(envelope);
|
|
79
|
+
if (!target)
|
|
80
|
+
return undefined;
|
|
81
|
+
const at = timeOf(envelope);
|
|
82
|
+
if (at === undefined)
|
|
83
|
+
return undefined;
|
|
84
|
+
return `${type}|${target}|${at}`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* ์ต๊ทผ์ ๋ณธ ์ ์ฒด๋ฅผ ๊ธฐ์ตํ๋ค โ **ํฌ๊ธฐ์ ์ํ์ ๋๋ค.**
|
|
88
|
+
*
|
|
89
|
+
* ์ ๋ถ ๊ธฐ์ตํ ์๋ ์๋ค(ํธ์ ํ๋๊ฐ ์์ฒ๋ง ์ฌ๊ฑด์ ๊ฐ๋๋ค). ์ฐฝ์ ๋์ผ๋ฉด ์ค๋๋ ๊ฒ๋ถํฐ ์๋๋ค. ์ฐฝ ๋ฐ์
|
|
90
|
+
* ์ฌ์ ์ก์ ๋ค์ ํต๊ณผํ๋๋ฐ, ๊ทธ๊ฒ์ ์ ๋๊ฐ ์ฌ์ค์ด๋ผ ์ํ์ ํด๊ฐ ์๊ณ ์ง๋ ๊ธฐ๋ก์ ํ ์ค ๋ ๋จ๋๋ค.
|
|
91
|
+
* ์ฐฝ์ ํฌ๊ฒ ์ก์ผ๋ฉด ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ค โ ๊ทธ ๊ฐ์ ์ฌ๊ธฐ์ ์ด๋ฆ์ผ๋ก ๋ชป ๋ฐ๋๋ค.
|
|
92
|
+
*
|
|
93
|
+
* **์ฌ๊ธฐ๋์ ๊ฑด๋์ง ๋ชปํ๋ค.** ํ๋ก์ธ์ค๊ฐ ์๋ก ๋จ๋ฉด ๊ธฐ์ต์ด ๋น์ด ์์ผ๋ฏ๋ก, ์ฌ๊ธฐ๋ ์งํ ์ฒซ ์ฃผ๊ธฐ๊ฐ ๊ฐ์
|
|
94
|
+
* ๊ฐ์ ๋ค์ ๋ณด๋ด๋ฉด ๊ฑธ๋ฌ์ง์ง ์๋๋ค. ๊ทธ๊ฒ์ ๋ง์ผ๋ ค๋ฉด ์ด ๊ธฐ์ต์ด ์ ์ฅ๋ผ์ผ ํ๊ณ , ๊ทธ๊ฒ์ ๋ค์ ๊ฑธ์์ด๋ค.
|
|
95
|
+
* ์ง๊ธ์ ๊ทธ ์ฌ์ค์ ์ฌ๊ธฐ ์ ์ด ๋๋ค โ ์ ์ด ๋์ง ์์ผ๋ฉด ใ์ค๋ณต์ ์ด์ ์๋คใ๋ก ์ฝํ๋ค.
|
|
96
|
+
*/
|
|
97
|
+
class FactDeduper {
|
|
98
|
+
constructor() {
|
|
99
|
+
this.seen = new Set();
|
|
100
|
+
this.order = [];
|
|
101
|
+
}
|
|
102
|
+
/** ๊ธฐ์ตํ๋ ์ ์ฒด์ ์ โ ์ฐฝ. */
|
|
103
|
+
static { this.WINDOW = 20_000; }
|
|
104
|
+
/** ์ด ์ฌ์ค์ ๋ณธ ์ ์ด ์๋ โ ์์ผ๋ฉด ๊ธฐ์ตํ๊ณ `false`. */
|
|
105
|
+
known(identity) {
|
|
106
|
+
if (this.seen.has(identity))
|
|
107
|
+
return true;
|
|
108
|
+
this.seen.add(identity);
|
|
109
|
+
this.order.push(identity);
|
|
110
|
+
if (this.order.length > FactDeduper.WINDOW) {
|
|
111
|
+
const gone = this.order.splice(0, this.order.length - FactDeduper.WINDOW);
|
|
112
|
+
for (const g of gone)
|
|
113
|
+
this.seen.delete(g);
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* ์ฒ์ ๋ณด๋ ๊ฒ๋ง ๋๋ ค์ค๋ค โ ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ๋ฅผ ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค.
|
|
119
|
+
*
|
|
120
|
+
* ๋ฒ๋ฆฐ ์๋ฅผ ํจ๊ป ๋ด๋ ์ด์ : ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ๋ฉด ใ๋ณด๋ธ ์ใ์ ใ๋ฐ์๋ ์ใ๊ฐ ์ด๊ธ๋๋๋ฐ ์๋ฌด๋ ๊ทธ
|
|
121
|
+
* ์ด์ ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ ์๊ฐ ํฌ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ด ๋ณด๋ด๊ณ ์๋ค๋ ๋ป์ด๊ณ , ๊ทธ๊ฒ์ ๊ณ ์น ์ผ์ด๋ค.
|
|
122
|
+
*/
|
|
123
|
+
filter(envelopes) {
|
|
124
|
+
const fresh = [];
|
|
125
|
+
let duplicates = 0;
|
|
126
|
+
for (const e of envelopes) {
|
|
127
|
+
const id = factIdentity(e);
|
|
128
|
+
if (id === undefined) {
|
|
129
|
+
fresh.push(e);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (this.known(id))
|
|
133
|
+
duplicates++;
|
|
134
|
+
else
|
|
135
|
+
fresh.push(e);
|
|
136
|
+
}
|
|
137
|
+
return { fresh, duplicates };
|
|
138
|
+
}
|
|
139
|
+
/** ๊ธฐ์ตํ๊ณ ์๋ ์ ์ฒด์ ์ โ ๊ณ๊ธฐ๊ฐ ์ฝ๋๋ค. */
|
|
140
|
+
size() {
|
|
141
|
+
return this.seen.size;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.FactDeduper = FactDeduper;
|
|
145
|
+
//# sourceMappingURL=ingest-dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-dedupe.js","sourceRoot":"","sources":["../../server/engine/ingest-dedupe.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;;;AAgDH,oCAQC;AAtDD,gDAAgD;AAChD,SAAS,MAAM,CAAC,QAAa;IAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACrF,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,QAAa;IAC7B,MAAM,CAAC,GAAG,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YAChC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAA;QACjB,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IACD,OAAO,KAAK,CACV,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,WAAW,EACb,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,MAAM,EACR,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,OAAO,EACT,CAAC,CAAC,UAAU,EACZ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EACd,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAC7B,CAAC,CAAC,gBAAgB,CACnB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,QAAa;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACrD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3B,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACtC,OAAO,GAAG,IAAI,IAAI,MAAM,IAAI,EAAE,EAAE,CAAA;AAClC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAa,WAAW;IAAxB;QAIU,SAAI,GAAG,IAAI,GAAG,EAAU,CAAA;QACxB,UAAK,GAAa,EAAE,CAAA;IAuC9B,CAAC;IA3CC,sBAAsB;aACf,WAAM,GAAG,MAAM,AAAT,CAAS;IAKtB,wCAAwC;IAChC,KAAK,CAAC,QAAgB;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;YACzE,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC3C,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAI,SAAuB;QAC/B,MAAM,KAAK,GAAQ,EAAE,CAAA;QACrB,IAAI,UAAU,GAAG,CAAC,CAAA;QAClB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;YAC1B,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACb,SAAQ;YACV,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAE,UAAU,EAAE,CAAA;;gBAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAC9B,CAAC;IAED,+BAA+B;IAC/B,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;IACvB,CAAC;;AA3CH,kCA4CC","sourcesContent":["/*\n * ๊ฐ์ ์ฌ์ค์ ๋ ๋ฒ ๋ฐ์ผ๋ฉด ํ ๋ฒ๋ง ๋ฐ์ํ๋ค โ **์ ์
๊ฒฝ๊ณ ํ ๊ณณ์์.**\n *\n * โโ ์ ํ์ํ๊ฐ (2026-08-26) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ง๊ธ ์ค๋ณต์ ๋ง๋ ๊ฒ์ ์ปค๋ฅํฐ๋ง๋ค ๊ฐ์ ํ๊ณ ์๋ค. ๊ทธ๋์ ์ปค๋ฅํฐ๊ฐ ๊ทธ๊ฒ์ ์์ผ๋ฉด ํธ์์ด ๊ทธ๋๋ก ๋ ๋ฒ\n * ์ผ๋ค. ์ค์ ๋ก ๊ทธ๋ฌ๋ค: ํ์๊ด ์ปค๋ฅํฐ๊ฐ 10์ด๋ง๋ค ๋ฌผ์ผ๋ฉด์ 10๋ถ๋ง๋ค ๋ฐ๋๋ ๊ฐ์ ๋งค๋ฒ ๋ค์ ๋ณด๋๊ณ ,\n * ํ ์ฃผ๊ธฐ์ 76๊ฑด์ด ๋ํ์ด๋๋ค(์ปค๋ฅํฐ์์ ๊ณ ์ณ์ 2๊ฑด์ด ๋๋ค).\n *\n * ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์นํ
์ผ๋ก ๋ฐ์ ๋ ๋ ์์ฃผ ๋๋ค. ๋ฐ์ด ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ ์ก์ด ์ ์์ด๋ค โ ๊ทธ์ชฝ์ด ์๋ต์\n * ๋ชป ๋ฐ์ผ๋ฉด ๊ฐ์ ๊ฒ์ ๋ค์ ๋ณด๋ธ๋ค.\n *\n * โโ ๋ฌด์์ด ๋ ๋ฒ ์ธ์ด์ง๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ ๋๊ฐ์ผ๋ก ๋งํ๋ ์ฌ์ค์ ์ฌ๋ฌ ๋ฒ ๋ฐ์ํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค(์๋ ยท ์ํ ยท ์ ์ฐ ยท ์๊ฐ kW). ๊ทธ๋ฐ๋ฐ ์ธ๋\n * ๊ฐ์ ๊ทธ๋ ์ง ์๋ค.\n *\n * ๊ตฌ๊ฐ์ ํ๋ณธ ์ ยท ํ๊ท ๋ถํ(ํ๋ณธ ์๋ก ๋๋๋ค) ยท OEE ์นด์ดํฐ ยท ์ ์
๊ณ์\n * ๊ทธ๋ฆฌ๊ณ ์ง๋ ๊ธฐ๋ก์ ๊ฐ์ ์ฌ์ค์ด ๋ ์ค๋ก ๋จ๋๋ค โ ๋์ค์ ๊ทธ ๊ธฐ๋ก์ผ๋ก ๋ค์ ๊ณ์ฐํ๋ฉด ๋ ๋ ๋ฒ ์ผ๋ค\n *\n * โโ ์ ์ฒด๋ฅผ ๋ฌด์์ผ๋ก ๋ณด๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ดํฌ์ `eventId` ๋ก๋ ํ๋จํ ์ ์๋ค. ๋ณด๋ธ ์ชฝ์ด ๋งค๋ฒ ์๋ก ๋ง๋๋ ์๋ฒ์ด๊ณ (`โฆ-energy-1` ์ฒ๋ผ ํธ์ถ๋ง๋ค\n * 1๋ถํฐ ๋ค์ ์์ํ๋ค), ๊ฐ์ ์ฌ์ค์ ๋ ๋ฒ ๋ณด๋ด๋ฉด ๋ค๋ฅธ ๋ฒํธ๊ฐ ๋ถ๋๋ค. ๋ค๋ฅธ ์ฌ์ค์ ๊ฐ์ ๋ฒํธ๊ฐ ๋ถ๋ ์ผ๋\n * ์๊ธด๋ค.\n *\n * ๊ทธ๋์ **์ฌ์ค ์์ฒด๋ก** ํ๋จํ๋ค.\n *\n * ๋ฌด์์ ๋ํ ๊ฒ์ธ๊ฐ ์ค๋น ยท ๊ณ๋ ์ง์ ยท ๋ฌผํ ยท ์์
ยท ์ค๋ ยท ์๋ฆฌ\n * ์ด๋ค ์ข
๋ฅ์ธ๊ฐ ์ฌ๊ฑด ์ข
๋ฅ(eventType)\n * ์ธ์ ์ฐ ๊ฒ์ธ๊ฐ ์ฐ๊ฒฐ๋ ์์คํ
์ด ์ค ์๊ฐ\n *\n * ์ด ์
์ด ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฌ์ค์ด๋ค. ํ์๊ด ์ปค๋ฅํฐ๊ฐ `collectedAt` ์ผ๋ก ํ๋จํ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ด๊ณ , ๊ทธ๊ฒ์\n * ์ปค๋ฅํฐ๋ง๋ค ํ์ง ์๋๋ก ์ฌ๊ธฐ๋ก ์ฌ๋ฆฐ๋ค.\n *\n * โโ ์ ํํ ๊ฐ์ ๊ฒ๋ง ๋ฒ๋ฆฐ๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฆ๊ฒ ๋์ฐฉํ ์ ์ฌ์ค์ ๋ฒ๋ฆฌ์ง ์๋๋ค. ๊ทธ๊ฒ์ด ์๋ค๋ ๊ฒ ์์ฒด๊ฐ ์ฌ์ค์ด๊ณ , ์ํ์ ๋ฐ์๋์ง ์๋ ๊ฒ์\n * ์ปค๋์ ์์ ํ๋จ์ด ์ด๋ฏธ ๋งก๋๋ค. ์ฌ๊ธฐ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ **์ ์ฒด๊ฐ ์์ ํ ๊ฐ์ ๊ฒ**๋ฟ์ด๋ค.\n */\n\n/** ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก โ ์ฐ๊ฒฐ๋ ์์คํ
์ด ์ค ์๊ฐ์ด ๋จผ์ , ์์ผ๋ฉด ๋ดํฌ์ ์๊ฐ. */\nfunction timeOf(envelope: any): number | undefined {\n for (const v of [envelope?.data?.at, envelope?.data?.eventTime, envelope?.eventTime]) {\n const t = Date.parse(String(v ?? ''))\n if (Number.isFinite(t)) return t\n }\n return undefined\n}\n\n/**\n * ์ด ๋ดํฌ๊ฐ ๋งํ๋ ๋์ โ ์ดํ๋ง๋ค ์ด๋ฆ์ด ๋ค๋ฅด๋ฏ๋ก ์๋ ์ด๋ฆ์ ๋ชจ๋ ๋ณธ๋ค.\n *\n * ์์๊ฐ ๋ป์ ๊ฐ๋๋ค: ์ฃผ์ฒด๋ฅผ ๋จผ์ ๋ณธ๋ค. ์ค๋น ์ฌ์ค์ ใ์ง๊ธ ๋ถ์ด ์๋ ์์
ใ์ ํจ๊ป ์ฃ๊ณ , ์์
์ฌ์ค์\n * ใ์์ ์ค๋ใ๋ฅผ ํจ๊ป ์ฃ๋๋ค. ์๋ฌด ์ด๋ฆ์ด๋ ๋จผ์ ๋ณด๋ฉด ์ฐธ์กฐ๋ฅผ ์ฃผ์ฒด๋ก ์ฝ๋๋ค(์น๊ฒฉ ํค์์ ๊ฒช์ ๊ฒ๊ณผ ๊ฐ๋ค).\n */\nfunction targetOf(envelope: any): string | undefined {\n const d = envelope?.data ?? {}\n const first = (...vals: unknown[]) => {\n for (const v of vals) {\n const s = String(v ?? '').trim()\n if (s) return s\n }\n return undefined\n }\n return first(\n d.meterId,\n d.equipmentId,\n d.moverId,\n d.taskId,\n d.orderId,\n d.personId,\n d.assetId,\n d.locationId,\n d.epcList?.[0],\n d.parentID,\n d.quantityList?.[0]?.epcClass,\n d.transformationID\n )\n}\n\n/**\n * ์ด ๋ดํฌ๊ฐ ๋งํ๋ ์ฌ์ค์ ์ ์ฒด โ ๊ฐ์ผ๋ฉด ๊ฐ์ ์ฌ์ค์ด๋ค.\n *\n * ๋์์ด๋ ์๊ฐ์ ์ ์ ์์ผ๋ฉด **์ ์ฒด๋ฅผ ๋ง๋ค์ง ์๋๋ค**(`undefined`). ๊ทธ๋๋ ๊ฑฐ๋ฅด์ง ์๊ณ ํต๊ณผ์ํจ๋ค โ\n * ๋ชจ๋ฅด๋ ๊ฒ์ ๊ฐ๋ค๊ณ ํ๋จํ๋ฉด ์๋ก ๋ค๋ฅธ ์ฌ์ค์ด ํ๋๋ก ํฉ์ณ์ง๋ค. ์๋ฆฌ์ง ์๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋ฒ ์ธ๋ ๊ฒ์ด ๋ซ๋ค.\n */\nexport function factIdentity(envelope: any): string | undefined {\n const type = String(envelope?.eventType ?? '').trim()\n if (!type) return undefined\n const target = targetOf(envelope)\n if (!target) return undefined\n const at = timeOf(envelope)\n if (at === undefined) return undefined\n return `${type}|${target}|${at}`\n}\n\n/**\n * ์ต๊ทผ์ ๋ณธ ์ ์ฒด๋ฅผ ๊ธฐ์ตํ๋ค โ **ํฌ๊ธฐ์ ์ํ์ ๋๋ค.**\n *\n * ์ ๋ถ ๊ธฐ์ตํ ์๋ ์๋ค(ํธ์ ํ๋๊ฐ ์์ฒ๋ง ์ฌ๊ฑด์ ๊ฐ๋๋ค). ์ฐฝ์ ๋์ผ๋ฉด ์ค๋๋ ๊ฒ๋ถํฐ ์๋๋ค. ์ฐฝ ๋ฐ์\n * ์ฌ์ ์ก์ ๋ค์ ํต๊ณผํ๋๋ฐ, ๊ทธ๊ฒ์ ์ ๋๊ฐ ์ฌ์ค์ด๋ผ ์ํ์ ํด๊ฐ ์๊ณ ์ง๋ ๊ธฐ๋ก์ ํ ์ค ๋ ๋จ๋๋ค.\n * ์ฐฝ์ ํฌ๊ฒ ์ก์ผ๋ฉด ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ค โ ๊ทธ ๊ฐ์ ์ฌ๊ธฐ์ ์ด๋ฆ์ผ๋ก ๋ชป ๋ฐ๋๋ค.\n *\n * **์ฌ๊ธฐ๋์ ๊ฑด๋์ง ๋ชปํ๋ค.** ํ๋ก์ธ์ค๊ฐ ์๋ก ๋จ๋ฉด ๊ธฐ์ต์ด ๋น์ด ์์ผ๋ฏ๋ก, ์ฌ๊ธฐ๋ ์งํ ์ฒซ ์ฃผ๊ธฐ๊ฐ ๊ฐ์\n * ๊ฐ์ ๋ค์ ๋ณด๋ด๋ฉด ๊ฑธ๋ฌ์ง์ง ์๋๋ค. ๊ทธ๊ฒ์ ๋ง์ผ๋ ค๋ฉด ์ด ๊ธฐ์ต์ด ์ ์ฅ๋ผ์ผ ํ๊ณ , ๊ทธ๊ฒ์ ๋ค์ ๊ฑธ์์ด๋ค.\n * ์ง๊ธ์ ๊ทธ ์ฌ์ค์ ์ฌ๊ธฐ ์ ์ด ๋๋ค โ ์ ์ด ๋์ง ์์ผ๋ฉด ใ์ค๋ณต์ ์ด์ ์๋คใ๋ก ์ฝํ๋ค.\n */\nexport class FactDeduper {\n /** ๊ธฐ์ตํ๋ ์ ์ฒด์ ์ โ ์ฐฝ. */\n static WINDOW = 20_000\n\n private seen = new Set<string>()\n private order: string[] = []\n\n /** ์ด ์ฌ์ค์ ๋ณธ ์ ์ด ์๋ โ ์์ผ๋ฉด ๊ธฐ์ตํ๊ณ `false`. */\n private known(identity: string): boolean {\n if (this.seen.has(identity)) return true\n this.seen.add(identity)\n this.order.push(identity)\n if (this.order.length > FactDeduper.WINDOW) {\n const gone = this.order.splice(0, this.order.length - FactDeduper.WINDOW)\n for (const g of gone) this.seen.delete(g)\n }\n return false\n }\n\n /**\n * ์ฒ์ ๋ณด๋ ๊ฒ๋ง ๋๋ ค์ค๋ค โ ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ๋ฅผ ๋ฒ๋ ธ๋์ง ํจ๊ป ๋ธ๋ค.\n *\n * ๋ฒ๋ฆฐ ์๋ฅผ ํจ๊ป ๋ด๋ ์ด์ : ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ๋ฉด ใ๋ณด๋ธ ์ใ์ ใ๋ฐ์๋ ์ใ๊ฐ ์ด๊ธ๋๋๋ฐ ์๋ฌด๋ ๊ทธ\n * ์ด์ ๋ฅผ ๋ชจ๋ฅธ๋ค. ๊ทธ ์๊ฐ ํฌ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ด ๋ณด๋ด๊ณ ์๋ค๋ ๋ป์ด๊ณ , ๊ทธ๊ฒ์ ๊ณ ์น ์ผ์ด๋ค.\n */\n filter<T>(envelopes: readonly T[]): { fresh: T[]; duplicates: number } {\n const fresh: T[] = []\n let duplicates = 0\n for (const e of envelopes) {\n const id = factIdentity(e)\n if (id === undefined) {\n fresh.push(e)\n continue\n }\n if (this.known(id)) duplicates++\n else fresh.push(e)\n }\n return { fresh, duplicates }\n }\n\n /** ๊ธฐ์ตํ๊ณ ์๋ ์ ์ฒด์ ์ โ ๊ณ๊ธฐ๊ฐ ์ฝ๋๋ค. */\n size(): number {\n return this.seen.size\n }\n}\n"]}
|
|
@@ -12,7 +12,7 @@ export interface IngestWindow {
|
|
|
12
12
|
* ๋งคํ์ ํต๊ณผํ์ง๋ง **ํธ์์ ๋ฟ์ง ๋ชปํ** ์ โ ์ฒ๋ฐฉ์ ํธ์์ ์ธ์ฐ๋ ๊ฒ์ด๋ค.
|
|
13
13
|
*
|
|
14
14
|
* โโ ์ ๊ฑฐ๋ถ์ ๋ฐ๋ก ์ธ๋ (2026-08-20์ ๊ฒช์๋ค) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
15
|
-
* ํธ์์ด ๋ผ์ด๋ธ๋ก ๋์ง ์์ผ๋ฉด ์ปค๋์ด ๋ ์ฝ๋๋ฅผ
|
|
15
|
+
* ํธ์์ด ๋ผ์ด๋ธ๋ก ๋์ง ์์ผ๋ฉด ์ปค๋์ด ๋ ์ฝ๋๋ฅผ **์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฐ๋ค**. ๊ทธ๋ฐ๋ฐ ์ฅ๋ถ๋ ๊ทธ๊ฒ์ ใํต๊ณผใ๋ก ์
๋ค.
|
|
16
16
|
* ํ๋ฉด์ด ใ150 ๋ค์ด์ด ยท 150 ํต๊ณผ ยท 100%ใ๋ผ๊ณ ๋งํ๋ ๋์ 150๊ฑด์ ๋ฐ๋ฅ์ ๋ฒ๋ ค์ง๊ณ ์์๋ค. ์ด ๊ธฐ๋ฅ์ด
|
|
17
17
|
* ๋ง์ผ๋ ค๋ ๋ฐ๋ก ๊ทธ๊ฒ์ ์ด ๊ธฐ๋ฅ์ด ์ ์ง๋ฅธ ์
์ด๋ค.
|
|
18
18
|
*
|
|
@@ -72,6 +72,26 @@ export interface IngestLedger {
|
|
|
72
72
|
*/
|
|
73
73
|
lastUndeliveredAtMs: number;
|
|
74
74
|
/** ์ฌ์ ๋ณ ๋์ ๊ฑด์์ **๋ง์ง๋ง์ผ๋ก ๊ทธ ์ฌ์ ๊ฐ ๋ ์๊ฐ** โ ๊ณ ์น ์ฌ์ ๋ ์๊ฐ์ด ๋ฉ์ถ๋ค. */
|
|
75
|
+
/**
|
|
76
|
+
* **์ด๋ค ๊ธธ๋ก ๋ค์ด์๋** โ ๊ฒฝ๋ก๋ง๋ค ๊ฑด์์ ๋ง์ง๋ง ์๊ฐ.
|
|
77
|
+
*
|
|
78
|
+
* โโ ์ ํ์ํ๊ฐ (2026-08-26) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
79
|
+
* ํธ์์ด ๊ฐ์ ๋ฐ๊ณ ์๋ค๋ ๊ฒ์ ๊ณ๊ธฐ๊ฐ ๋งํด ์ฃผ๋๋ฐ, **๋ฌด์์ ํตํด ๋ฐ๋์ง๋ ์๋ฌด๋ ๋งํ์ง ์์๋ค.**
|
|
80
|
+
* ์ปค๋ฅํฐ๊ฐ ๋ฌผ์ด์ ๋ฐ๋์ง, ์ฐ๊ฒฐ๋ ์์คํ
์ด ๋ฐ์ด ์ฃผ๋์ง, ์๋๋ฆฌ์ค๊ฐ ๋ฃ๋์ง, ๋ถํ ๋๊ตฌ๊ฐ ๋ฃ๋์ง โ
|
|
81
|
+
* ํ๋ฉด์์ ๊ตฌ๋ณํ ์ ์์๋ค. ๊ทธ ๊ตฌ๋ณ์ด ์์ผ๋ฉด ใํด๋ง์ ์นํ
์ผ๋ก ๋ฐ๊ฟจ๋คใ๋ฅผ ํ์ธํ ๋ฐฉ๋ฒ๋ ์๋ค.
|
|
82
|
+
*/
|
|
83
|
+
bySource: Record<string, {
|
|
84
|
+
count: number;
|
|
85
|
+
lastAtMs: number;
|
|
86
|
+
}>;
|
|
87
|
+
/**
|
|
88
|
+
* **๊ฐ์ ์ฌ์ค์ด ๋ ๋ฒ ์์ ๋ฒ๋ฆฐ ์** โ ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค.
|
|
89
|
+
*
|
|
90
|
+
* ์ด ์๊ฐ ํฌ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ด ๋ณด๋ด๊ณ ์๋ค๋ ๋ป์ด๊ณ , ๊ทธ๊ฒ์ ๊ณ ์น ์ผ์ด๋ค(ํ์๊ด ์ปค๋ฅํฐ๊ฐ ํ ์ฃผ๊ธฐ์
|
|
91
|
+
* 76๊ฑด์ ๋ํ์ด ๋ณด๋ด๋ ๊ฒ์ ์ด ์๋ก ๋ณผ ์ ์์์ด์ผ ํ๋ค).
|
|
92
|
+
*/
|
|
93
|
+
duplicates: number;
|
|
94
|
+
lastDuplicateAtMs: number;
|
|
75
95
|
byReason: Record<string, {
|
|
76
96
|
count: number;
|
|
77
97
|
lastAtMs: number;
|
|
@@ -79,8 +99,8 @@ export interface IngestLedger {
|
|
|
79
99
|
/**
|
|
80
100
|
* ์ฌ์ ์ข
๋ฅ๊ฐ ์ํ์ ๋ฟ์๋.
|
|
81
101
|
*
|
|
82
|
-
*
|
|
83
|
-
* ๋ฐ๋ก ์ด ์ํ์ผ๋ก ๋ง์ผ๋ ค๋ ๋ฌดํํ ์งํฉ์ด๋ค.
|
|
102
|
+
* **๋ชจ์ ์ข
๋ฅ ์๋ ์ธ์ง ์๋๋ค** โ ๊ทธ๊ฒ์ ์ธ๋ ค๋ฉด ์ด๋ฏธ ๋ณธ ์ฌ์ ๋ฅผ ๋ชจ๋ ๊ธฐ์ตํด์ผ ํ๊ณ , ๊ทธ ์งํฉ์ด
|
|
103
|
+
* ๋ฐ๋ก ์ด ์ํ์ผ๋ก ๋ง์ผ๋ ค๋ ๋ฌดํํ ์งํฉ์ด๋ค. ๋ชจ์ **๊ฑด์**๋ `byReason[OTHER_REASON].count` ๊ฐ ๋ตํ๋ค.
|
|
84
104
|
*/
|
|
85
105
|
reasonsCapped: boolean;
|
|
86
106
|
/** ํ๋ณธ์ ์ด๋ฏธ ๋ฌ ์ฌ์ ๋ค โ ๊ฐ์ ์ฌ์ ๋ฅผ ๋ค์ ์ง๋ ฌํํ์ง ์๊ธฐ ์ํ ์์ธ(O(1) ์กฐํ). */
|
|
@@ -94,12 +114,12 @@ export interface IngestLedger {
|
|
|
94
114
|
/**
|
|
95
115
|
* **์๋ณธ์ ๋ฟ์ง ๋ชปํ ์ฌ์ค** (2026-08-23) โ ใ๋ฐ์ ๊ฒ์ด ์๋คใ์ **๋ค๋ฅธ ์ฌ์ค**์ด๋ค.
|
|
96
116
|
*
|
|
97
|
-
* โโ ๋ฌด์์ด
|
|
117
|
+
* โโ ๋ฌด์์ด ์๋ฌด ์ ํธ๋ ๋ด์ง ์์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
98
118
|
* ์ค ์๋ณธ์ด ๋๊ฒผ์ ๋(์ ์ ์๊ฐ ์ด๊ณผ) ํธ์์ **์กฐํ ๊ฐ๋ฅํ ์ํ ์ด๋์๋** ๊ทธ ์ฌ์ค์ด ์์๋ค.
|
|
99
119
|
* `recordIngest` ๋ `onRecords` ๊ฐ ๋ถ๋ฆด ๋๋ง ๋๋ฌํ๊ณ , ์ฝ๊ธฐ๊ฐ ์คํจํ๋ฉด ๊ทธ ๋ฌธ์ ์ค์ง ์๋๋ค.
|
|
100
120
|
* `TwinReference.lastError` ๋ ๋ง์คํฐ ๋๊ธฐยท์ ์ ์ํ์๋ง ์ ํ๋ค.
|
|
101
121
|
*
|
|
102
|
-
* ๊ทธ๋์ ํ๋ฉด์ด ๋ณผ ์ ์๋ ๊ฒ์ ใ์ ์ฌ์ค์ด ์๋คใ๋ฟ์ด์๊ณ , ๊ทธ๊ฒ์
|
|
122
|
+
* ๊ทธ๋์ ํ๋ฉด์ด ๋ณผ ์ ์๋ ๊ฒ์ ใ์ ์ฌ์ค์ด ์๋คใ๋ฟ์ด์๊ณ , ๊ทธ๊ฒ์ **ใ์ฐ๊ฒฐ๋ ์์คํ
์์ ๋ค์ด์จ ๊ฒ์ด ์๋คใ์ ๊ตฌ๋ณ๋์ง
|
|
103
123
|
* ์๋๋ค.** ์ค์ฆ ๋ฐ๋ชจ ์ค์ ์๋ณธ์ด ๋๊ธฐ๋ฉด ์ฌ์ฉ์๊ฐ ์์ธ์ ์ฐพ์ ์ ์๋ค.
|
|
104
124
|
*
|
|
105
125
|
* โโ ์ ใ๋ช ๋ฒใ๊ณผ ใ์ธ์ ๋ถํฐใ๋ฅผ ํจ๊ป ๋๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
@@ -108,6 +128,17 @@ export interface IngestLedger {
|
|
|
108
128
|
*
|
|
109
129
|
* ์ฑ๊ณตํ๋ฉด ์ง์ด๋ค โ ๊ณ ์ณ์ง ๋จ์ ์ด ํ๋ฉด์ ๋จ์ ์์ผ๋ฉด ๊ทธ๊ฒ๋ ๊ฑฐ์ง์ด๋ค.
|
|
110
130
|
*/
|
|
131
|
+
/**
|
|
132
|
+
* ๋ง์ง๋ง์ผ๋ก ๋๊ฒผ๋ค๊ฐ ๋์์จ ๊ฒ โ ์์ผ๋ฉด ๋๊ธด ์ ์ด ์๊ฑฐ๋ ์์ง ๋์์ค์ง ์์ ๊ฒ์ด๋ค.
|
|
133
|
+
*
|
|
134
|
+
* ์คํจ ๊ธฐ๋ก(`readFailure`)์ ๋์์ค๋ฉด ์ง์์ง๋ค. ๊ทธ๊ฒ๋ง ์ง์ฐ๋ฉด ใ๋๊ธด ์ ์ด ์์๋คใ๊ฐ ํ๋ฉด์์
|
|
135
|
+
* ์ฌ๋ผ์ง๋ฏ๋ก, ๋์์จ ์ฌ์ค์ ๋ฐ๋ก ๋จ๊ธด๋ค.
|
|
136
|
+
*/
|
|
137
|
+
lastRecovery?: {
|
|
138
|
+
atMs: number;
|
|
139
|
+
afterFailures: number;
|
|
140
|
+
downMs: number;
|
|
141
|
+
};
|
|
111
142
|
readFailure?: {
|
|
112
143
|
/** ์ฐ์ ์คํจ ์ โ ์ฑ๊ณต ํ ๋ฒ์ 0 ์ผ๋ก ๋์๊ฐ๋ค. */
|
|
113
144
|
consecutive: number;
|
|
@@ -119,6 +150,8 @@ export interface IngestLedger {
|
|
|
119
150
|
reason: string;
|
|
120
151
|
/** ์ด๋ ํ๋ฆ์์ ๋ฌ๋(์ด๋ํฐ๊ฐ ๋งํด ์ฃผ๋ฉด). ์๋ณธ๋ง๋ค ํ๋ฆ์ด ๋ค๋ฅด๋ฏ๋ก ์ด๋ ค ์๋ค. */
|
|
121
152
|
stream?: string;
|
|
153
|
+
/** ๋ค์์ ๋ค์ ๋ฌผ์ ๋๊น์ง ๋จ์ ์๊ฐ(ms) โ ์ปค๋ฅํฐ๊ฐ ๋ฌผ๋ฌ์ฐ์ ๋๋ง ์๋ค. */
|
|
154
|
+
nextRetryMs?: number;
|
|
122
155
|
};
|
|
123
156
|
/**
|
|
124
157
|
* **์ฝ์๋๋ฐ ์ฐฝ์ ๋๊ธธ ์ ์๋ค** (2026-08-24) โ ์์ **๋ค๋ฅธ ์ฌ์ค**์ด๋ค.
|
|
@@ -152,7 +185,7 @@ export interface IngestLedger {
|
|
|
152
185
|
* `unhandled` ๋ฆฌ๋์๊ฐ **๋ฐ์๋๋ฐ** ๋ด์ ์๋ฆฌ๋ฅผ ๋ชฐ๋๋ค
|
|
153
186
|
* ์ฌ๊ธฐ ์ปค๋ฅํฐ๊ฐ **๋ณด์ง๋ง ์ผ๋ถ๋ฌ ๋ณด๋ด์ง ์์๋ค** โ ์ด์ ์ ํจ๊ป
|
|
154
187
|
*
|
|
155
|
-
* ๋ ๋ค ใ์ฌ์ค์ด
|
|
188
|
+
* ๋ ๋ค ใ์ฌ์ค์ด ์ค๋ฅ ์์ด ์ฌ๋ผ์ง์ง ์๊ฒใ ์ธ๋ ๊ฒ์ด๊ณ , ์ด์ ๊ฐ ๋ค๋ฅด๋ฏ๋ก ์๋ฆฌ๋ ๋ค๋ฅด๋ค.
|
|
156
189
|
*
|
|
157
190
|
* ์ด์ ๋ฅผ **๋ฌธ์์ด๋ก ๋ฐ๋๋ค**: ๋ฌด์์ ์ ์ ๋ฐ๋์ง๋ ์๋ณธ๋ง๋ค ๋ค๋ฅด๊ณ , ๊ณ์ฝ์ด ๊ทธ ๋ชฉ๋ก์ ๋ซ์ผ๋ฉด ์ ์๋ณธ์
|
|
158
191
|
* ๋ถ์ผ ๋๋ง๋ค ๊ณ์ฝ์ ๊ณ ์น๊ฒ ๋๋ค(ํ๋ฆ ์ด์ ์ ๊ฐ์ ๊ท์จ).
|
|
@@ -181,12 +214,30 @@ export interface IngestLedger {
|
|
|
181
214
|
* ์ฐ์ ์คํจ์ ์์ ์๊ฐ์ ์งํค๋ ๊ฒ์ด ์ด ํจ์์ ์์ ์ด๋ค: ๋งค๋ฒ ์๋ก ์ ์ผ๋ฉด ใ20๋ถ์งธ ๋ชป ์ฝ๋๋คใ๋ฅผ
|
|
182
215
|
* ๋งํ ์ ์๊ณ , ํ๋ฉด์ ๋ ใ๋ฐฉ๊ธ ์คํจํ๋คใ๋ง ๋ณด๊ฒ ๋๋ค.
|
|
183
216
|
*/
|
|
184
|
-
export declare function recordReadFailure(ledger: IngestLedger, reason: string, nowMs: number, stream?: string
|
|
217
|
+
export declare function recordReadFailure(ledger: IngestLedger, reason: string, nowMs: number, stream?: string,
|
|
218
|
+
/**
|
|
219
|
+
* ๋ค์์ ๋ค์ ๋ฌผ์ ๋๊น์ง ๋จ์ ์๊ฐ(ms) โ ์ปค๋ฅํฐ๊ฐ ๋ฌผ๋ฌ์ฐ์ผ๋ฉด ๊ทธ ๊ฐ์ ์ค๋ค (2026-08-27).
|
|
220
|
+
*
|
|
221
|
+
* ์ด๊ฒ์ด ์์ผ๋ฉด ํ๋ฉด์ด ใ๋ฟ์ง ๋ชปํ๊ณ ์๋คใ๊น์ง๋ง ๋งํ๊ณ , ์ฌ๋์ **์ธ์ ๋ค์ ์๋ํ๋์ง** ์ ์
|
|
222
|
+
* ์๋ค. ๊ทธ๋ฌ๋ฉด ๊ธฐ๋ค๋ ค์ผ ํ๋์ง ์์ ์จ์ผ ํ๋์ง ํ๋จํ์ง ๋ชปํ๋ค.
|
|
223
|
+
*
|
|
224
|
+
* **์ฐ๋ฌ์ ํ์์ ์์ ์๊ฐ์ ์ปค๋ฅํฐ๊ฐ ๋ณด๋ด์ง ์๋๋ค** โ ์ด ํจ์๊ฐ ์ด๋ฏธ ์ผ๋ค. ๋ ๊ณณ์์ ์ธ๋ฉด
|
|
225
|
+
* ๊ฐ๋ผ์ง๊ณ , ๊ฐ๋ผ์ง๋ฉด ์ด๋ ์ชฝ์ด ์ฌ์ค์ธ์ง ์ ์ ์๋ค.
|
|
226
|
+
*/
|
|
227
|
+
nextRetryMs?: number): void;
|
|
228
|
+
/**
|
|
229
|
+
* **๋๊ฒผ๋ค๊ฐ ๋์์๋ค** โ ๊ทธ ์ฌ์ค์ ๋จ๊ธด๋ค (2026-08-27).
|
|
230
|
+
*
|
|
231
|
+
* ์คํจ ๊ธฐ๋ก๋ง ์ง์ฐ๋ฉด ใ๋๊ธด ์ ์ด ์์๋คใ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐค์ ๋ ์๊ฐ ๋๊ฒผ๋ ์ฐ๊ฒฐ๊ณผ ํ
|
|
232
|
+
* ๋ฒ๋ ๋๊ธฐ์ง ์์ ์ฐ๊ฒฐ์ด ์์นจ์ ๋๊ฐ์ด ๋ณด์ธ๋ค. ๋ช ๋ฒ ์คํจํ ๋ค์ ๋์์๋์ง, ์ผ๋ง๋ ๋๊ฒผ๋์ง๋ฅผ ํจ๊ป
|
|
233
|
+
* ๋จ๊ธด๋ค.
|
|
234
|
+
*/
|
|
235
|
+
export declare function recordRecovered(ledger: IngestLedger, afterFailures: number, downMs: number, nowMs: number): void;
|
|
185
236
|
/**
|
|
186
237
|
* ์ฝ๊ธฐ๊ฐ ์ฑ๊ณตํ๋ค โ ๋จ์ ๊ธฐ๋ก์ ์ง์ด๋ค.
|
|
187
238
|
*
|
|
188
239
|
* **๋น ์ฝ๊ธฐ๋ ์ฑ๊ณต์ด๋ค**: ์๋ณธ์ด ใ์ ๊ฒ์ด ์๋คใ๊ณ ๋ตํ ๊ฒ์ ๋ฟ์๋ค๋ ๋ป์ด๋ค. ๊ทธ ๋์ ๊ฐ๊ฒ ๋๋ฉด
|
|
189
|
-
*
|
|
240
|
+
* ๋ค์ด์จ ๊ฒ์ด ์๋ ์ฐ๊ฒฐ์ด ๋๊ธด ์๋ณธ์ผ๋ก ๋ณด์ธ๋ค(๊ณ ์น๋ ค๋ ๊ฒ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ํ๋ฆฐ๋ค).
|
|
190
241
|
*/
|
|
191
242
|
export declare function clearReadFailure(ledger: IngestLedger): void;
|
|
192
243
|
/**
|
|
@@ -206,6 +257,15 @@ export declare function recordCursorStall(ledger: IngestLedger, reason: string,
|
|
|
206
257
|
* ์ด์ ๊ฐ ๊ฐ๊ณ ์๊ฐ ๋ฌ๋ผ์ง๋ฉด **๋ง์ง๋ง ์๋ก ๋ฎ๋๋ค**: ์ด๊ฒ์ ๋์ ์ฌ๊ฑด์ด ์๋๋ผ **์ง๊ธ ์ธ์ฐ์ง ์์ ๊ฒ์
|
|
207
258
|
* ์**๋ค. ์ฃผ๊ธฐ๋ง๋ค 8๊ฑด์ด๋ฉด 8์ด๊ณ , ๋ํด์ 800์ด ๋๋ฉด ๊ฑฐ์ง์ด๋ค.
|
|
208
259
|
*/
|
|
260
|
+
/**
|
|
261
|
+
* ์ด๋ค ๊ธธ๋ก ๋ช ๊ฑด์ด ๋ค์ด์๋ โ ๊ฒฝ๋ก ์ด๋ฆ์ ๋ถ๋ฅด๋ ์ชฝ์ด ์ ํ๋ค.
|
|
262
|
+
*
|
|
263
|
+
* ์ด๋ฆ์ ์์ ๋ฌธ์์ด๋ก ๋๋ ์ด์ : ๊ธธ์ด ๋์ด๋๋ค(์ง๊ธ์ ๋ฌผ์ด๋ณด๊ธฐยท์๋๋ฆฌ์คยท๋ถํ ๋๊ตฌ, ๋ค์์ ์นํ
).
|
|
264
|
+
* ์ด๊ฑฐ๋ก ๋ชป ๋ฐ์ผ๋ฉด ์ ๊ธธ์ด ์๊ธธ ๋ ์ด ํ์ผ์ ํจ๊ป ๊ณ ์ณ์ผ ํ๊ณ , ์์ผ๋ฉด ๊ทธ ๊ธธ์ด ํต๊ณ์์ ์ฌ๋ผ์ง๋ค.
|
|
265
|
+
*/
|
|
266
|
+
export declare function recordIngestSource(ledger: IngestLedger, source: string, count: number, nowMs: number): void;
|
|
267
|
+
/** ๊ฐ์ ์ฌ์ค์ด ๋ ๋ฒ ์์ ๋ฒ๋ฆฐ ์ โ ์๋ฆฌ์ง ์๊ณ ๋ฒ๋ฆฌ์ง ์๋๋ค. */
|
|
268
|
+
export declare function recordDuplicates(ledger: IngestLedger, count: number, nowMs: number): void;
|
|
209
269
|
export declare function recordWithheld(ledger: IngestLedger, reason: string, count: number, nowMs: number): void;
|
|
210
270
|
/** ์ฐฝ์ ๋๊ฒผ์ผ๋ฉด ์ง์ด๋ค โ ํ๋ฆฐ ์ ์ฒด๊ฐ ํ๋ฉด์ ๋จ์ ์์ผ๋ฉด ๊ทธ๊ฒ๋ ๊ฑฐ์ง์ด๋ค. */
|
|
211
271
|
export declare function clearCursorStall(ledger: IngestLedger): void;
|
|
@@ -227,7 +287,7 @@ export declare const TREND_LIMIT = 36;
|
|
|
227
287
|
* (`unknown bizStep "PUTAWAY_X17"`, `โฆX18`, โฆ) ํค๊ฐ ๋ฌดํํ ๋์ด๋๋ค. ์ด๋น 1๋ง ๊ฑด ๊ท๋ชจ์์ ์ด๊ฒ์
|
|
228
288
|
* ๋ฏธ๋ฏธํ ์ค๋ฒํค๋๊ฐ ์๋๋ผ ๋์๋ค.
|
|
229
289
|
*
|
|
230
|
-
* ๋์น๋ฉด `OTHER_REASON` ํ ์นธ์ ๋ชจ์ผ๊ณ **๋ช ์ข
์
|
|
290
|
+
* ๋์น๋ฉด `OTHER_REASON` ํ ์นธ์ ๋ชจ์ผ๊ณ **๋ช ์ข
์ ๋ชจ์๋์ง ํจ๊ป ๋ธ๋ค**(์๋ฆฌ์ง ์๊ณ ์๋ฅด์ง ์๋๋ค).
|
|
231
291
|
* 30์ข
์ด๋ฉด ๊ณ ์น ๊ณณ์ ์ฐพ๊ธฐ์ ์ถฉ๋ถํ๋ค โ ๋ชฉ๋ก์ ํ๋ ์ผ์ด ์๋๋ผ ๋งคํ ๋ช ์ค์ ๊ณ ์น๋ ์ผ์ด๋ค.
|
|
232
292
|
*/
|
|
233
293
|
export declare const REASON_LIMIT = 30;
|
|
@@ -326,6 +386,13 @@ export declare function syncVerdictOf(args: {
|
|
|
326
386
|
nowMs?: number;
|
|
327
387
|
/** ๋ง์ง๋ง์ผ๋ก **๋ฒ๋ ค์ง** ์๊ฐ. ํ ๋ฒ๋ ์์ผ๋ฉด `-1`. */
|
|
328
388
|
lastUndeliveredAtMs?: number;
|
|
389
|
+
/**
|
|
390
|
+
* ์ง๊ธ๊น์ง ์ ์๋ ๋์ ์ โ **ใ๋ฐ๊ณ ์๋ ์คใ๊ณผ ใ์ค๋ ๊ฒ์ด ์๋คใ๋ฅผ ๊ฐ๋ฅด๋ ์ฌ์ค**์ด๋ค.
|
|
391
|
+
*
|
|
392
|
+
* ๋ฟ์ ์๊ฐ(`lastAtMs`)์ผ๋ก๋ ๊ฐ๋ฅผ ์ ์๋ค: ๋น ์ฝ๊ธฐ๋ ๋ฟ์ ๊ฒ์ด๋ฏ๋ก ๊ทธ ์๊ฐ์ด ์ ๋ค. ์ฐฝ์ด ์์ง ๋ซํ์ง
|
|
393
|
+
* ์์์ ๋ ์ด ์๊ฐ 0 ์ด๋ฉด ์ค๋ ๊ฒ์ด ์๋ ๊ฒ์ด๊ณ , 0 ์ด ์๋๋ฉด ๋ฐ๊ณ ์๋ ์ค์ด๋ค.
|
|
394
|
+
*/
|
|
395
|
+
offeredTotal?: number;
|
|
329
396
|
threshold?: number;
|
|
330
397
|
}): SyncVerdict;
|
|
331
398
|
export interface IngestWindowView {
|
|
@@ -385,7 +452,7 @@ export interface IngestHealthView {
|
|
|
385
452
|
*
|
|
386
453
|
* ์ปค์ ์ ์ฒด(`cursorStall`)์ **์์ด์ง ์๋๋ค**: ์ด์ชฝ์ ๊ธฐ๋ค๋ฆฌ๋ฉด ํ๋ฆฌ๊ณ ๊ทธ์ชฝ์ ๊ธฐ๋ค๋ ค๋ ์ ํ๋ฆฐ๋ค.
|
|
387
454
|
*
|
|
388
|
-
* ใ์ ์
์์ใ๊ณผ **๋ค๋ฅธ ํ์ **์ด๋ค: ์ ์
์์์
|
|
455
|
+
* ใ์ ์
์์ใ๊ณผ **๋ค๋ฅธ ํ์ **์ด๋ค: ์ ์
์์์ ์ฐ๊ฒฐ๋ ์์คํ
์์ ๋ค์ด์จ ๊ฒ์ด ์๋ ๊ฒ์ผ ์ ์๊ณ , ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ฌป์ง๋
|
|
389
456
|
* ๋ชปํ ๊ฒ์ด๋ค. ํ๋ฉด์ ๋ ๋ฌธ์ฅ์ ๋ค๋ฅด๊ฒ ๋งํด์ผ ํ๋ค โ ์ค ์๋ณธ์ด ๋๊ฒผ์ ๋ ์ฌ์ฉ์๊ฐ ์์ธ์ ์ฐพ์ ์
|
|
390
457
|
* ์๋์ง๊ฐ ๊ทธ ์ฐจ์ด๋ค.
|
|
391
458
|
*/
|
|
@@ -396,6 +463,19 @@ export interface IngestHealthView {
|
|
|
396
463
|
lastAt: string;
|
|
397
464
|
reason: string;
|
|
398
465
|
stream?: string;
|
|
466
|
+
/** ๋ค์์ ๋ค์ ๋ฌผ์ ๋๊น์ง ๋จ์ ์๊ฐ(ms) โ ์ปค๋ฅํฐ๊ฐ ๋ฌผ๋ฌ์ฐ์ ๋๋ง ์๋ค. */
|
|
467
|
+
nextRetryMs?: number;
|
|
468
|
+
};
|
|
469
|
+
/**
|
|
470
|
+
* ๋ง์ง๋ง์ผ๋ก ๋๊ฒผ๋ค๊ฐ ๋์์จ ๊ฒ โ ์์ผ๋ฉด ๋๊ธด ์ ์ด ์๊ฑฐ๋ ์์ง ๋์์ค์ง ์์ ๊ฒ์ด๋ค (2026-08-27).
|
|
471
|
+
*
|
|
472
|
+
* `readFailure` ๋ ๋์์ค๋ฉด ์ฌ๋ผ์ง๋ค. ์ด ์นธ์ด ์์ผ๋ฉด ๋ฐค์ ๋๊ฒผ๋ ์ฐ๊ฒฐ๊ณผ ํ ๋ฒ๋ ๋๊ธฐ์ง ์์ ์ฐ๊ฒฐ์ด
|
|
473
|
+
* ์์นจ์ ๋๊ฐ์ด ๋ณด์ธ๋ค.
|
|
474
|
+
*/
|
|
475
|
+
lastRecovery?: {
|
|
476
|
+
at: string;
|
|
477
|
+
afterFailures: number;
|
|
478
|
+
downMs: number;
|
|
399
479
|
};
|
|
400
480
|
}
|
|
401
481
|
/**
|