package link.roadio.riff.userstate.android import android.app.Application import android.os.Process import link.roadio.riff.userstate.ContentIds import link.roadio.riff.userstate.contentHex import java.util.concurrent.atomic.AtomicLong /** Runtime provenance is meaningful control identity, never a persisted user clock. */ object RuntimeIds { private val ordinal = AtomicLong() private val incarnation by lazy { ContentIds().id("process-incarnation") { text(Application.getProcessName()) int(Process.myPid()) long(Process.getStartElapsedRealtime()) } } fun epoch(domain: String): String = ContentIds().id(domain) { long(incarnation) }.contentHex() fun reference( domain: String, fields: List, ): String = ContentIds() .id(domain) { long(incarnation) long(ordinal.updateAndGet { Math.addExact(it, 1L) }) int(fields.size) fields.forEach(::text) }.contentHex() }