Identity (TypeID)
How Dispatch uses type-safe, prefix-qualified identifiers for every entity.
Every entity in Dispatch has a TypeID. TypeIDs are globally unique, K-sortable, URL-safe identifiers built on UUIDv7 with a human-readable prefix that tells you what kind of entity you're looking at.
A TypeID looks like this:
job_01h2xcejqtf2nbrexx3vqjhp41
wfrun_01h455vb4pex5vsknk084sn02qThe prefix identifies the entity type. The suffix is a base32-encoded UUIDv7 that encodes creation time, so IDs sort chronologically.
Compile-time safety
Dispatch uses separate typed aliases for each entity. Passing a CronID where a JobID is expected is a compile error:
var cronID id.CronID = id.NewCronID()
var jobID id.JobID = cronID // compile error: cannot use CronID as JobIDThe id package
The id package wraps go.jetify.com/typeid with typed aliases for each entity.
Creating IDs
import "github.com/xraph/dispatch/id"
jobID := id.NewJobID() // job_01h455vb...
runID := id.NewRunID() // wfrun_01h455vb...
cronID := id.NewCronID() // cron_01h455vb...
dlqID := id.NewDLQID() // dlq_01h455vb...Parsing IDs
jobID, err := id.ParseJobID("job_01h455vb4pex5vsknk084sn02q")
runID, err := id.ParseRunID("wfrun_01h455vb4pex5vsknk084sn02q")
cronID, err := id.ParseCronID("cron_01h455vb4pex5vsknk084sn02q")
// Accept any valid prefix (when type is dynamic):
anyID, err := id.ParseAny("wkr_01h455vb4pex5vsknk084sn02q")Parsing rejects IDs with the wrong prefix:
_, err := id.ParseJobID("cron_01h455...")
// err: prefix mismatchPrefix reference
| Type | Prefix | Example |
|---|---|---|
id.JobID | job | job_01h2xcejqtf2nbrexx3vqjhp41 |
id.WorkflowID | wf | wf_01h455vb4pex5vsknk084sn02q |
id.RunID | wfrun | wfrun_01h455vb4pex5vsknk084sn02q |
id.CheckpointID | ckpt | ckpt_01h455vb4pex5vsknk084sn02q |
id.CronID | cron | cron_01h455vb4pex5vsknk084sn02q |
id.DLQID | dlq | dlq_01h455vb4pex5vsknk084sn02q |
id.EventID | evt | evt_01h455vb4pex5vsknk084sn02q |
id.WorkerID | wkr | wkr_01h455vb4pex5vsknk084sn02q |