OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-social / bridge-envelope / lib / envelope.js

82 lines · javascript ref:
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
}