hcengineering/platform · error · Error

Message id is required

Error message

Message id is required

What it means

The storage middleware's createMessage handler validates that an incoming CreateMessageEvent carries a messageId before writing to blob storage. If `event.messageId == null` (undefined or null), it throws this Error. The message group lookup cannot proceed without a stable message identity.

Source

Thrown at foundations/communication/packages/server/src/middleware/storage.ts:232

  private async addCollaborators (event: Enriched<AddCollaboratorsEvent>): Promise<Result> {
    const added = await this.db.addCollaborators(event.cardId, event.cardType, event.collaborators, event.date)

    if (added.length === 0) return { skipPropagate: true }
    event.collaborators = added
    return {}
  }

  private async removeCollaborators (event: Enriched<RemoveCollaboratorsEvent>): Promise<Result> {
    if (event.collaborators.length === 0) return { skipPropagate: true }
    await this.db.removeCollaborators({ cardId: event.cardId, account: event.collaborators })

    return {}
  }

  private async createMessage (event: Enriched<CreateMessageEvent>): Promise<Result> {
    if (event.messageId == null) {
      throw new Error('Message id is required')
    }

    const group = await this.blob.getMessageGroupByDate(event.cardId, event.date)
    if (group == null) {
      throw new Error(
        `Cannot create message, group not found: cardId = ${event.cardId}, messageId = ${event.messageId}, created = ${event.date.toISOString()}`
      )
    }
    const result: CreateMessageResult = {
      messageId: event.messageId,
      created: event.date,
      blobId: group.blobId
    }
    const created = await this.db.createMessageMeta(
      event.cardId,
      event.messageId,
      event.socialId,
      event.date,

View on GitHub (pinned to 63e28dc964)

Solutions

  1. Ensure the producer assigns messageId (or pass an explicit id via MessageProcessor.create's `id` argument) before dispatching the event.
  2. Add validation at event ingestion to reject CreateMessageEvent without messageId early, with a clear log.
  3. Check serialization/deserialization (JSON.stringify drops undefined fields) — generate the id server-side if missing instead of failing.
  4. Align event schema versions between producer and the communication server.

Example fix

// before
await processor.handle({ type: 'message.create', cardId, content } as CreateMessageEvent)
// Error: Message id is required
// after
await processor.handle({ type: 'message.create', cardId, messageId: crypto.randomUUID(), content })
Defensive patterns

Strategy: validation

Validate before calling

function assertCreateMessageEvent(event) {
  if (event.messageId == null) throw new Error('Refusing to dispatch CreateMessageEvent without messageId')
  if (!event.cardId) throw new Error('CreateMessageEvent requires cardId')
}

Type guard

function hasMessageId(e: CreateMessageEvent): e is CreateMessageEvent & { messageId: MessageID } {
  return e.messageId != null
}

Try / catch

try {
  await storage.processEvent(enrichedEvent)
} catch (e) {
  if (e.message === 'Message id is required') {
    console.error('Producer bug: CreateMessageEvent missing messageId', enrichedEvent)
  }
  throw e
}

Prevention

When it happens

Trigger: processEvent routing a CreateMessageEvent to storage middleware when the event was constructed without messageId and no external id was supplied upstream.

Common situations: Producers emitting message-created events before assigning an id; serialization dropping undefined messageId fields; a client generating events locally without an id; mismatch between event schema versions where messageId became optional in the producer.

Understand the failure class

Background: "Missing required field" and "field is required" errors: why libraries reject payloads that omit mandatory fields — this error's family across 20 libraries.

Related errors


AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29). Data as JSON: /api/errors/5f5b4f418ccffe7d. Report an issue: GitHub.