nips/34a.md
2023-06-27 10:59:20 -03:00

52 lines
1.7 KiB
Markdown

NIP-34a
=======
Oldest First
------------
`draft` `optional` `author:arthurfranca`
Events with older `created_at` are retrieved first.
## Implementation
`Relay` computes `nip34a` field once upon receiving the event.
The lower the `created_at`, the higher `nip34a` will be.
### Javascript
```js
// 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 getNip34a (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.nip34a = getNip34a(event.created_at, event.id)
```
## Notes
This implementation should be updated if we find out a popular programming
language doesn't support 17280000000000 int.