BrowserProviderJobCreateRequest browser-provider.job-create-request@1
Generated at from
openvibe-contracts v0.177.0 and
openvibe-sdk v0.44.0.
- Version
- 1.0.0
- Owner
- run
- Visibility
- internal
- Status
- planned
- Compatibility
- backward
- Decision
- ADR-034
- Schema
https://openvibe.network/contracts/browser-provider/job-create-request.v1.json
browser-provider.job-create-request@1 (PLANNED; plan T14 R4a, ADR-034): the body OpenVibe.Run POSTs to an external managed-browser provider's job endpoint (capability browser_provider.job.dispatch). ID is the platform.job@1 id (job_<ULID>) and is also the idempotency key: a repeat POST with the same id answers the first job (200, created false) and never starts a second. CLASS is always browser. ARGS is the job's declared input as JSON (Run refuses more than 512 KiB serialized before it ever sends). INPUTS are files, each an OpenVibe.Media object pinned by sha256; never a URL, so the provider fetches nothing a caller chose. LIMITS are the hard caps of platform.job@1 (wall_ms required; cpu_ms and mem_bytes when the provider can enforce them). EGRESS is the network the job may reach, the values of OpenVibe.Node's worker.egress, as platform.job@1 `net` carries it. The request carries no project, subject, requester, token or other credential: the provider never learns who pays, and Run authenticates to it with a key from Run's own environment, sent in a header and never in this body. The provider's answer is browser-provider.job-create-result@1.
Fields
| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
id | https://openvibe.network/contracts/platform/job-frame.v1.json#/$defs/job_id | yes | ||
class | const | yes |
| |
args | object | yes | The job's declared input as JSON; Run enforces the 512 KiB cap before sending. | |
inputs | https://openvibe.network/contracts/run/job-create-request.v1.json#/$defs/input | yes | Files for the job, each an OpenVibe.Media object pinned by sha256; names are unique; empty when the job has none. |
|
limits | object | yes | Caps on the running job (platform.job@1 limits); the provider ends a job that hits one with exit_reason limit. |
|
limits.wall_ms | integer | yes | Running time from the job's start |
|
limits.cpu_ms | integer | CPU time, user plus system; when the provider can enforce it |
| |
limits.mem_bytes | integer | Peak resident memory; when the provider can enforce it |
| |
egress | https://openvibe.network/contracts/run/job-create-request.v1.json#/$defs/egress | yes |
Examples
From the contract's own test fixtures: valid ones validate, rejected ones must fail.
Valid: full
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {
"url": "https://example.com",
"screenshot": true
},
"inputs": [
{
"name": "script.js",
"media_id": "med_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"sha256": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
"size_bytes": 482
}
],
"limits": {
"wall_ms": 120000,
"cpu_ms": 120000,
"mem_bytes": 1073741824
},
"egress": "public"
}Valid: minimal
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "none"
}Rejected: bad-id
{
"id": "run_1",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "none"
}Rejected: class-not-browser
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "code",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "none"
}Rejected: input-url
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [
{
"name": "page.html",
"url": "https://example.com/page.html"
}
],
"limits": {
"wall_ms": 60000
},
"egress": "none"
}Rejected: limits-without-wall
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"cpu_ms": 1000
},
"egress": "none"
}Rejected: project-id
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "none",
"project_id": "prj_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}Rejected: subject
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "none",
"subject": "user:usr_01JAB2C3D4E5F6G7H8J9K0MNPQ"
}Rejected: unknown-egress
{
"id": "job_01JAB2C3D4E5F6G7H8J9K0MNPQ",
"class": "browser",
"args": {},
"inputs": [],
"limits": {
"wall_ms": 60000
},
"egress": "deny"
}Validate
const contracts = require('openvibe-contracts');
contracts.validate('browser-provider.job-create-request@1', value); // { valid, errors: [{ path, message }] }