Virtual Care Service — Event Schemas
Status: populated Owner: TBD Last updated: 2026-04-18 Companion: Service Template · 03 platform-services · 02 DDD
1. Conventions
| Convention | Value |
|---|---|
| Event domain | virtual_care (per NAMING.md) |
| Event type format | virtual_care.{aggregate}.{event}.v{N} |
| NATS subject | Same as event type |
| Stream name | VIRTUAL_CARE |
| Subjects pattern | virtual_care.> |
| Source | ghasi/virtual-care-service |
| Envelope | CloudEvents 1.0 |
| PHI in events | Prohibited — only metadata (IDs, timestamps, status, counts); no session content, no clinical notes, no credentials |
2. NATS JetStream Configuration
| Setting | Value |
|---|---|
| Stream name | VIRTUAL_CARE |
| Subjects | virtual_care.> |
| Storage | File |
| Replicas | 3 (production) |
| Retention | Limits — 7-day default |
| Max message size | 64 KB |
| Discard policy | Old |
3. Events Produced
3.1 virtual_care.session.created.v1
Trigger: Session created + room provisioned. Consumers: audit-service, scheduling-service.
{
"specversion": "1.0",
"type": "virtual_care.session.created.v1",
"source": "ghasi/virtual-care-service",
"id": "<uuid>",
"time": "2026-04-20T09:55:00Z",
"datacontenttype": "application/json",
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"appointmentId": "<uuid>",
"videoBackend": "jitsi",
"scheduledStart": "2026-04-20T10:00:00Z",
"scheduledEnd": "2026-04-20T10:30:00Z"
}
}
3.2 virtual_care.session.started.v1
Trigger: First provider joins; session transitions to active. Consumers: audit-service, billing-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"initiatingProviderId": "<uuid>",
"videoBackend": "jitsi"
}
}
3.3 virtual_care.session.participant.joined.v1
Trigger: Participant validates join token. Consumers: audit-service.
{
"data": {
"tenantId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"participantId": "vsp_01HX...",
"userId": "<uuid>",
"role": "patient",
"participantStatus": "waiting"
}
}
3.4 virtual_care.session.participant.admitted.v1
Trigger: Provider admits patient from waiting room. Consumers: audit-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"participantId": "vsp_01HX...",
"userId": "<uuid>",
"role": "patient"
}
}
3.5 virtual_care.session.participant.removed.v1
Trigger: Provider removes a participant. Consumers: audit-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"sessionId": "vsn_01HX...",
"participantId": "vsp_01HX...",
"userId": "<uuid>",
"removeReason": "provider_action"
}
}
3.6 virtual_care.session.ended.v1
Trigger: Session transitions to ended. Consumers: audit-service, scheduling-service, patient-chart-service (triggers Encounter creation via FHIR), billing-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"appointmentId": "<uuid>",
"encounterId": "enc_01HX...",
"videoBackend": "jitsi",
"actualStart": "2026-04-20T10:02:00Z",
"actualEnd": "2026-04-20T10:28:00Z",
"durationSeconds": 1560,
"participantCount": 2,
"recordingRef": null
}
}
3.7 virtual_care.session.cancelled.v1
Trigger: Session cancelled before active. Consumers: audit-service, scheduling-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"appointmentId": "<uuid>",
"reason": "Patient unable to connect"
}
}
3.8 virtual_care.session.failed.v1
Trigger: Grace reconnect expired; session transitions to failed. Consumers: audit-service, communication-service.
{
"data": {
"tenantId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"videoBackend": "jitsi",
"failureReason": "WebRTC room unreachable after 60s grace period",
"previousStatus": "active"
}
}
3.9 virtual_care.session.fallback.initiated.v1
Trigger: Async messaging fallback triggered. Consumers: communication-service (creates thread), audit-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"messagingThreadId": "thr_01HX..."
}
}
3.10 virtual_care.config.updated.v1
Trigger: Tenant config changed. Consumers: audit-service. Note: Never includes credentials.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"correlationId": "<uuid>",
"changedFields": ["brandingLogoUrl", "recordingEnabled"]
}
}
3.11 virtual_care.billing.session_chargeable.v1
Trigger: Session ended with Encounter ID. Consumers: billing-service.
{
"data": {
"tenantId": "<uuid>",
"sessionId": "vsn_01HX...",
"patientId": "<uuid>",
"encounterId": "enc_01HX...",
"appointmentId": "<uuid>",
"durationSeconds": 1560,
"videoBackend": "jitsi",
"actualStart": "2026-04-20T10:02:00Z",
"actualEnd": "2026-04-20T10:28:00Z"
}
}
3.12 virtual_care.async_visit.submitted.v1
Trigger: Store-and-forward async visit submitted. Consumers: audit-service, patient-chart-service.
{
"data": {
"tenantId": "<uuid>",
"actorId": "<uuid>",
"sessionId": "avs_01HX...",
"patientId": "<uuid>",
"appointmentId": "<uuid>",
"hasAttachments": true,
"submittedAt": "2026-04-20T14:00:00Z"
}
}
4. Events Consumed
| NATS Subject | Source Service | Handling |
|---|---|---|
scheduling.appointment.scheduled.v1 | scheduling-service | Auto-create VirtualSession when serviceType=VR |
scheduling.appointment.cancelled.v1 | scheduling-service | Cancel VirtualSession if scheduled or waiting |