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
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
node_id | string | yes | The machine's node id (platform_node_principals.node_id), minted with the principal and unique among principals. |
|
principal_id | string | yes | The revoked node principal. Also the envelope subject id. |
|
owner | one of | yes | Who 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. | |
reason | string | Why it was revoked, when the caller gave one (the owner's text or the service's); absent otherwise. |
| |
at | string | yes | When the revoke was applied (platform_node_principals.revoked_at). |
|
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 }] }