/is04

AMWA IS-04 NMOS Discovery and Registration

Primary LanguageTypeScript

@/is04

npm CircleCI

📜 NMOS IS-04
AMWA IS-04 NMOS Discovery and Registration Specification (Stable)

📺 Part of the Astronaut Labs Broadcast Suite
@/is04 | @/is05 | @/is07 | @/rfc8331 | @/rtp | @/scte104 | @/scte35 | @/st2010 | @/st291

Alpha Quality
This library is still in development and is subject to change


Implementation of AMWA's NMOS IS-04 standard for Discovery and Registration. Currently covers the Node API and related functionality of the standard (ability to implement a Node, ability to register and query such a Node).

Passes the IS-04 suites of the NMOS Test tool.

Usage

npm install @astronautlabs/is04

Then add IS04Module to your app, mount NodeApi, inject RegistryService and get started:

import { WebService } from "@alterior/web-server";
import { IS04Module, NodeApi, RegistryService } from "@astronautlabs/is04";

@WebService({
    imports: [ IS04Module ],
    server: {
        // ...

        // You should make sure to implement CORS in some way
        // as it is required by the specification
        middleware: [ CORS ], // see below
        
        // You should ensure that 404s conform to the NMOS 
        // API style:
        defaultHandler: ev => {
            ev.response.status(404).json(<Error>{
                code: 404,
                debug: 'not-found',
                error: 'The resource was not found'
            });
        }
    }
})
class MyService {
    constructor(
        private registry : RegistryService
    ) {
    }

    @Mount() nodeService : NodeApi;

    async altOnInit() {
        await this.registry.init();

        this.registry.node.label = 'My Node';
        this.registry.node.description = 'This is my NMOS node';
        // ...and otherwise customize this.registry.node

        // Add your initial resources
        await this.nodeService.addDevice({ /* ... */ });
        await this.nodeService.addSource({ /* ... */ });
        await this.nodeService.addSender({ /* ... */ });
        await this.nodeService.addReceiver({ /* ... */ });

        // Once all your initial resources are added, call .register()
        // to find the registration service and register them
        await this.nodeService.register();

        // After registering, you can continue adding resources
        // and they will be automatically registered with the 
        // registry

        await this.nodeService.addReceiver({ /* ... */ });
    }
}

Add CORS

To be spec-compliant, you must implement CORS for this API. You should attach a middleware that handles CORS to your requirements. The following example opens CORS broadly, though this may not be suitable for a production deployment.

function CORS(req : express.Request, res : express.Response, next : Function) {
    res
        .header('Access-Control-Allow-Origin', req.header('origin') || '*')
        .header('Access-Control-Allow-Methods', 'GET, PUT, POST, PATCH, HEAD, OPTIONS, DELETE')
        .header('Access-Control-Allow-Headers', 'Content-Type, Accept')
        .header('Access-Control-Max-Age', '3600')
    ;
    next();
}

@WebService({
    server: [
        middleware: [ CORS ]
    ]
})
class MyService {
    nodeService : NodeService;
}