Based on @ImanHosseiniPour answer I came up with the following:
TIMESTAMP + UUID = ULID
import { Ulid, Uuid4 } from "id128";
import { factory, decodeTime } from 'ulid'
const genUlid = factory();
function convertUuidToUlid(
timestamp: Date,
canonicalUuid: string,
): Ulid {
const uuid = Uuid4.fromCanonical(canonicalUuid);
const convertedUlid = Ulid.fromRaw(uuid.toRaw())
const ulidTimestamp = genUlid(timestamp.valueOf()).slice(0, 10)
const ulidRandom = convertedUlid.toCanonical().slice(10);
return Ulid.fromCanonical(ulidTimestamp + ulidRandom)
}
const timestamp = new Date()
const uuid = 'f0df59ea-bfe2-43a8-98d4-8213348daeb6'
const ulid = convertUuidToUlid(timestamp, uuid)
const originalUuid = Uuid4.fromRaw(ulid.toRaw());
console.table({
timestamp: timestamp.valueOf(),
uuid,
ulid: ulid.toCanonical(),
decodedTime: decodeTime(ulid.toCanonical()),
originalUuid: originalUuid.toCanonical(),
});
Keep in mind that reverse engineering the ULID into a UUID will make the two first chunks different from the original since we incorporated the timestamp