import b4a from 'b4a'
import { createHash } from 'crypto'
// Message types
const TYPES = {
TEXT: 0,
MEDIA: 1,
REACTION: 2,
EDIT: 3,
DELETE: 4,
SYSTEM: 5,
REPLY: 6
}
// Platform identifiers
const PLATFORMS = {
KEET: 0,
IRC: 1,
DISCORD: 2,
MATRIX: 3,
MASTODON: 4,
EMAIL: 5,
ANDROID: 6,
ATPROTO: 7,
INSTAGRAM: 8
}
// Reverse maps for display
const TYPE_NAMES = Object.fromEntries(Object.entries(TYPES).map(([k, v]) => [v, k.toLowerCase()]))
const PLATFORM_NAMES = Object.fromEntries(Object.entries(PLATFORMS).map(([k, v]) => [v, k.toLowerCase()]))
function contentHash (envelope) {
const h = createHash('sha256')
h.update(String(envelope.platform))
h.update(envelope.author)
h.update(envelope.content)
h.update(String(envelope.timestamp))
return h.digest('hex').slice(0, 16)
}
function createEnvelope (opts) {
const type = opts.type ?? TYPES.TEXT
const platform = opts.platform ?? PLATFORMS.KEET
const author = opts.author || ''
const content = opts.content || ''
const timestamp = opts.timestamp || Date.now()
const channel = opts.channel || ''
const replyTo = opts.replyTo || ''
const mediaUrl = opts.mediaUrl || ''
const mediaType = opts.mediaType || ''
const editOf = opts.editOf || ''
const deleteOf = opts.deleteOf || ''
const envelope = {
type,
platform,
author,
content,
timestamp,
channel,
replyTo,
mediaUrl,
mediaType,
editOf,
deleteOf,
id: ''
}
envelope.id = opts.id || contentHash(envelope)
return envelope
}
export {
TYPES,
PLATFORMS,
TYPE_NAMES,
PLATFORM_NAMES,
createEnvelope,
contentHash
}