WebsiteShare website.share@1

Generated at from openvibe-contracts v0.419.0 and openvibe-sdk v0.161.0.

Version
1.0.0
Owner
connect
Visibility
public
Status
active
Compatibility
backward
Schema
https://openvibe.network/contracts/website/share.v1.json

website.share@1: one Share on OpenVibe.Website Connect, a local port published at a stable hostname through the edge relay. The record says who owns it, which project scopes it, which Link tunnel serves it, which local target it may reach, which policy version the edge enforces and where it is in its life (draft, review, active, paused, revoked). The tunnel token, the request bodies the inspector captures and the policy's password hash are never part of this document.

Fields

FieldTypeRequiredDescriptionConstraints
idstringyes
  • pattern ^shr_[0-9A-HJKMNP-TV-Z]{26}$
owneranyyesThe person who owns the share. A project share is still owned by a person; project_id says which project it belongs to.
project_idstring | nullThe project scope when the share belongs to one; null for a personal share. The token's project scope, never a caller-supplied body field, decides access.
  • pattern ^prj_[0-9A-HJKMNP-TV-Z]{26}$
node_idstring | nullThe Network node principal expected to serve the tunnel; null until one is bound.
  • pattern ^lnk_[0-9A-HJKMNP-TV-Z]{26}$
namestringyesOne DNS label under openvibe.website. The first proof uses the single label agents-<owner> because Universal SSL covers one label only.
  • pattern ^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$
hostnamestringyesThe fully qualified public host, lowercased; the default is name.openvibe.website, and a verified custom domain may replace it.
  • minLength 4
  • maxLength 253
protocolenumyesWhat the share carries. http and https are HTTP/WS/SSE shares; tcp and udp are port shares.
  • one of "http", "https", "tcp", "udp"
local_targetstringyesThe local target the Link may forward to, e.g. 127.0.0.1:3000, tcp://127.0.0.1:25565 or udp://127.0.0.1:19132. Loopback by default; a LAN target is allowed only when the owner enabled it locally.
  • minLength 3
  • maxLength 300
statusenumyesreview holds a public share for the abuse screen; revoked is terminal and closes the route and tunnel.
  • one of "draft", "review", "active", "paused", "revoked"
policy_idstringyes
  • pattern ^pol_[0-9A-HJKMNP-TV-Z]{26}$
policy_versionintegeryesThe signed policy version the edge enforces. A request is checked against this version; revocation bumps it and closes the tunnel.
  • minimum 1
regionstring | nullThe edge region the share is pinned to, e.g. eu or us-east; null before placement.
  • maxLength 40
edge_idstring | nullThe edge instance serving the active tunnel; null while the share is offline.
  • maxLength 80
expires_atstring | nullWhen the share revokes itself; null for no expiry.
  • format date-time
last_seen_atstring | nullThe last successful Link liveness check; null until the first tunnel.
  • format date-time
created_atstringyes
  • format date-time
updated_atstringyes
  • format date-time
revoked_atstring | null
  • format date-time
hrefstring
  • pattern ^https://
  • format uri

Examples

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

Valid: agents-portal
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "agents-alice",
  "hostname": "agents-alice.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Valid: max-label
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "a-------------------------------------------------------------z",
  "hostname": "a-------------------------------------------------------------z.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Valid: one-char
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "a",
  "hostname": "a.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Valid: two-char
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "ab",
  "hostname": "ab.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Rejected: deleted-status
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "name": "agents-alice",
  "hostname": "agents-alice.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "deleted",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z"
}
Rejected: leading-hyphen
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "-ab",
  "hostname": "-ab.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Rejected: too-long
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "hostname": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Rejected: trailing-hyphen
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "project_id": null,
  "node_id": "lnk_01J8Z3Q4R5S6T7V8W9X0Y1Z2A5",
  "name": "ab-",
  "hostname": "ab-.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 3,
  "region": "eu",
  "edge_id": "edge-eu-1",
  "expires_at": null,
  "last_seen_at": "2026-10-29T09:00:00.000Z",
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z",
  "revoked_at": null,
  "href": "https://connect.openvibe.website/shares/shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3"
}
Rejected: uppercase-name
{
  "id": "shr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A3",
  "owner": {
    "type": "user",
    "id": "usr_01J8Z3Q4R5S6T7V8W9X0Y1Z2A6"
  },
  "name": "Agents-Alice",
  "hostname": "agents-alice.openvibe.website",
  "protocol": "http",
  "local_target": "127.0.0.1:3000",
  "status": "active",
  "policy_id": "pol_01J8Z3Q4R5S6T7V8W9X0Y1Z2A4",
  "policy_version": 1,
  "created_at": "2026-10-29T08:00:00.000Z",
  "updated_at": "2026-10-29T09:00:00.000Z"
}

Validate

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