nips/34asc.md
2023-06-27 11:15:05 -03:00

1.6 KiB

NIP-34asc

Ascending

draft optional author:arthurfranca

Events with older created_at are retrieved first.

Implementation

Relay computes nip34asc field once upon receiving the event.

The lower the created_at, the higher nip34asc will be.

Javascript

// Use this same value even if your programming language allows a higher one
const maxDateNowSeconds = 8640000000000 // 8.64e15 ms / 1000
// Equals 17280000000000. It is ok because it is lower than Number.MAX_SAFE_INTEGER
// We multiply by 2 because of "ts = seconds + maxDateNowSeconds" below
const maxTs = maxDateNowSeconds * 2
const maxSecondsLength = maxTs.toString().length

function getNip34asc (createdAt, id = '') {
  // The id length must always be the same to not affect sorting
  if (id.length !== 64) { throw new Error('Wrong id length') }
  let seconds = Math.trunc(createdAt) // Make sure it is int instead of float
  seconds = Math.max(seconds, -maxDateNowSeconds) // Keep min limit
  seconds = Math.min(seconds, maxDateNowSeconds) // Keep max limit
  // Allow negative createdAt but remove minus sign
  // because '-2' string timestamp is wrongly higher than '-1'
  let ts = seconds + maxDateNowSeconds
  // Make it lower the greater the ts is (the newer the createdAt is)
  ts = maxTs - ts
  // '10' is wrongly lower then '2' while '10' is higher than padded '02'
  const paddedTsSeconds = ts.toString().padStart(maxSecondsLength, '0')

  // Event id is used as a fixed length unique identifier
  return `${paddedTsSeconds}${id}`
}

event.nip34asc = getNip34asc(event.created_at, event.id)