Introduction
This documentation provides details on implementing NMOS IS-04 Node, Registration and Query APIs with NodeJS.
NodeAPI
Instantiation
const is04 = require('node-nmos-is04');
let store = new is04.NodeRAMStore();
await store.setSelf(new is04.Node({
label: "Test Node",
description: "This is a test node",
tags: ["testing", "node"],
interfaces: ["en0"]
}))
let NodeAPI = new is04.NodeAPI({
store: store
})
NodeAPI.on('registry', (cb) => {
console.log(`${cb.status}: ${cb.message}`, cb.data)
})
NodeAPI.on('heartbeat', (cb) => {
console.log(`${cb.status}: ${cb.message}. ${cb.data.time}`)
})
A NMOS-IS04 Node is created and made available on the network.
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
| store | required | Node Store for access to Node information | |
| address | optional | 'localhost:3000' | Interface address and port |
| regAddress | optional | null | Address of a pre-defined NMOS Registration Server |
Event: 'registry'
registry
event may return several objects
{
status: 'registered',
message: 'Node registered with Registration Server at <IP_ADDRESS>:3000',
data: {
static: boolean,
address: string,
port: number,
connected: boolean,
registered: boolean,
selectedIndex: number
}
}
{
status: 'error',
message: 'Error registering with Registration Server at <IP_ADDRESS>:3000',
data: {error object}
}
{
status: 'unregistered',
message: 'Node unregistered from Registration Server',
data: {
static: boolean,
address: string,
port: number,
connected: boolean,
registered: boolean,
selectedIndex: number
}
}
Fires registry
on several different events. The specific event is listed as the status
and the object may be different per each event
| Parameter | Type | Description |
|---|---|---|
| status | string | registered Node has registered itself with a Registration Server |
| message | string | Human-friend message for this event |
| data | object | Object with details about the registration server |
| data.static | boolean | Is the registration server provided (static) or found via mDNS |
| data.address | string | Registration server address |
| data.port | number | Registration server port |
| data.connected | boolean | Connection status |
| data.registered | boolean | Registration status |
| data.selectedIndex | number | Index of selected mDNS Registration Server advertisement |
| status | string | error Error registering with the Registration Server |
| message | string | Human-friend message for this event |
| data | object | Error object from HTTP request error |
| status | string | unregistered Node has been unregistered by the Registration Server |
| message | string | Human-friend message for this event |
| data | object | Object with details about the registration server |
| data.static | boolean | Is the registration server provided (static) or found via mDNS |
| data.address | string | Registration server address |
| data.port | number | Registration server port |
| data.connected | boolean | Connection status |
| data.registered | boolean | Registration status |
| data.selectedIndex | number | Index of selected mDNS Registration Server advertisement |
Event: 'heartbeat'
heartbeat
event will be fired on every heartbeat once connected to a Registration Server
{
status: 'sent',
message: 'Heartbeat sent to Registration Server',
data: {
time: number,
uri: string
}
}
{
status: 'received',
message: 'Heartbeat received from Registration Server',
data: {
time: number
}
}
{
status: 'error',
message: 'Heartbeat Error',
data: {
time: number,
error: object
}
}
Fires heartbeat
on several different events. The specific event is listed as the status
and the object may be different per each event. Each heartbeat
records the Javascript time in Unix milliseconds so a "ping-pong" latency can be determined. Heartbeats are sent ever 5 seconds and timeout after 1000 ms. The Registration Server SHOULD remove this entry after 12 seconds of no heartbeat.
| Parameter | Type | Description |
|---|---|---|
| status | string | sent Node has sent a heartbeat to the Registration Server |
| message | string | Human-friend message for this event |
| data | object | Object with details about the heartbeat |
| data.time | number | Javascript timestamp (Unix milliseconds) of when heartbeat was sent |
| data.uri | string | Address heartbeat was sent to |
| status | string | received Node has received a heartbeat response from the Registration Server |
| message | string | Human-friend message for this event |
| data | object | Object with details about the heartbeat |
| data.time | number | Javascript timestamp (Unix milliseconds) of when heartbeat was received |
| status | string | error Error in sending or receiving heartbeat |
| message | string | Human-friend message for this event |
| data | object | Object with details about the heartbeat |
| data.time | boolean | Javascript timestamp (Unix milliseconds) of when error was received |
| data.error | object | Error object from HTTP Request |
start()
NodeAPI.start();
NodeAPI.on('started', (cb) => {
console.log(cb.message)
})
started
event returns the following:
{
message: "NMMOS IS-04 Node server has started"
}
Start the Node server and mDNS services.
Event: 'started'
Fires started
event once the Node server has been started with the following object:
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
stop()
NodeAPI.stop()
NodeAPI.on('stopped', (cb) => {
console.log(cb.message)
})
stopped
event returns the following:
{
message: "NMMOS IS-04 Node server has stopped"
}
Stop the Node server and mDNS services.
Event: 'stopped'
Fires stopped
event once the Node server has been shutdown, with the following object:
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
startMDNS()
NodeAPI.startMDNS()
NodeAPI.on('mdns', {
status: string,
message: string,
data: object
})
mdns
event may return several objects (see docs)
Manually start the mDNS Services. This is automatically started with start()
, but if the mDNS services were manually stopped, you can restart them here.
Event: 'mdns'
{
status: 'advert_start',
message: 'mDNS Advertisement has been started',
data: {
hostname: string,
txtRecord: object
}
}
{
status: 'browse_start',
message: 'mDNS Browse for Registration Servers has been started'
}
Fires mdns
on several different events. The specific event is listed as the status
and the object may be different per each event
| Parameter | Type | Description |
|---|---|---|
| status | string | advert_start Start of the mDNS Advertisement |
| message | string | Human-friend message for this event |
| data | object | Additional data for this event |
| data.hostname | string | mDNS Advertisement hostname |
| data.txtRecord | object | txt_records included with mDNS Advertisement |
| status | string | browse_start Start of mDNS looking for Registration Servers |
| message | string | Human-friend message for this event |
stopMDNS()
NodeAPI.stopMDNS()
NodeAPI.on('mdns', {
status: string,
message: string,
data: object
})
mdns
event may return several objects (see docs)
Manually stop the mDNS Services. This is automatically stopped with stop()
but can also stop mDNS services manually
Event: 'mdns'
{
status: 'advert_stop',
message: 'mDNS Advertisement has stopped'
}
{
status: 'browse_stop',
message: 'mDNS Browse for Registration Servers have stopped'
}
Fires mdns
on several different events. The specific event is listed as the status
and the object may be different per each event
| Parameter | Type | Description |
|---|---|---|
| status | string | advert_stop Stop of the mDNS Advertisement |
| message | string | Human-friend message for this event |
| status | string | browse_stop Stop of mDNS looking for Registration Servers |
| message | string | Human-friend message for this event |
NodeRAMStore
Instantiation
const is04 = require('node-nmos-is04');
let store = new is04.NodeRAMStore();
Create a RAM-based Store for a Node or Registration Server.
getResources()
store.getResources()
Get all Resources currently available in the store.
Return
Example return
{
self: Node {
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: '' },
nodes:
{ '9cc73ed0-d601-4efe-b974-949de6ae584d':
Node {
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [Array],
href: '',
api: [Object],
services: [],
clocks: [],
interfaces: [Object],
hostname: '' } },
devices:
{ 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77':
Device {
id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
version: '1567947806:133492956',
label: 'Device 1',
description: '',
caps: {},
tags: [],
type: 'urn:x-nmos:device:pipeline',
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
senders: [],
receivers: [],
controls: [] } },
sources:
{ 'ed5ef4b3-6740-4db3-95f5-c907dd84916d':
Source {
id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
version: '1567947806:134232449',
label: 'Source 1',
description: '',
caps: {},
tags: [],
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
parents: [],
clock_name: null,
grain_rate: null,
format: 'urn:x-nmos:format:video',
channels: null }
},
flows:
{ '44d55a36-b553-42cc-bff1-e451df0e40c1':
Flow {
id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
version: '1567947806:135367354',
label: 'Video Flow',
description: '',
caps: {},
tags: [],
grain_rate: null,
source_id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
parents: [],
format: 'urn:x-nmos:format:video',
frame_width: 1920,
frame_height: 1080,
interlace_mode: 'interlaced_tff',
colorspace: 'BT709',
transfer_characteristics: 'SDR',
media_type: null,
components: null }
},
senders:
{ '3620614c-929f-4fec-b59d-74763c397ece':
Sender {
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object] }
},
receivers:
{ 'a8f61658-47ad-4212-ab5a-8a659e500ab9':
Receiver {
id: 'a8f61658-47ad-4212-ab5a-8a659e500ab9',
version: '1567947806:136616679',
label: 'Receiver 1',
description: '',
caps: [Array],
tags: [],
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: [Array],
format: 'urn:x-nmos:format:video',
subscription: [Object] }
}
}
| Parameter | Type | Description |
|---|---|---|
| self | object | Node information when store is used for a Node, not Registration Server |
| nodes | object | All Nodes in the store |
| devices | object | All Devices in the store |
| sources | object | All Sources in the store |
| flows | object | All Flows in the store |
| senders | object | All Senders in the store |
| receivers | object | All Receivers in the store |
getResourceIDs()
store.getResourceIDs()
Get all IDs of all Resources currently available in the store.
Return
Example return
{ self: '3377bbba-a2a8-4b8c-b428-6d45bb60aad7',
nodes: [ '3377bbba-a2a8-4b8c-b428-6d45bb60aad7' ],
devices: [ '4a776a15-93ec-4953-9f86-288929ff33f2' ],
sources:
[ '080fe271-ecce-4bf4-a5ca-e25f1b3b3bcf',
'b3506a57-e9c6-4d33-9f3d-74ea951d68e0' ],
flows:
[ '626b631a-b7fb-4f03-bf20-97fb196eadb0',
'6e0cfe6c-855a-4f97-aa0d-fc9ef5c0473a' ],
senders:
[ '646f3a74-50da-4f87-85d0-19b380bba2b7',
'a0ab0c81-f917-49ff-bd85-ad48489231e9' ],
receivers:
[ '0c442fd0-f31d-4a0e-a495-a6ed0beb1c96',
'c7909c21-bd7d-4318-9913-bba6c3cb9f66' ] }
| Parameter | Type | Description |
|---|---|---|
| self | object | Node information when store is used for a Node, not Registration Server |
| nodes | array | All Node IDs in the store |
| devices | array | All Device IDs in the store |
| sources | array | All Sources IDs in the store |
| flows | array | All Flow IDs in the store |
| senders | array | All Sender IDs in the store |
| receivers | array | All Receiver IDs in the store |
getResourceCounts()
store.getResourceCounts()
Get counts of objects currently in the store
Return
Example return
{ self: 1,
nodes: 1,
devices: 1,
sources: 2,
flows: 2,
senders: 2,
receivers: 2 }
| Parameter | Type | Description |
|---|---|---|
| self | number | 1 if store used as Node, 0 if Registration Server |
| nodes | number | Count of Nodes |
| devices | number | Count of Devices |
| sources | number | Count of Sources |
| flows | number | Count of Flows |
| senders | number | Count of Senders |
| receivers | number | Count of Receivers |
getSelf()
store.getSelf()
Get the currently stored Node as Self, when store is used as Node, not Registration Server
Return
Example return
Node {
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: '' }
See Node Model
setSelf()
store.setSelf(new is04.Node({
label: "Test Node",
description: "This is a test node",
tags: ["tesing", "node"],
interfaces: ["en0"]
}))
Set the Node for self
, when used for a Node server, not Registration Server
Parameters
See Node model
Return
Example return
Node {
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: '' }
Returns same node
that was set. See Node Model.
putNode()
store.putNode(new is04.Node({
label: "Test Node",
description: "This is a test node",
tags: ["tesing", "node"],
interfaces: ["en0"]
}))
Put a node
in the nodes
store
Parameters
See Node model
Return
Example return
Node {
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: '' }
Returns same node
that was put. See Node Model.
getNodes()
store.getNodes()
store.getNodes([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getNodes('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Nodes from the store.
Parameters
getNodes()
accepts either a string or array of strings to return specific Nodes. If no parameter provided, returns all nodes on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Node to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: ''
},
{ ... }
]
Returns an array of Nodes. See Node model
getNode()
store.getNode('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Node from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Node to return |
Return
Example Return
{
id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
version: '1567947806:124643978',
label: 'Test Node',
description: '',
caps: {},
tags: [ 'tesing', 'node' ],
href: '',
api: { versions: [Array], endpoints: [Array] },
services: [],
clocks: [],
interfaces: { en0: [Array], en6: [Array] },
hostname: ''
}
Returns a single Node. See Node model
deleteNode()
store.deleteNode('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Node from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Node to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Node as a String
putDevice()
store.putDevice(new is04.Device({
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
label: "Device 1",
description: "A multifaceted device"
}))
Put a device
in the devices
store
Parameters
See Device model
Return
Example return
Device {
id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
version: '1567947806:133492956',
label: 'Device 1',
description: '',
caps: {},
tags: [],
type: 'urn:x-nmos:device:pipeline',
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
senders: [],
receivers: [],
controls: [] }
Returns same device
that was put. See Device Model.
getDevices()
store.getDevices()
store.getDevices([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getDevices('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Devices from the store.
Parameters
getDevices()
accepts either a string or array of strings to return specific Devices. If no parameter provided, returns all devices on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Device to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
version: '1567947806:133492956',
label: 'Device 1',
description: '',
caps: {},
tags: [],
type: 'urn:x-nmos:device:pipeline',
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
senders: [],
receivers: [],
controls: []
},
{ ... }
]
Returns an array of Devices. See Device model
getDevice()
store.getDevice('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Device from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Device to return |
Return
Example Return
{
id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
version: '1567947806:133492956',
label: 'Device 1',
description: '',
caps: {},
tags: [],
type: 'urn:x-nmos:device:pipeline',
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
senders: [],
receivers: [],
controls: []
}
Returns a single Device. See Device model
deleteDevice()
store.deleteDevice('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Device from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Device to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Device as a String
putSource()
store.putSource(new is04.Source({
label: "Source 1",
description: "This is the first source",
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
format: "urn:x-nmos:format:video"
}))
Put a source
in the sources
store
Parameters
See Source model
Return
Example return
Sender {
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object] }
Returns same source
that was put. See Source Model.
getSources()
store.getSources()
store.getSources([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getSources('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Sources from the store.
Parameters
getSources()
accepts either a string or array of strings to return specific Sources. If no parameter provided, returns all sources on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Source to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object]
},
{ ... }
]
Returns an array of Sources. See Source model
getSource()
store.getSource('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Source from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Source to return |
Return
Example Return
{
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object]
}
Returns a single Source. See Source model
deleteSource()
store.deleteSource('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Source from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Source to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Source as a String
putFlow()
store.putFlow(new is04.Flow({
label: 'Video Flow',
description: "This is the first Video flow",
source_id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
flow_type: "video",
video: {
frame_width: 1920,
frame_height: 1080,
interlace_mode: "interlaced_tff",
colorspace: "BT709"
}
})
Put a flow
in the flows
store
Parameters
See Flow model
Return
Example return
Flow {
id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
version: '1567947806:135367354',
label: 'Video Flow',
description: '',
caps: {},
tags: [],
grain_rate: null,
source_id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
parents: [],
format: 'urn:x-nmos:format:video',
frame_width: 1920,
frame_height: 1080,
interlace_mode: 'interlaced_tff',
colorspace: 'BT709',
transfer_characteristics: 'SDR',
media_type: null,
components: null }
Returns same flow
that was put. See Flow Model.
getFlows()
store.getFlows()
store.getFlows([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getFlows('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Flows from the store.
Parameters
getFlows()
accepts either a string or array of strings to return specific Flows. If no parameter provided, returns all flows on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Flow to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
version: '1567947806:135367354',
label: 'Video Flow',
description: '',
caps: {},
tags: [],
grain_rate: null,
source_id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
parents: [],
format: 'urn:x-nmos:format:video',
frame_width: 1920,
frame_height: 1080,
interlace_mode: 'interlaced_tff',
colorspace: 'BT709',
transfer_characteristics: 'SDR',
media_type: null,
components: null
},
{ ... }
]
Returns an array of Flows. See Flow model
getFlow()
store.getFlow('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Flow from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Flow to return |
Return
Example Return
{
id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
version: '1567947806:135367354',
label: 'Video Flow',
description: '',
caps: {},
tags: [],
grain_rate: null,
source_id: 'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
parents: [],
format: 'urn:x-nmos:format:video',
frame_width: 1920,
frame_height: 1080,
interlace_mode: 'interlaced_tff',
colorspace: 'BT709',
transfer_characteristics: 'SDR',
media_type: null,
components: null
}
Returns a single Flow. See Flow model
deleteFlow()
store.deleteFlow('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Flow from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Flow to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Flow as a String
putSender()
store.putFlow(new is04.Sender({
label: 'Audio Sender',
flow_id: "44d55a36-b553-42cc-bff1-e451df0e40c1",
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: "9cc73ed0-d601-4efe-b974-949de6ae584d",
interface_bindings: ["en0"]
}))
Put a sender
in the senders
store
Parameters
See Sender model
Return
Example return
Sender {
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object] }
Returns same sender
that was put. See Sender Model.
getSenders()
store.getSenders()
store.getSenders([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getSenders('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Senders from the store.
Parameters
getSenders()
accepts either a string or array of strings to return specific Senders. If no parameter provided, returns all senders on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Sender to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object]
},
{ ... }
]
Returns an array of Senders. See Sender model
getSender()
store.getSender('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Sender from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Sender to return |
Return
Example Return
{
id: '3620614c-929f-4fec-b59d-74763c397ece',
version: '1567947806:136110405',
label: 'Video Sender',
description: '',
caps: {},
tags: [],
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
manfiest_href: null,
interface_bindings: [Array],
subscription: [Object] }
Returns a single Sender. See Sender model
deleteSender()
store.deleteSender('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Sender from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Sender to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Sender as a String
putReceiver()
store.putReceiver(new is04.Receiver({
label: 'Receiver 1',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: ["en0"],
receiver_type: "video",
caps: ["video/raw"]
}))
Put a receiver
in the receivers
store
Parameters
See Receiver model
Return
Example return
Receiver {
id: 'a8f61658-47ad-4212-ab5a-8a659e500ab9',
version: '1567947806:136616679',
label: 'Receiver 1',
description: '',
caps: [Array],
tags: [],
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: [Array],
format: 'urn:x-nmos:format:video',
subscription: [Object] }
}
Returns same receiver
that was put. See Receiver Model.
getReceivers()
store.getReceivers()
store.getReceivers([
'9cc73ed0-d601-4efe-b974-949de6ae584d',
'ed5ef4b3-6740-4db3-95f5-c907dd84916d',
'd00f73c6-7a27-4dc2-a4ad-1c375648bc77'
])
store.getReceivers('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one or more Receivers from the store.
Parameters
getReceivers()
accepts either a string or array of strings to return specific Receivers. If no parameter provided, returns all receivers on the store.
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Receiver to return |
| uuid | [string] | Array of UUIDs to return |
Return
Example Return
[
{
id: 'a8f61658-47ad-4212-ab5a-8a659e500ab9',
version: '1567947806:136616679',
label: 'Receiver 1',
description: '',
caps: [Array],
tags: [],
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: [Array],
format: 'urn:x-nmos:format:video',
subscription: [Object]
},
{ ... }
]
Returns an array of Receivers. See Receiver model
getReceiver()
store.getReceiver('9cc73ed0-d601-4efe-b974-949de6ae584d')
Get one Receiver from the store.
Parameters
Requires UUID to return
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Receiver to return |
Return
Example Return
{
id: 'a8f61658-47ad-4212-ab5a-8a659e500ab9',
version: '1567947806:136616679',
label: 'Receiver 1',
description: '',
caps: [Array],
tags: [],
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: [Array],
format: 'urn:x-nmos:format:video',
subscription: [Object]
}
Returns a single Receiver. See Receiver model
deleteReceiver()
store.deleteReceiver('9cc73ed0-d601-4efe-b974-949de6ae584d')
Delete a Receiver from the store
Parameters
Requires UUID to delete
| Parameter | Type | Description |
|---|---|---|
| uuid | string | UUID of a single Receiver to delete |
Return
Example Return
'9cc73ed0-d601-4efe-b974-949de6ae584d'
Returns ID of the deleted Receiver as a String
RegistrationAPI
Instantiation
const is04 = require('node-nmos-is04');
let store = new is04.NodeRAMStore()
let RegistrationAPI = new is04.RegistrationAPI({
store: store,
address: '<IP_ADDRESS>:3001'
});
RegistrationAPI.on('heartbeat', (cb) => {
console.log(`${cb.status}: ${cb.message} | Time since last: ${cb.data.timeSinceLast}` )
})
Start a NMOS IS-04 Registration Server. The Registration Server is compliant with the REST API as defined by NMOS in their documentation up to NMOS v1.3
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
| store | required | Node Store for access to Registry information | |
| address | optional | 'localhost:3000' | Interface address and port |
| hostname | optional | 'nmos_reg' | Hostname of Registry instance |
| priority | optional | 100 | Registry Server Priority |
Event: 'heartbeat'
{
status: 'received',
message: 'Heartbeat received from Node',
data: {
id: string,
timeSeconds: number,
timeSinceLast: number,
time: number
}
}
Fires heartbeat
when a heartbeat is received from a Node. Each heartbeat
records the Javascript time in Unix milliseconds so a "ping-pong" latency can be determined. Heartbeats SHOULD be received from the Node every 5 seconds.
| Parameter | Type | Description |
|---|---|---|
| status | string | received Registration Server has received a heartbeat response from the Node |
| message | string | Human-friend message for this event |
| data | object | Object with details about the heartbeat |
| data.id | string | ID of the reporting Node |
| data.timeSeconds | number | Time when heartbeat was received, in seconds |
| data.timeSinceLast | number | Amount of time since the last heartbeat |
| data.time | number | Javascript timestamp (Unix milliseconds) of when heartbeat was received |
RegistrationAPI.start()
RegistrationAPI.start()
RegistrationAPI.on('started', (cb) => {
console.log(cb.message)
})
Start the Registration Server and mDNS services
Event: 'started'
{
message: "NMOS IS-04 Registration Server Started"
}
Fires started
upon start of the registry server
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
RegistrationAPI.stop()
RegistrationAPI.stop()
RegistrationAPI.on('stopped', (cb) => {
console.log(cb.message)
})
Stop the Registration Server
Event: 'stopped'
{
message: "NMOS IS-04 Registration Server stopped"
}
Fires stopped
upon start of the registry server
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
RegistrationAPI.startMDNS()
RegistrationAPI.startMDNS()
RegistrationAPI.on('mdns', (cb) => {
console.log(cb.message, cb.data)
})
mdns
event may return several objects
Manually start the mDNS Services. This is automatically started with start()
, but if the mDNS services were manually stopped, you can restart them here.
Event: 'mdns'
{
status: 'advert_start',
message: 'mDNS Advertisement has been started',
data: {
hostname: string,
txtRecord: {
pri: number
}
}
}
Fires mdns
on several different events. The specific event is listed as the status
and the object may be different per each event
| Parameter | Type | Description |
|---|---|---|
| status | string | advert_start Start of the mDNS Advertisement |
| message | string | Human-friend message for this event |
| data | object | Additional data for this event |
| data.hostname | string | mDNS Advertisement hostname |
| data.txtRecord | object | txt_records included with mDNS Advertisement |
| data.txtRecord.pri | number | Registration Server Priority Number |
RegistrationAPI.stopMDNS()
RegistrationAPI.stopMDNS()
RegistrationAPI.on('mdns', (cb) => {
console.log(cb.message)
})
mdns
event may return several objects (see docs)
Manually stop the mDNS Services. This is automatically stopped with stop()
but can also stop mDNS services manually
Event: 'mdns'
{
status: 'advert_stop',
message: 'mDNS Advertisement has stopped'
}
Fires mdns
on several different events. The specific event is listed as the status
and the object may be different per each event
| Parameter | Type | Description |
|---|---|---|
| status | string | advert_stop Stop of the mDNS Advertisement |
| message | string | Human-friend message for this event |
QueryAPI
Instantiation
const is04 = require('node-nmos-is04');
let store = new is04.NodeRAMStore()
let QueryAPI = new is04.QueryAPI({
store: store
});
Start a NMOS IS-04 Query Service. The Query Service is compliant with the REST API as defined by NMOS in their documentation up to NMOS v1.3.
The Query Service also supports WebSocket connections as per NMOS documentation on Querying Behavior. In general, the API endpoint POST /subscriptions
allows for a WebSocket host to be created on the Query server for clients to connect to and receive real-time updates of resource changes in the store.
The Query Services DOES NOT yet support RQL Queries, as they are specified as optional in the IS-04 v1.3 standard.
Parameters
| Parameter | Required | Default | Description |
|---|---|---|---|
| store | required | Node Store for access to Registry information | |
| address | optional | 'localhost:3002' | Interface address and port |
QueryAPI.start()
QueryAPI.start()
QueryAPI.on('started', (cb) => {
console.log(cb.message)
})
Start the Query API server to interact with a particular store
Event: 'started'
Event fires
{
message: "NMOS IS-04 Query Service Started"
}
Fires started
upon start of the query service
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
Event: 'ws'
QueryAPI.on('ws', (cb) => {
console.log(cb.message)
})
Event fires
{
event: 'start',
message: "webSocket service started"
}
Fires when the websocket server is started
| Parameter | Type | Description |
|---|---|---|
| message | string | Human-friendly message for this event |
Model: Node
Instantiation
let node = new is04.Node({
label: 'Test Node',
description: "This is a new test node"
})
Returns the following object
{
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
href: string,
services: [object],
clocks: [object],
interfaces: [string],
hostname: string
}
Create new a new Node object.
Parameters
All parameters are optional and will take default values if not provided. Additional properties of the Node are generated automatically. If no ID is provided, Serial number is required to generated UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Node | |
| serial | string | Serial number of this physical device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Node. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| href | string | HTTP access href for Node's API (deprecated) | |
| services | [object] | Array of Services | |
| clocks | [object] | Array of Clocks | |
| interfaces | [string] | String or Array of strings to only include certain interfaces |
Return
The resulting Node
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Node | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Node. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | [] | Array of Capabilities (not yet defined) |
| tags | [string] | [] | Array of tags |
| href | string | HTTP access href for Node's API (deprecated) | |
| hostname | string | Hostname for Node's API (deprecated) | |
| services | [object] | [] | Array of Services |
| clocks | [object] | [] | Array of Clocks |
| interfaces | [string] | [] | String or Array of strings to only include certain interfaces |
valid()
Returns true
if current Device is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.
Model: Device
Instantiation
let device = new is04.Device({
node_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
label: "Device 1",
description: "A multifaceted device"
})
Returns the following object
{
node_id: string,
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
type: string,
senders: [string],
receivers: [string],
controls: [string]
}
Create new a new Device object.
Parameters
Only a node_id
is required, all other parameters are optional. All properties will be generated automatically if not provided. If no ID is provided, Serial number is required to generated UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Device | |
| serial | string | Serial number of this physical device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Device. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| node_id | string | required | UUID for the Node that created this Device |
| type | string | Device Type URN | |
| controls | [string] | Control endpoints exposed for the Device |
Return
The resulting Device
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Device. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | [] | Array of Capabilities (not yet defined) |
| tags | [string] | [] | Array of tags |
| node_id | string | UUID for the Node that created this Device | |
| type | string | "urn:x-nmos:device:pipeline" | Device Type URN |
| senders | [string] | [] | UUIDs of Senders attached to the Device (deprecated) |
| receivers | [string] | [] | UUIDs of Receivers attached to the Device (deprecated) |
| controls | [string] | [] | Control endpoints exposed for the Device |
valid()
Returns true
if current Device is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.
Model: Source
Instantiation
let source = new is04.Source({
label: "Source 1",
description: "This is the first source",
device_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
format: "urn:x-nmos:format:video"
})
Returns the following object
{
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
device_id: string,
parents: [string],
clock_name: object,
grain_rate: object,
format: string,
channels: [object]
}
Create new a new Source object.
Parameters
device_id
and format
are required, all other parameters are optional. All properties will be generated automatically if not provided. If no ID is provided, Serial number is required to generated UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Source | |
| serial | string | Serial number of this physical device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Source. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| device_id | string | required | UUID for the Device which initially created the Source. This attribute is used to ensure referential integrity by registry implementations. |
| format | string | required | Source Format |
| parents | [string] | Array of UUIDs representing the Source IDs of Grains which came together at the input to this Source (may change over the lifetime of this Source) | |
| clock_name | string | Reference to clock in the originating Node | |
| grain_rate | object | Maximum number of Grains per second for Flows derived from this Source.Corresponding Flow Grain rates may override this attribute. Grain rate matches the frame rate for video (see NMOS Content Model). Specified for periodic Sources only | |
| grain_rate.numerator | number | Grain Rate Numerator | |
| grain_rate.denominator | number | Grain Rate Denominator | |
| channels | [object] | Array of audio channels objects | |
| channels.label | string | Label for an audio channel (free text) | |
| channels.symbol | string | Symbol for this channel (per VSF TR-03 Appendix A) |
Return
The resulting Source
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Source | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Source. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | [] | Array of Capabilities (not yet defined) |
| tags | [string] | [] | Array of tags |
| device_id | string | UUID for the Device which initially created the Source. This attribute is used to ensure referential integrity by registry implementations. | |
| format | string | Source Format | |
| parents | [string] | [] | Array of UUIDs representing the Source IDs of Grains which came together at the input to this Source (may change over the lifetime of this Source) |
| clock_name | string | null | Reference to clock in the originating Node |
| grain_rate | object | null | Maximum number of Grains per second for Flows derived from this Source.Corresponding Flow Grain rates may override this attribute. Grain rate matches the frame rate for video (see NMOS Content Model). Specified for periodic Sources only |
| grain_rate.numerator | number | Grain Rate Numerator | |
| grain_rate.denominator | number | Grain Rate Denominator | |
| channels | [object] | null | Array of audio channels objects |
| channels.label | string | Label for an audio channel (free text) | |
| channels.symbol | string | Symbol for this channel (per VSF TR-03 Appendix A) |
valid()
Returns true
if current Source is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.
Model: Flow
Instantiation
let flow = new is04.Flow({
label: 'Video Flow',
description: "This is the first Video flow",
source_id: '9cc73ed0-d601-4efe-b974-949de6ae584d',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
flow_type: "video",
video: {
frame_width: 1920,
frame_height: 1080,
interlace_mode: "interlaced_tff",
colorspace: "BT709"
}
})
Returns the following object (some properties dependent on format)
{
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
device_id: string,
source_id: string,
parents: [string],
grain_rate: object,
format: string,
sample_rate: object,
media_type: string,
bit_depth: number,
frame_width: number,
frame_height: number,
interlace_mode: string,
colorspace: string,
transfer_characteristics: string,
media_type: string,
components: [object],
did_sdid: [string]
}
Create new a new Flow object.
Parameters
device_id
, source_id
and flow_type
are required, all other parameters are optional. All properties will be generated automatically if not provided.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Flow | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Flow. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| flow_type | string | required | Type of flow to create |
| device_id | string | required | UUID for the Device which initially created the Source. This attribute is used to ensure referential integrity by registry implementations (v1.1 onward). |
| source_id | string | required | UUID for the Source which initially created the Flow. This attribute is used to ensure referential integrity by registry implementations (v1.0 only). |
| parents | [string] | Array of UUIDs representing the Flow IDs of Grains which came together to generate this Flow (may change over the lifetime of this Flow) | |
| grain_rate | object | Maximum number of Grains per second for Flows derived from this Source.Corresponding Flow Grain rates may override this attribute. Grain rate matches the frame rate for video (see NMOS Content Model). Specified for periodic Sources only | |
| grain_rate.numerator | number | Grain Rate Numerator | |
| grain_rate.denominator | number | Grain Rate Denominator | |
| sample_rate | object | Number of Audio Samples per second for this flow (required for audio flows) | |
| sample_rate.numerator | number | Sample Rate Numerator | |
| sample_rate.denominator | number | Sample Rate Denominator | |
| media_type | string | Subclassification of the format using IANA assigned media types | |
| bit_depth | number | Bit depth of the audio samples | |
| frame_width | number | Width of the picture in pixels | |
| frame_height | number | Height of the picture in pixels | |
| interlace_mode | string | Interlaced video mode for the frames in this flow | |
| colorspace | string | Colorspace used for the video | |
| transfer_characteristics | string | Transfer Characteristic | |
| components | [object] | Array of objects describing the components | |
| components.name | string | Name of this component | |
| components.width | number | Width of this component in pixels | |
| components.height | number | Height of this component in pixels | |
| components.bit_depth | number | Number of bits used to describe each sample | |
| did_sdid | object | List of Data identification and secondary data identification words | |
| did_sdid.DID | string | Data Identification Word | |
| did_sdid.SDID | string | Secondary data identification word |
Return
The resulting Flow
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Flow | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Flow. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| device_id | string | UUID for the Device which initially created the Source. This attribute is used to ensure referential integrity by registry implementations (v1.1 onward). | |
| source_id | string | UUID for the Source which initially created the Flow. This attribute is used to ensure referential integrity by registry implementations (v1.0 only). | |
| parents | [string] | [] | Array of UUIDs representing the Flow IDs of Grains which came together to generate this Flow (may change over the lifetime of this Flow) |
| format | string | Source Format | |
| grain_rate | object | Maximum number of Grains per second for Flows derived from this Source.Corresponding Flow Grain rates may override this attribute. Grain rate matches the frame rate for video (see NMOS Content Model). Specified for periodic Sources only | |
| grain_rate.numerator | number | Grain Rate Numerator | |
| grain_rate.denominator | number | Grain Rate Denominator | |
| sample_rate | object | Number of Audio Samples per second for this flow (required for audio flows) | |
| sample_rate.numerator | number | Sample Rate Numerator | |
| sample_rate.denominator | number | Sample Rate Denominator | |
| media_type | string | Subclassification of the format using IANA assigned media types | |
| bit_depth | number | Bit depth of the audio samples | |
| frame_width | number | Width of the picture in pixels | |
| frame_height | number | Height of the picture in pixels | |
| interlace_mode | string | Interlaced video mode for the frames in this flow | |
| colorspace | string | Colorspace used for the video | |
| transfer_characteristics | string | Transfer Characteristic | |
| components | [object] | Array of objects describing the components | |
| components.name | string | Name of this component | |
| components.width | number | Width of this component in pixels | |
| components.height | number | Height of this component in pixels | |
| components.bit_depth | number | Number of bits used to describe each sample | |
| did_sdid | object | List of Data identification and secondary data identification words | |
| did_sdid.DID | string | Data Identification Word | |
| did_sdid.SDID | string | Secondary data identification word |
valid()
Returns true
if current Flow is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.
Model: Sender
Instantiation
let device = new is04.Sender({
label: 'Video Sender',
flow_id: '44d55a36-b553-42cc-bff1-e451df0e40c1',
transport: 'urn:x-nmos:transport:rtp.mcast',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
interface_bindings: ["en0"]
})
Returns the following object
{
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
flow_id: string,
device_id: string,
transport: string,
manifest_href: string,
interface_bindings: [string],
subscription: object
}
Create new a new Sender object.
Parameters
flow_id
, device_id
& interface_bindings
are required, all other parameters are optional. Optional properties will be generated automatically if not provided. If no ID is provided, Serial number is required to generated UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Sender | |
| serial | string | Serial number of this physical device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Sender. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| flow_id | string | required | UUID of the Flow currently passing via this Sender |
| device_id | string | required | UUID of Device which this Sender forms part of. This attribute is used to ensure referential integrity by registry implementations |
| transport | string | required | Transport type used by the Sender in URN Format |
| manifest_href | string | HTTP URL to a file describing how to connect to the Sender (SDP for RTP). The Sender's 'version' attribute should be updated if the contents of this file are modified. This URL may return an HTTP 404 where the 'active' parameter in the 'subscription' object is present and set to false (v1.2+ only). | |
| interface_bindings | [string] | required | Binding of Sender egress ports to interfaces on the parent Node. Should contain a single network interface unless a redundancy mechanism such as ST.2022-7 is in use, in which case each 'leg' should have its matching interface listed. Where the redundancy mechanism sends more than one copy of the stream via the same interface, that interface should be listed a corresponding number of times. |
| subscription | object | Object containing the 'receiver_id' currently subscribed to (unicast only). Receiver_id should be null on initialization, or when connected to a non-NMOS unicast Receiver. |
Return
The resulting Sender
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Sender | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Sender. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| flow_id | string | UUID of the Flow currently passing via this Sender | |
| device_id | string | UUID of Device which this Sender forms part of. This attribute is used to ensure referential integrity by registry implementations | |
| transport | string | Transport type used by the Sender in URN Format | |
| manifest_href | string | HTTP URL to a file describing how to connect to the Sender (SDP for RTP). The Sender's 'version' attribute should be updated if the contents of this file are modified. This URL may return an HTTP 404 where the 'active' parameter in the 'subscription' object is present and set to false (v1.2+ only). | |
| interface_bindings | [string] | Binding of Sender egress ports to interfaces on the parent Node. Should contain a single network interface unless a redundancy mechanism such as ST.2022-7 is in use, in which case each 'leg' should have its matching interface listed. Where the redundancy mechanism sends more than one copy of the stream via the same interface, that interface should be listed a corresponding number of times. | |
| subscription | object | { receiver_id: null, active: false } |
Object containing the 'receiver_id' currently subscribed to (unicast only). Receiver_id should be null on initialization, or when connected to a non-NMOS unicast Receiver. |
valid()
Returns true
if current Sender is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.
Model: Receiver
Instantiation
let device = new is04.Receiver({
label: 'Receiver 1',
device_id: 'd00f73c6-7a27-4dc2-a4ad-1c375648bc77',
transport: 'urn:x-nmos:transport:rtp.mcast',
interface_bindings: ["en0"],
receiver_type: "video",
caps: ["video/raw"]
})
Returns the following object
{
id: string,
version: string,
label: string,
description: string,
caps: [object],
tags: [string],
device_id: string,
transport: string,
interface_bindings: [string],
subscription: object
}
Create new a new Receiver object.
Parameters
device_id
, transport
, interface_bindings
, receiver_type
and caps
are required, all other parameters are optional. Optional properties will be generated automatically if not provided. If no ID is provided, Serial number is required to generated UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Receiver | |
| serial | string | Serial number of this physical device | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Receiver. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | required | Array of Capabilities (not yet defined) |
| tags | [string] | Array of tags | |
| device_id | string | required | UUID of Device which this Receiver forms part of. This attribute is used to ensure referential integrity by registry implementations |
| receiver_type | string | required | Type of receiver |
| transport | string | required | Transport type used by the Receiver in URN Format |
| interface_bindings | [string] | required | Binding of Receiver ingress ports to interfaces on the parent Node. Should contain a single network interface unless a redundancy mechanism such as ST.2022-7 is in use, in which case each 'leg' should have its matching interface listed. Where the redundancy mechanism sends more than one copy of the stream via the same interface, that interface should be listed a corresponding number of times. |
| subscription | object | Object containing the 'sender_id' currently subscribed to. Sender_id should be null on initialisation, or when connected to a non-NMOS Sender. |
Return
The resulting Receiver
instance will have the following properties:
| Parameter | Type | Default | Description |
|---|---|---|---|
| id | string | Globally unique UUID identifier for the Receiver | |
| version | string | String formatted PTP timestamp | |
| label | string | Freeform string label for the Receiver. | |
| desc | string | Detailed description of the resource | |
| caps | [object] | Array of Capabilities (not yet defined) | |
| tags | [string] | Array of tags | |
| flow_id | string | UUID of the Flow currently passing via this Sender | |
| device_id | string | UUID of Device which this Sender forms part of. This attribute is used to ensure referential integrity by registry implementations | |
| transport | string | Transport type used by the Sender in URN Format | |
| manifest_href | string | HTTP URL to a file describing how to connect to the Sender (SDP for RTP). The Sender's 'version' attribute should be updated if the contents of this file are modified. This URL may return an HTTP 404 where the 'active' parameter in the 'subscription' object is present and set to false (v1.2+ only). | |
| interface_bindings | [string] | Binding of Sender egress ports to interfaces on the parent Node. Should contain a single network interface unless a redundancy mechanism such as ST.2022-7 is in use, in which case each 'leg' should have its matching interface listed. Where the redundancy mechanism sends more than one copy of the stream via the same interface, that interface should be listed a corresponding number of times. | |
| subscription | object | { sender_id: null, active: false } |
Object containing the 'sender_id' currently subscribed to. Sender_id should be null on initialisation, or when connected to a non-NMOS Sender. |
valid()
Returns true
if current Receiver is validated against the JSON Schema provided by NMOS IS-04. Not yet implemented.


pyhpeimc.plat.vlanm module¶
This module contains functions for working with the VLAN Manager capabilities of the HPE IMC NMS platform using the RESTful API
-
pyhpeimc.plat.vlanm.
HEADERS
= {'Content-Type': 'application/json', 'Accept': 'application/json', 'Accept-encoding': 'application/json'}¶ This section contains functions which operate at the device level
-
pyhpeimc.plat.vlanm.
add_hybrid_interface
(ifindex, pvid, taggedVlans, untaggedVlans, auth, url, devip=None, devid=None)[source]¶
-
pyhpeimc.plat.vlanm.
create_dev_vlan
(vlanid, vlan_name, auth, url, devid=None, devip=None)[source]¶ function takes devid and vlanid vlan_name of specific device and 802.1q VLAN tag and issues a RESTFUL call to add the specified VLAN from the target device. VLAN Name MUST be valid on target device.
Parameters: devid – int or str value of the target device :param vlanid:int or str value of target 802.1q VLAN
Parameters: - vlan_name – str value of the target 802.1q VLAN name. MUST be valid name on target device.
- auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: str HTTP Response code. Should be 201 if successfully created
Return type: str
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> create_dev_vlan = create_dev_vlan('350', '200', 'test vlan', auth.creds, auth.url)
-
pyhpeimc.plat.vlanm.
delete_dev_vlans
(vlanid, auth, url, devid=None, devip=None)[source]¶ function takes devid and vlanid of specific device and 802.1q VLAN tag and issues a RESTFUL call to remove the specified VLAN from the target device. :param vlanid:int or str value of target 802.1q VLAN
Parameters: - vlan_name – str value of the target 802.1q VLAN name. MUST be valid name on target device.
- auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: HTTP response object from requests library. Status code should be 204 if Successful
Return type: requests.models.Response
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> create_dev_vlan = create_dev_vlan('350', '200', 'test vlan', auth.creds, auth.url)
-
pyhpeimc.plat.vlanm.
delete_hybrid_interface
(ifindex, auth, url, devip=None, devid=None)[source]¶ - Function takes devip ( ipv4 address ), ifIndex and pvid (vlanid) of specific device and 802.1q VLAN tag and issues a RESTFUL call to remove the
specified VLAN from the target device. :param ifindex: str value of ifIndex for a specific interface on the device :param auth: requests auth object #usually auth.creds from auth pyhpeimc.auth.class :param url: base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass :param devip: str Ipv4 address of target device :return: int of 204 if successful or 409 if not succesful :rtype: int
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> delete_hybrid_interface('9', auth.creds, auth.url, devip='<IP_ADDRESS>') 409
>>> add_hybrid = add_hybrid_interface('9', '1', '10', '1', auth.creds, auth.url, devip='<IP_ADDRESS>')
>>> delete_hybrid = delete_hybrid_interface('9', auth.creds, auth.url, devip='<IP_ADDRESS>')
>>> assert type(delete_hybrid) is int
>>> assert delete_hybrid == 204
-
pyhpeimc.plat.vlanm.
get_access_interface_vlan
(ifIndex, accessinterfacelist, auth, url)[source]¶ Function which takes input of str of ifIndex value for target interface and accessinterfacelist ( output of get_device_access_interfaces) to send against IMC REST interface. Function returns
Parameters: - ifIndex – str object representing the numeric value of the iFindex for the interface
- accessinterfacelist – list object, intended to be the output of the get_device_access_interfaces function
- auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: str representing the numeric value of the PVID for the target interface.
Return type: str
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> access_interface_list = get_device_access_interfaces(auth.creds, auth.url, devip='<IP_ADDRESS>')
>>> get_access_interface_vlan('4', access_interface_list, auth.creds, auth.url) '1'
-
pyhpeimc.plat.vlanm.
get_dev_vlans
(auth, url, devid=None, devip=None)[source]¶ Function takes input of devID to issue RESTUL call to HP IMC
Parameters: - devid – str requires devId as the only input parameter
- auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: list of dictionaries where each element of the list represents one vlan on the target device
Return type: list
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> vlans = get_dev_vlans('350', auth.creds, auth.url)
>>> assert type(vlans) is list
>>> assert 'vlanId' in vlans[0]
-
pyhpeimc.plat.vlanm.
get_device_access_interfaces
(auth, url, devid=None, devip=None)[source]¶ Function takes devId as input to RESTFUL call to HP IMC platform :param devid: str requires devId as the only input parameter
Parameters: - auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: list of dictionaries where each element of the list represents an interface which has been configured as a
VLAN access port
Return type: list >>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> access_interfaces = get_device_access_interfaces('10', auth.creds, auth.url)
>>> assert type(access_interfaces) is list
>>> assert (len(access_interfaces[0])) is 2
>>> assert 'ifIndex' in access_interfaces[0]
>>> assert 'pvid' in access_interfaces[0]
-
pyhpeimc.plat.vlanm.
get_device_hybrid_interfaces
(auth, url, devid=None, devip=None)[source]¶ Function takes devId as input to RESTFUL call to HP IMC platform :param devid: str requires devId as the only input parameter
Parameters: - auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: list of dictionaries where each element of the list represents an interface which has been configured as a
VLAN access port
Return type: list >>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> hybrid_interfaces = get_device_hybrid_interfaces('10', auth.creds, auth.url)
>>> assert type(access_interfaces) is list
>>> assert (len(access_interfaces[0])) is 2
>>> assert 'ifIndex' in access_interfaces[0]
>>> assert 'pvid' in access_interfaces[0]
-
pyhpeimc.plat.vlanm.
get_trunk_interfaces
(auth, url, devid=None, devip=None)[source]¶ Function takes devId as input to RESTFULL call to HP IMC platform
Parameters: - devid – str requires devId as the only input parameter
- auth – requests auth object #usually auth.creds from auth pyhpeimc.auth.class
- url – base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass
Returns: list of dictionaries where each element of the list represents an interface which has been configured as a
VLAN trunk port
Return type: list >>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> trunk_interfaces = get_trunk_interfaces('10', auth.creds, auth.url)
>>> assert type(trunk_interfaces) is list
>>> assert len(trunk_interfaces[0]) == 3
>>> assert 'allowedVlans' in trunk_interfaces[0]
>>> assert 'ifIndex' in trunk_interfaces[0]
>>> assert 'pvid' in trunk_interfaces[0]
>>> get_trunk_interfaces('350', auth.creds, auth.url) ['No trunk inteface']
-
pyhpeimc.plat.vlanm.
modify_hybrid_interface
(ifindex, pvid, taggedVlans, untaggedVlans, auth, url, devip=None, devid=None)[source]¶
-
pyhpeimc.plat.vlanm.
set_access_interface_pvid
(ifIndex, pvid, auth, url, devip=None, devid=None)[source]¶ Function takes devip ( ipv4 address ), ifIndex and pvid (vlanid) of specific device and 802.1q VLAN tag and issues a RESTFUL call to remove the specified VLAN from the target device. :param ifIndex: str value of ifIndex for a specific interface on the device :param pvid: str value of dot1q VLAN desired to apply to the device :param auth: requests auth object #usually auth.creds from auth pyhpeimc.auth.class :param url: base url of IMC RS interface #usually auth.url from pyhpeimc.auth.authclass :param devip: str Ipv4 address of target device :return: int of 204 if successful or 409 if not succesful :rtype: int
>>> from pyhpeimc.auth import *
>>> from pyhpeimc.plat.vlanm import *
>>> auth = IMCAuth("http://", "<IP_ADDRESS>", "8080", "admin", "admin")
>>> set_access_int_vlan = set_access_interface_pvid('9', '1', auth.creds, auth.url, devip='<IP_ADDRESS>')
>>> set_access_int_vlan = set_access_interface_pvid('9', '10', auth.creds, auth.url, devip='<IP_ADDRESS>')
>>> assert type(set_access_int_vlan) is int
>>> assert set_access_int_vlan == 204
>>> set_access_int_vlan = set_access_interface_pvid('9', '1', auth.creds, auth.url, devip='<IP_ADDRESS>')


Requested Shows List
Search for a show
Home
› Shows
Shows
A
Ace of the Diamond
Akame ga Kill!
ALDNOAH.ZERO
Attack on Titan
B
Black Bullet
Bleach
Blue Exorcist
Brynhildr in the Darkness
C
Cardcaptor Sakura
Canvas 2: Niji Iro no Sketch
D
Dai-Shogun - Great Revolution
DENK-GAI
Durarara
Dusk Maiden of Amnesia
F
Fairy Tail
Fate Zero
Fate/stay night
G
Gintama
Gurren Lagann
H
Hamatora
Hell Girl: Three Vessels
Hunter x Hunter
I
Ixion Saga DT
K
KanColle
Kill la Kill
KINMOZA!
Kokoro Connect
Kuroko's Basketball
M
Magi
Magic Kaito 1412
N
Naruto
Naruto Shippuden
O
One Piece
R
RWBY
Rurouni Kenshin
S
Sailor Moon
School Days
Silver Spoon
Sword Art Online
T
TERRAFORMARS
The World God Only Knows
Tsuritama
Toriko
Y
Yona of the Dawn


{% extends 'base.html' %} {% block content %}
Event Date:
License Plate:
Post type: alert compliment comment criticism question suggestion
Post topic:
Location (Map):
Get Location
Login to post, comment, vote...


ABOUT THE FACULTY
The Faculty of Modern Languages comprises ten permanent members of staff in all: eight who teach exclusively within the Faculty, (four of whom teach part-time) and two who also teach in other departments. The Faculty is also fortunate to have two foreign language assistants, who are contracted on a yearly basis from October to May. All pupils are required to study French in Years 7-9, and most study Spanish in Years 8 and 9 and at least one of these languages in Years 10 and 11. The majority of pupils follow a full course to GCSE, although a small number follow a Certificate of Achievement course. Both languages are offered to A-Level in the Sixth Form and the Faculty has an impressive track record of results to date.


ERS -- ERMapper .ERS
GDAL supports reading and writing raster files with .ers header files, with some
limitations. The .ers ascii format is used by ERMapper for labeling raw
data files, as well as for providing extended metadata, and georeferencing
for some other file formats. The .ERS format, or variants are also used to
hold descriptions of ERMapper algorithms, but these are not supported by GDAL.
Starting with GDAL 1.9.0, the PROJ, DATUM and UNITS values found in the ERS header are reported
in the ERS metadata domain.
Creation Issues
Creation Options:
- PIXELTYPE=value:.By setting this to SIGNEDBYTE, a new Byte file can be forced to be written as signed byte
- PROJ=name: (GDAL >= 1.9.0) Name of the ERS projection string to use.
Common examples are NUTM11, or GEODETIC. If defined, this will override the value computed by SetProjection() or SetGCPs().
- DATUM=name: (GDAL >= 1.9.0) Name of the ERS datum string to use.
Common examples are WGS84 or NAD83. If defined, this will override the value computed by SetProjection() or SetGCPs().
- UNITS=name: (GDAL >= 1.9.0) Name of the ERS projection units to use :
METERS (default) or FEET (us-foot). If defined, this will override the value computed by SetProjection() or SetGCPs().
See Also:
- Implemented as gdal/frmts/ers/ersdataset.cpp.


The Eye is a Private Investigation venture operating around Dhaka. We take pride in unraveling mysteries and upholding justice. Stay tuned to know more about us and our journey!


WITNESS LIST Higher Education Committee February 20, 2001-4:00P HB 42 On: Brown, Dr. Don W. (Texas Higher Education Coordinating Board) Easley, Mr. Mike (Center for Rural Health) Hines, Dr. Charles A. (Self and Prairie View A&M University) HB 439 For: Nixon, Mr. James C. (Central Texas College) HB 467 For: Alvarez, Ms. Erica (Texas Woman's University, Health Advisory Committee) Roque, Ms. Maria (Texas Woman's University, Student Health Advisory Committee) Roy, Ms. Elizabeth (Texas Woman's University, Student Senate) On: Lekawski, Dr. Linda (Texas Woman's University, Student Health Services) Nicholas, Dr. Richard Alan (Texas Woman's University) Registering, but not testifying: On: Creighton-Hays, Mrs. Kay (Texas Woman's University Student Health Services) HB 683 For: Hennigan, Mr. Nathan (Self) Levin, Mr. Marc (Young Conservatives of Texas) Wykes, Mr. Bruce L. (Self) Zook, Mr. Nathan (Self) Against: Bode, Ms. Petrina (Trish) (Self and Associated Student Government, Southwest Texas State University) Brown, Mr. Nathan (Self and Student Government, University of Texas at Austin) Lefko, Miss Hilary B. (Student Government, University of Texas at Austin) Oldmixon, Mr. Seth (Student Government, University of Texas at Austin) Polikov, Mr. Scott (American Civil Liberities Union of Texas) Virgil, Ms. Lauren (Student Government, University of Texas at Austin) Zucker, Dr. Charles (Texas Faculty Association) Registering, but not testifying: For: Henary, Miss Beth (Young Conservatives of Texas, University of Texas at Austin Chapter) Pool, Mr. Darryl (Republican Party of Texas) Watson, Mr. Steven (Young Conservatives of Texas) Against: Croft, Ms. Randi (Self) HB 791 For: Rola, Ms. Gail (The University of North Texas School of Community Service) Against: Bode, Ms. Petrina (Trish) (Self and Associated Student Government, Southwest Texas State University) Gerstenschlager, Mrs. MerryLynn (Texas Eagle Forum) Levin, Mr. Marc (Young Conservatives of Texas) Myers, Mrs. Jackelyn (Texas Eagle Forum) On: Aronson, Ms. Donna (University of the Incarnate Word) Goodall, Mrs. Donetta (Austin Community College) Registering, but not testifying: Against: Lefko, Miss Hilary (Student Government, University of Texas at Austin) On: Shakespeare, Ms. Christine (Texas Commission of Volunteerism) Virgil, Ms. Lauren (Student Government, University of Texas at Austin) HB 1127 For: Zucker, Dr. Charles (Texas Faculty Association) Registering, but not testifying: For: Lara, Mr. Rene (Texas Federation of Teachers) HB 1129 Registering, but not testifying: For: Lefko, Miss Hilary (Student Government, University of Texas at Austin) Oldmixon, Mr. Seth (Student Government, University of Texas at Austin) Virgil, Ms. Lauren (Student Government, University of Texas at Austin) HB 1130 For: Baker, Mr. Charles Scott (Self) Caesar, Miss Jennifer (Self) Gonzalez, Mrs. Evelyn (Self) Ramirez, Ms. Olga (Self) Registering, but not testifying: For: Campbell, Mr. Jack (Texas Assocation of Business and Chambers of Commerce) Enoch, Mrs. Teresa (Self) Fickel, Mrs. Ann (Texas Classroom Teachers Association) Gonzalez, Mrs. Eleanor (Victoria Federation of Teachers) Jackson, Mr. Terrance (Self) Kennedy, Miss Cynthia D. (Self) Lara, Mr. Rene (Texas Federation of Teachers) Winn, Mrs. Canetra S. (Self) HB 1212 On: Segura, Dr. Bill (Texas State Technical College) Registering, but not testifying: For: Lefko, Miss Hilary (Student Government, University of Texas at Austin) Oldmixon, Mr. Seth (Student Government, University of Texas at Austin) HB 1465 Registering, but not testifying: For: Davis, Dr. Lillian (Austin Community College) Fonte, Dr. Richard (Austin Community College) Garcia, Dr. Rey (Texas Assocation of Community Colleges) Silas, Ms. Beverly (Self and Austin Community College) Tristan, Mr. Daniel (Self)


Encryption Service
Important
DO NOT use this or any other encryption library for password storage! Passwords must be hashed instead, and you should do that through PHP’s Password Hashing extension.
The Encryption Service provides two-way symmetric (secret key) data encryption. The service will instantiate and/or initialize an encryption handler to suit your parameters as explained below.
Encryption Service handlers must implement CodeIgniter’s simple EncrypterInterface
.
Using an appropriate PHP cryptographic extension or third-party library may require
additional software to be installed on your server and/or might need to be explicitly
enabled in your instance of PHP.
The following PHP extensions are currently supported:
This is not a full cryptographic solution. If you need more capabilities, for example, public-key encryption, we suggest you consider direct use of OpenSSL or one of the other Cryptography Extensions. A more comprehensive package like Halite (an O-O package built on libsodium) is another possibility.
Note
Support for the MCrypt
extension has been dropped, as that has
been deprecated as of PHP 7.2.
Using the Encryption Library
Like all services in CodeIgniter, it can be loaded via Config\Services
:
<?php
$encrypter = \Config\Services::encrypter();
Assuming you have set your starting key (see Configuring the Library),
encrypting and decrypting data is simple - pass the appropriate string to encrypt()
and/or decrypt()
methods:
<?php
$plainText = 'This is a plain-text message!';
$ciphertext = $encrypter->encrypt($plainText);
// Outputs: This is a plain-text message!
echo $encrypter->decrypt($ciphertext);
And that’s it! The Encryption library will do everything necessary for the whole process to be cryptographically secure out-of-the-box. You don’t need to worry about it.
Configuring the Library
The example above uses the configuration settings found in app/Config/Encryption.php.
Option |
Possible values (default in parentheses) |
|---|---|
key |
Encryption key starter |
driver |
Preferred handler, e.g., OpenSSL or Sodium ( |
digest |
Message digest algorithm ( |
blockSize |
[SodiumHandler only] Padding length in bytes ( |
cipher |
[OpenSSLHandler only] Cipher to use ( |
encryptKeyInfo |
[OpenSSLHandler only] Encryption key info ( |
authKeyInfo |
[OpenSSLHandler only] Authentication key info ( |
rawData |
[OpenSSLHandler only] Whether the cipher-text should be raw ( |
You can replace the config file’s settings by passing a configuration
object of your own to the Services
call. The $config
variable must be
an instance of the Config\Encryption
class.
<?php
$config = new \Config\Encryption();
$config->key = 'aBigsecret_ofAtleast32Characters';
$config->driver = 'OpenSSL';
$encrypter = \Config\Services::encrypter($config);
Configuration to Maintain Compatibility with CI3
New in version 4.3.0.
Since v4.3.0, you can decrypt data encrypted with CI3’s Encryption. If you need to decrypt such data, use the following settings to maintain compatibility.
<?php
use Config\Encryption;
use Config\Services;
$config = new Encryption();
$config->driver = 'OpenSSL';
// Your CI3's 'encryption_key'
$config->key = hex2bin('64c70b0b8d45b80b9eba60b8b3c8a34d0193223d20fea46f8644b848bf7ce67f');
// Your CI3's 'cipher' and 'mode'
$config->cipher = 'AES-128-CBC';
$config->rawData = false;
$config->encryptKeyInfo = 'encryption';
$config->authKeyInfo = 'authentication';
$encrypter = Services::encrypter($config, false);
Supported HMAC Authentication Algorithms
For HMAC message authentication, the Encryption library supports usage of the SHA-2 family of algorithms:
Algorithm |
Raw length (bytes) |
Hex-encoded length (bytes) |
|---|---|---|
SHA512 |
64 |
128 |
SHA384 |
48 |
96 |
SHA256 |
32 |
64 |
SHA224 |
28 |
56 |
The reason for not including other popular algorithms, such as MD5 or SHA1 is that they are no longer considered secure enough and as such, we don’t want to encourage their usage. If you absolutely need to use them, it is easy to do so via PHP’s native hash_hmac() function.
Stronger algorithms of course will be added in the future as they appear and become widely available.
Default Behavior
By default, the Encryption Library uses the OpenSSL handler. That handler encrypts using the AES-256-CTR algorithm, your configured key, and SHA512 HMAC authentication.
Setting Your Encryption Key
Your encryption key must be as long as the encryption algorithm in use allows. For AES-256, that’s 256 bits or 32 bytes (characters) long.
The key should be as random as possible, and it must not be a regular text string,
nor the output of a hashing function, etc. To create a proper key,
you can use the Encryption library’s createKey()
method.
<?php
// $key will be assigned a 32-byte (256-bit) random key
$key = \CodeIgniter\Encryption\Encryption::createKey();
// for the SodiumHandler, you can use either:
$key = sodium_crypto_secretbox_keygen();
$key = \CodeIgniter\Encryption\Encryption::createKey(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
The key can be stored in app/Config/Encryption.php, or you can design a storage mechanism of your own and pass the key dynamically when encrypting/decrypting.
To save your key to your app/Config/Encryption.php, open the file and set:
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Encryption extends BaseConfig
{
public $key = 'YOUR KEY';
// ...
}
Encoding Keys or Results
You’ll notice that the createKey()
method outputs binary data, which
is hard to deal with (i.e., a copy-paste may damage it), so you may use
bin2hex()
, or base64_encode
to work with the key in
a more friendly manner. For example:
<?php
// Get a hex-encoded representation of the key:
$encoded = bin2hex(\CodeIgniter\Encryption\Encryption::createKey(32));
// Put the same value with hex2bin(),
// so that it is still passed as binary to the library:
$key = hex2bin('your-hex-encoded-key');
You might find the same technique useful for the results of encryption:
<?php
// Encrypt some text & make the results text
$encoded = base64_encode($encrypter->encrypt($plaintext));
Using Prefixes in Storing Keys
You may take advantage of two special prefixes in storing your
encryption keys: hex2bin:
and base64:
. When these prefixes
immediately precede the value of your key, Encryption
will
intelligently parse the key and still pass a binary string to
the library.
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Encryption extends BaseConfig
{
// In Encryption, you may use
public $key = 'hex2bin:<your-hex-encoded-key>';
// or
public $key = 'base64:<your-base64-encoded-key>';
// ...
}
Similarly, you can use these prefixes in your .env file, too!
// For hex2bin
encryption.key = hex2bin:<your-hex-encoded-key>
// or
encryption.key = base64:<your-base64-encoded-key>
Padding
Sometimes, the length of a message may provide a lot of information about its nature. If a message is one of “yes”, “no” and “maybe”, encrypting the message doesn’t help: knowing the length is enough to know what the message is.
Padding is a technique to mitigate this, by making the length a multiple of a given block size.
Padding is implemented in SodiumHandler
using libsodium’s native sodium_pad
and sodium_unpad
functions. This requires the use of a padding length (in bytes) that is added to the plaintext
message prior to encryption, and removed after decryption. Padding is configurable via the
$blockSize
property of Config\Encryption
. This value should be greater than zero.
Important
You are advised not to devise your own padding implementation. You must always use the more secure implementation of a library. Also, passwords should not be padded. Usage of padding in order to hide the length of a password is not recommended. A client willing to send a password to a server should hash it instead (even with a single iteration of the hash function). This ensures that the length of the transmitted data is constant, and that the server doesn’t effortlessly get a copy of the password.
Encryption Handler Notes
OpenSSL Notes
The OpenSSL extension has been a standard part of PHP for a long time.
CodeIgniter’s OpenSSL handler uses the AES-256-CTR cipher.
The key your configuration provides is used to derive two other keys, one for encryption and one for authentication. This is achieved by way of a technique known as an HMAC-based Key Derivation Function (HKDF).
Sodium Notes
The Sodium extension is bundled by default in PHP as of PHP 7.2.0.
Sodium uses the algorithms XSalsa20 to encrypt, Poly1305 for MAC, and XS25519 for key exchange in sending secret messages in an end-to-end scenario. To encrypt and/or authenticate a string using a shared-key, such as symmetric encryption, Sodium uses the XSalsa20 algorithm to encrypt and HMAC-SHA512 for the authentication.
Note
CodeIgniter’s SodiumHandler
uses sodium_memzero
in every encryption or decryption
session. After each session, the message (whether plaintext or ciphertext) and starter key are
wiped out from the buffers. You may need to provide again the key before starting a new session.
Message Length
An encrypted string is usually longer than the original, plain-text string (depending on the cipher).
This is influenced by the cipher algorithm itself, the initialization vector (IV) prepended to the cipher-text, and the HMAC authentication message that is also prepended. Furthermore, the encrypted message is also Base64-encoded so that it is safe for storage and transmission regardless of the character-set in use.
 Cookies, for example, can only hold 4K of information.
Using the Encryption Service Directly
Instead of (or in addition to) using Services
as described in Using the Encryption Library,
you can create an “Encrypter” directly, or change the settings of an existing instance.
<?php
// create an Encryption instance
$encryption = new \CodeIgniter\Encryption\Encryption();
// reconfigure an instance with different settings
$encrypter = $encryption->initialize($config);
Remember, that $config
must be an instance of Config\Encryption
class.
Class Reference
- class CodeIgniter\Encryption\Encryption
- static createKey([$length = 32])
- Parameters
$length (
int
) – Output length
- Returns
A pseudo-random cryptographic key with the specified length, or
false
on failure- Return type
string
Creates a cryptographic key by fetching random data from the operating system’s sources (i.e.
/dev/urandom
).
- initialize([Encryption $config = null])
- Parameters
$config (
Config\Encryption
) – Configuration parameters
- Returns
CodeIgniter\Encryption\EncrypterInterface
instance- Return type
CodeIgniter\Encryption\EncrypterInterface
- Throws
CodeIgniter\Encryption\Exceptions\EncryptionException
Initializes (configures) the library to use different settings.
Example:
<?php $encrypter = $encryption->initialize(['cipher' => 'AES-256-CTR']);
Please refer to the Configuring the Library section for detailed info.
- CodeIgniter\Encryption\EncrypterInterface
- encrypt($data[, $params = null])
- Parameters
$data (
string
) – Data to encrypt$params (
array|string|null
) – Configuration parameters (key)
- Returns
Encrypted data
- Return type
string
- Throws
CodeIgniter\Encryption\Exceptions\EncryptionException
Encrypts the input data and returns its ciphertext.
If you pass parameters as the second argument, the
key
element will be used as the starting key for this operation if$params
is an array; or the starting key may be passed as a string.If you are using the SodiumHandler and want to pass a different
blockSize
on runtime, pass theblockSize
key in the$params
array.Examples:
<?php $ciphertext = $encrypter->encrypt('My secret message'); $ciphertext = $encrypter->encrypt('My secret message', ['key' => 'New secret key']); $ciphertext = $encrypter->encrypt('My secret message', ['key' => 'New secret key', 'blockSize' => 32]); $ciphertext = $encrypter->encrypt('My secret message', 'New secret key'); $ciphertext = $encrypter->encrypt('My secret message', ['blockSize' => 32]);
- decrypt($data[, $params = null])
- Parameters
$data (
string
) – Data to decrypt$params (
array|string|null
) – Configuration parameters (key)
- Returns
Decrypted data
- Return type
string
- Throws
CodeIgniter\Encryption\Exceptions\EncryptionException
Decrypts the input data and returns it in plain-text.
If you pass parameters as the second argument, the
key
element will be used as the starting key for this operation if$params
is an array; or the starting key may be passed as a string.If you are using the SodiumHandler and want to pass a different
blockSize
on runtime, pass theblockSize
key in the$params
array.Examples:
<?php echo $encrypter->decrypt($ciphertext); echo $encrypter->decrypt($ciphertext, ['key' => 'New secret key']); echo $encrypter->decrypt($ciphertext, ['key' => 'New secret key', 'blockSize' => 32]); echo $encrypter->decrypt($ciphertext, 'New secret key'); echo $encrypter->decrypt($ciphertext, ['blockSize' => 32]);


- Gasoline
- Gassoil
- Jet Fuel
- Cracked Fuel Oil
- Kerosene
- Premix
- Team Oil Refinery
- Bulk Oil Storage Terminals
- Cirrus Oil Terminal
- Pertroleum Warehousing Storage Limited
- Tank Farm
All products are per the Ghana standards. We work to ensure that our suppliers meet these specifications.
Storage Facility
Industry Links
We are in the process of constructing our own storage terminal.


Notebooks
Story: The girl, of the Early Race of people, who married a Baboon
The girl, of the Early Race of people, who married a Baboon
Title
The girl, of the Early Race of people, who married a Baboon
Collection
Summary
A girl is becoming a new maiden and goes to lie down (in her hut). She says the Baboon's name. The Baboon sings to her so that her face will change shape and resemble his own. The girl runs away to the Baboon, who waits on the hill. She marries him.
Comments
1) |han≠kass'o heard this from his mother (|xabbi-an), 2) p.7609v & p.7618v: (told to |han≠kass'o by |xaken-an, given 31 March 1884): the girl had no buttocks (?) because her period was not there (she has not yet become a 'new maiden'); the girl had no breasts because her chest had changed to resemble a Baboon's, 3) p.7615v: |xam terms of respect (for in-laws), 4) This story is found in Book VIII-18
Contributors
|han≠kass'o (Klein Jantje) (VIII)
Date
9 October 1878 (started)
Categories
History (Early Race), New maidens
Keywords
Baboon (his mother-in-law) , Baboon (is a 'bad man') , Baboon (sneezes when the girl says his name) , Baboon (the name of) , Baboon (the girl says his name) , Baboon (was a person of the Early Race) , Baboon (the foolish girl marries) , Baboon (sings a song that transforms the girl into a Baboon) , Baboon (his song to the new maiden) , girl (when she is little and not yet a new maiden) , girl (of the Early Race of people who is foolish and marries a Baboon) , girl (what happens when she says the Baboon's name) , girl (her face changes to resemble a Baboon's) , girl (becomes a Baboon) , girl (what happens when she becomes a new maiden) , girl (the Baboon sings to) , hut (the girl lies down in to become a new maiden) , hut (of the girl, of the Early Race of people, who married a Baboon) , painting (with ||hara and tto) , drawing (with ||hara and tto) , marriage (the girl of the Early Race to a Baboon) , Early Race (or First Bushmen) , Early Race (and the foolish girl who married a Baboon) , transformation (of the girl into a Baboon) , transformation (and the saying of the Baboon's name) , transformation (and the Baboon's song) , transformation (of the girl, of the Early Race of people, who married a Baboon) , sneezing (of the Baboon when the girl says his name) , sneezing (the girl, of the Early Race of people, who married a Baboon) , new maiden (and menstruation) , new maiden (her breasts) , new maiden (her hut) , new maiden (the girl lies down to become) , new maiden (the girl, of the Early Race of people, who married a Baboon) , song (of the Baboon to the girl) , song (that changes the girl into a Baboon) , song (the girl, of the Early Race of people, who married a Baboon) , ||hara (and tto) , ||hara (painting and drawing with) , tto (and ||hara) , tto (painting and drawing with) , name (the girl who says the Baboon's) , name (the girl, of the Early Race of people, who married a Baboon)
Story Pages
7608-7625


How can we better manage the symptoms of SAMPLE together?
People with SAMPLE have different symptoms. These symptoms can change day-to-day and over time. The purpose of this study is to help us understand the different symptoms of SAMPLE. The results of this study may help researchers develop new ways to manage SAMPLE symptoms.
This study uses an app to monitor SAMPLE symptoms. Sage Bionetworks (nonprofit) has developed this app to make it easier for people to participate in this research.
If you participate in this study, you will be asked to complete surveys and activities. The activities use your phone’s built-in sensors to collect information about your health and the symptoms of SAMPLE -- like balance and dexterity.
If you are over 18 years old, you can join the study. We are looking for volunteers with SAMPLE and volunteers who do not have SAMPLE ("controls") to join this research study. Both groups are important to the study.


Converts HDF5 data to use desired data type, scaling and encoding (ODIM gain, offset, undetect and nodata values).
More...
#include <DataConversionOp.h>
|
|
| DataConversionOp (const std::string &type="C", double gain=1.0, double offset=0.0, double undetect=0.0, double nodata=255.0, std::string copyGroupSuffix="") |
| |
| virtual void | processH5 (const Hi5Tree &src, Hi5Tree &dst) const |
| | Ensures data to be in standard type and scaling. Makes a converted copy if needed. More...
|
| |
| virtual void | processDataSet (const DataSet< src_t > &srcSweep, DataSet< dst_t > &dstProduct) const |
| |
|
void | processImage (const PlainData< src_t > &src, drain::image::Image &dst) const |
| |
| void | processImage (const ODIM &odimSrc, const drain::image::ImageFrame &src, const ODIM &odimDst, drain::image::Image &dst) const |
| | Converts src to dst such that dst applies desired gain, offset, undetect and nodata values. More...
|
| |
| void | traverseImageFrame (const ODIM &odimSrc, const drain::image::ImageFrame &src, const ODIM &odimDst, drain::image::ImageFrame &dst) const |
| |
|
void | setGeometry (const M &srcODIM, PlainData< dst_t > &dstData) const |
| |
|
|
std::string | copyGroupSuffix |
| | Suffix for trailing path element ("/data") for storing the original.
|
| |
template<class M>
class rack::DataConversionOp< M >
Converts HDF5 data to use desired data type, scaling and encoding (ODIM gain, offset, undetect and nodata values).
- Template Parameters
-
- See also
- Conversion
◆ processDataSet()
◆ processH5()
| void processH5 |
( |
const Hi5Tree & |
src, |
|
|
Hi5Tree & |
dst |
|
) |
| const |
|
virtual |
Ensures data to be in standard type and scaling. Makes a converted copy if needed.
Converts src to dst such that dst applies desired gain, offset, undetect and nodata values.
The operator does not need groups sorted by elevation.
◆ processImage()
Converts src to dst such that dst applies desired gain, offset, undetect and nodata values.
Sometimes this is applied directly (for alpha channel ops).
◆ traverseImageFrame()
Checks 'undetect' first because 'undetect' and 'nodata' may be the same code
The documentation for this class was generated from the following file:


Bitcoin (BTC) Signal Suggests Tumble to $4K Imminent, Warns Crypto Trader – Plus Ripple, XRP, Litecoin and Cardano Updates
by Daily Hodl StaffFrom a flashing Bitcoin indicator to the push for new upgrades to Litecoin and Cardano, here’s a look at some of the stories breaking in the world of crypto.
Bitcoin
A crypto analyst is sounding the alarm about a potentially bearish sign for the future price of Bitcoin.
Cole Garner tells his 11,000 followers on Twitter that BTC’s hash ribbons, which represent the simple moving average lines of BTC’s difficulty and hash rate, have just hit a bearish crossover.
According to Garner, the last time this happened was in mid-November of last year, just before BTC tumbled from $6,355 on Nov 13th to $3,220 on Dec 15th.
“Miner capitulation warning! Hash ribbons have confirmed a crossover.
Last time this happened was a year ago, just before BTC broke down from $6k.
I have to step out, will explain in more detail tomorrow, but TL;DR this is a BEARISH signal. Move slow…but manage risk.”
Fellow analyst PlanB agrees that in the short term, miners may determine they’re not making a profit and temporarily turn off their rigs.
However, he thinks that may change after November 21st, when Bitcoin’s difficulty adjustment kicks in, making it easier to mine BTC.
“Yes there can theoretically be more capitulation, but in practice, we see hash rate is up and next difficulty estimated from this hash rate of last 650 blocks indicates a +4% difficulty adjustment, so no more capitulation.”
Ripple and XRP
Ripple is expanding on its efforts to boost the development and adoption of XRP.
Ethan Beard, who runs Ripple’s fundraising and development arm, Xpring, says the company has released a new SDK designed to make it easier for engineers to build on the XRP Ledger.
“We recently released a new SDK, the Xpring SDK. Previously, a developer would have to write 100 lines of Javascript, for example, in order to actually just do a simple transaction on the XRP Ledger.
Now, using this SDK, an iOS developer who writes in Swift can actually just use 10 lines of code to do the exact same thing. We’re going to make it available in a variety of different languages to support the entire world of developers.”
Litecoin
Litecoin creator Charlie Lee says he’s talked to a number of “major” crypto exchanges to assess whether they would delist LTC after the platform integrates confidential transactions.
According to Lee, the exchanges he has spoken to say LTC is not at risk, although he acknowledges anything is possible.
Cardano
Charles Hoskinson, the creator of public blockchain Cardano, says efforts to launch the platform’s proof-of-stake network just took a big step forward.
Unlike legacy financial systems built on centralized institutions and composed of SWIFT and ACH transactions, Cardano is building an open financial system that allows people to send the cryptocurrency Ada which is the platform’s digital cash.


LOGO
Gallery Basic
Basic gallery page example. Ideal for portfolios!
Basic Thumbnail Gallery
Album Gallery
Image Caption
Image Caption
Image Caption
Reveal Gallery
Capsule Tower
County Building
Brutalist
Categories
Architecture
Brutalism
Concrete
Services
Contact
Tags
Brutalist
Architecture
Framework


New #SharePoint Framework (#SPFx) tutorial article - Hosting client-side web part from Office 365 CDN https://t.co/wVHQf10Kac pic.twitter.com/wIkKPRYu87— Vesa Juvonen (@vesajuvonen) 27 april 2017
New #SharePoint Framework (#SPFx) tutorial article - Hosting client-side web part from Office 365 CDN https://t.co/wVHQf10Kac pic.twitter.com/wIkKPRYu87