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
- Ensure the producer assigns messageId (or pass an explicit id via MessageProcessor.create's `id` argument) before dispatching the event.
- Add validation at event ingestion to reject CreateMessageEvent without messageId early, with a clear log.
- Check serialization/deserialization (JSON.stringify drops undefined fields) — generate the id server-side if missing instead of failing.
- 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
- Always assign messageId (e.g. crypto.randomUUID()) at event creation time.
- Validate events at the ingestion boundary before routing to middleware.
- Watch for JSON serialization dropping undefined messageId fields.
- Keep producer and server event schemas in sync.
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
- Cannot create message, group not found: cardId = ${event.car
- Message id is required
- Failed to load server config
- getDisplayMedia not supported
- No screen access granted
AI-assisted analysis of hcengineering/platform@63e28dc964 (2026-08-29).
Data as JSON: /api/errors/5f5b4f418ccffe7d.
Report an issue: GitHub.