NetworkNodeRevokedPayload network.node.revoked@1

Generated at from openvibe-contracts v0.107.0 and openvibe-sdk v0.26.0.

Version
1.0.0
Owner
network
Visibility
first-party
Status
active
Compatibility
backward
Decision
ADR-034
Schema
https://openvibe.network/contracts/events/payloads/network.node.revoked.v1.json

network.node.revoked v1 (OpenVibe.Network; plan T2, docs/t2-cells-and-node-principal.md section 10, migrations/0014_node_pairing.sql). A node principal (nod_…), a person's paired machine, was revoked: through POST /internal/node-principals/:id/revoke (network.node.manage, the service that paired it), through POST /api/v1/me/nodes/:id/revoke (the owner's session), or with the owner's account. Network revokes the row and clears the credential and its grace window; a machine holding a live node token is refused at its next use (≤ 300 s), and until this event only learned of the revoke at its next reauth (≤ 330 s). A consumer stops the machine at once; a second revoke changes nothing and emits nothing. The credential and its hash are never carried. Envelope: subject { type: node_principal, id: <nod_…> }, visibility internal, actor the service (svc:<service>) or the owner ({ type: user }) that revoked.

Fields

FieldTypeRequiredDescriptionConstraints
node_idstringyesThe machine's node id (platform_node_principals.node_id), minted with the principal and unique among principals.
  • pattern ^n-[a-z0-9]{26}$
principal_idstringyesThe revoked node principal. Also the envelope subject id.
  • pattern ^nod_[0-9A-HJKMNP-TV-Z]{26}$
ownerone ofyesWho the machine belongs to, as GET /api/v1/me/nodes and the operator list show it: the person who paired it, the project it is paired into, or the platform for a Host-reported machine.
reasonstringWhy it was revoked, when the caller gave one (the owner's text or the service's); absent otherwise.
  • minLength 1
  • maxLength 500
atstringyesWhen the revoke was applied (platform_node_principals.revoked_at).
  • format date-time

Examples

From the contract's own test fixtures: valid ones validate, rejected ones must fail.

Valid: project-owned
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnpt",
  "principal_id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPT",
  "owner": {
    "kind": "project",
    "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
Valid: revoked-by-owner
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
Valid: revoked-by-service
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "reason": "the owner disconnected the machine from Bot",
  "at": "2026-10-04T18:00:00.000Z"
}
Rejected: bad-node-id
{
  "node_id": "node-1",
  "principal_id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
Rejected: missing-principal
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR"
  },
  "at": "2026-10-04T18:00:00.000Z"
}
Rejected: owner-mixed
{
  "node_id": "n-01jab2c3d4e5f6g7h8j9k0mnps",
  "principal_id": "nod_01JAB2C3D4E5F6G7H8J9K0MNPS",
  "owner": {
    "kind": "user",
    "subject": "usr_01JAB2C3D4E5F6G7H8J9K0MNPR",
    "project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ"
  },
  "at": "2026-10-04T18:00:00.000Z"
}

Validate

const contracts = require('openvibe-contracts');
contracts.validate('network.node.revoked@1', value);   // { valid, errors: [{ path, message }] }