47 lines
1.6 KiB
JavaScript
47 lines
1.6 KiB
JavaScript
const VOLATILE_SNAPSHOT_FIELDS = new Set([
|
|
'requestHash', 'version', 'updatedAt', 'operatorId', 'operatorName', 'occurredAt',
|
|
])
|
|
|
|
function stableValue(value) {
|
|
if (Array.isArray(value)) return value.map(stableValue)
|
|
if (!value || typeof value !== 'object') return value
|
|
return Object.fromEntries(Object.entries(value)
|
|
.filter(([key]) => !VOLATILE_SNAPSHOT_FIELDS.has(key))
|
|
.sort(([left], [right]) => left.localeCompare(right))
|
|
.map(([key, nested]) => [key, stableValue(nested)]))
|
|
}
|
|
|
|
function snapshot(value) {
|
|
if (value == null || value === '') return null
|
|
try { return stableValue(typeof value === 'string' ? JSON.parse(value) : value) } catch { return value }
|
|
}
|
|
|
|
function sameSnapshot(left, right) {
|
|
return JSON.stringify(snapshot(left)) === JSON.stringify(snapshot(right))
|
|
}
|
|
|
|
export function isPureStatusNoop(history) {
|
|
if (history?.actionType !== 'STATUS_UPDATE') return false
|
|
if ((history?.fromStatus ?? null) !== (history?.toStatus ?? null)) return false
|
|
return sameSnapshot(history?.beforeSnapshot, history?.afterSnapshot)
|
|
}
|
|
|
|
function stableEventKey(history) {
|
|
if (history?.operationId) return `operation:${history.operationId}`
|
|
if (history?.eventId) return `event:${history.eventId}`
|
|
if (history?.historyId) return `history:${history.historyId}`
|
|
return null
|
|
}
|
|
|
|
export function visibleLoadingHistories(histories) {
|
|
const seen = new Set()
|
|
return (Array.isArray(histories) ? histories : []).filter((history) => {
|
|
if (isPureStatusNoop(history)) return false
|
|
const key = stableEventKey(history)
|
|
if (!key) return true
|
|
if (seen.has(key)) return false
|
|
seen.add(key)
|
|
return true
|
|
})
|
|
}
|