page.corvus.backchannelFrame

corvus.page

Documentation

include object

Client→server. Set the full collaborator allowlist for one block on this connection. Each frame is a complete replacement: the `dids` array becomes the active set for the named `blockId`, dropping anything sent previously for the same block. An empty `dids` array clears the filter for that block (no allowlist; all authors pass, matching the default when no `#include` has been sent). Filters are per-block — there is no global allowlist. Sending an `#include` for a block the connection is not currently `#subscribe`d to is permitted; the filter applies as soon as a matching `#subscribe` is active.

Properties

blockId string at-uri Required

The block id this allowlist applies to.

dids array of stringdid Required

Full set of DIDs whose ops should be delivered for this block on this connection. Replaces any prior set. Empty array clears the filter for this block.

View raw schema
{
  "type": "object",
  "required": [
    "blockId",
    "dids"
  ],
  "properties": {
    "dids": {
      "type": "array",
      "items": {
        "type": "string",
        "format": "did"
      },
      "description": "Full set of DIDs whose ops should be delivered for this block on this connection. Replaces any prior set. Empty array clears the filter for this block."
    },
    "blockId": {
      "type": "string",
      "format": "at-uri",
      "description": "The block id this allowlist applies to."
    }
  },
  "description": "Client→server. Set the full collaborator allowlist for one block on this connection. Each frame is a complete replacement: the `dids` array becomes the active set for the named `blockId`, dropping anything sent previously for the same block. An empty `dids` array clears the filter for that block (no allowlist; all authors pass, matching the default when no `#include` has been sent). Filters are per-block — there is no global allowlist. Sending an `#include` for a block the connection is not currently `#subscribe`d to is permitted; the filter applies as soon as a matching `#subscribe` is active."
}
op object

Client→server. Submit one op to the op stream

Properties

blockId string at-uri Optional

The block id of the block that the op was applied to

View raw schema
{
  "type": "object",
  "required": [
    "op"
  ],
  "properties": {
    "op": {
      "refs": [
        "page.corvus.block#create",
        "page.corvus.block#insert",
        "page.corvus.block#delete",
        "page.corvus.block#set",
        "page.corvus.block#increment",
        "page.corvus.block#add",
        "page.corvus.block#remove"
      ],
      "type": "union",
      "closed": true
    },
    "blockId": {
      "type": "string",
      "format": "at-uri",
      "description": "The block id of the block that the op was applied to"
    }
  },
  "description": "Client→server. Submit one op to the op stream"
}
subscribe object

Client→server. Start receiving ops for one block on this connection. The server validates that the authed DID has any effective `write`/`suggest` grant under `page.corvus.aclGrant` (or is a project root); failure is signaled by a `page.corvus.subscribeOps#error` frame carrying the offending `blockId` and no `opId`. No descent — the server does not walk child references. To watch a tree, the client reads child block ids out of materialized data and sends another `#subscribe` per id. Duplicate `#subscribe` for an already-active block is idempotent and may be used to advance the resume cursor.

Properties

blockId string at-uri Required

The block id to subscribe to.

cursor integer Optional

Resume from cursor > N for this block. The server replays every op for this `blockId` with cursor strictly greater than `N`, then transitions to live tail. Omit to start at live tail with no catch-up.

View raw schema
{
  "type": "object",
  "required": [
    "blockId"
  ],
  "properties": {
    "cursor": {
      "type": "integer",
      "description": "Resume from cursor > N for this block. The server replays every op for this `blockId` with cursor strictly greater than `N`, then transitions to live tail. Omit to start at live tail with no catch-up."
    },
    "blockId": {
      "type": "string",
      "format": "at-uri",
      "description": "The block id to subscribe to."
    }
  },
  "description": "Client→server. Start receiving ops for one block on this connection. The server validates that the authed DID has any effective `write`/`suggest` grant under `page.corvus.aclGrant` (or is a project root); failure is signaled by a `page.corvus.subscribeOps#error` frame carrying the offending `blockId` and no `opId`.\n\nNo descent — the server does not walk child references. To watch a tree, the client reads child block ids out of materialized data and sends another `#subscribe` per id.\n\nDuplicate `#subscribe` for an already-active block is idempotent and may be used to advance the resume cursor."
}
unsubscribe object

Client→server. Stop receiving the op stream for one project on this connection. The server stops emitting `#op` / `#info` / `#heartbeat` frames for the project. Idempotent — unsubscribing from a project that isn't subscribed is a no-op.

Properties

blockId string at-uri Required

The block id of the root block that you want to stop viewing items beneath

View raw schema
{
  "type": "object",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "format": "at-uri",
      "description": "The block id of the root block that you want to stop viewing items beneath"
    }
  },
  "description": "Client→server. Stop receiving the op stream for one project on this connection. The server stops emitting `#op` / `#info` / `#heartbeat` frames for the project. Idempotent — unsubscribing from a project that isn't subscribed is a no-op."
}

Lexicon Garden

@